Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 部分排序算法,为什么会有这样的性能差异?_C#_Sorting_Cudafy.net - Fatal编程技术网

C# 部分排序算法,为什么会有这样的性能差异?

C# 部分排序算法,为什么会有这样的性能差异?,c#,sorting,cudafy.net,C#,Sorting,Cudafy.net,我有一个随机生成的数字列表,其中包含1900个数字,我想获得前190个数字的排序列表。我已经编写了两个版本的部分排序算法,第一个是CPU版本,第二个是为了在Cudafy.net上运行而编写的。但是它们之间的执行时间有很大的差异,当在CPU上运行时,,我想知道是否有人能解释一下为什么,+是否有可能进一步加快第二个版本的速度 注意:第二个算法将在GPU上运行,因此我不能使用linq或任何不能在C上运行的算法,因为我将使用cudafy.net来运行代码。不幸的是,cudafy.net也不支持锯齿阵列

我有一个随机生成的数字列表,其中包含1900个数字,我想获得前190个数字的排序列表。我已经编写了两个版本的部分排序算法,第一个是CPU版本,第二个是为了在Cudafy.net上运行而编写的。但是它们之间的执行时间有很大的差异,当在CPU上运行时,,我想知道是否有人能解释一下为什么,+是否有可能进一步加快第二个版本的速度

注意:第二个算法将在GPU上运行,因此我不能使用linq或任何不能在C上运行的算法,因为我将使用cudafy.net来运行代码。不幸的是,cudafy.net也不支持锯齿阵列

第1版:

//
///按顺序运行数组中的所有值,并确定
///当前数字小于排序列表中的最高数字。
/// 
///未排序的数字数组。
///用于保存已排序数字的部分列表的数组。
公共静态无效新闻分拣机(int[]编号,int[]分拣编号)
{
for(int i=0;i编号[i])
{
//更新号码
识别位置(分类编号,编号[i]);
}
}
}
/// 
///标识编号应放置在已排序编号的部分列表中的位置。
/// 
///用于保存已排序数字的部分列表的数组。
///要插入的数字。
静态void identificationposition(int[]sortedNumber,int NewNumber)
{
对于(int i=0;i位置;i--)
{
分拣编号[i]=分拣编号[i-1];
}
分拣编号[位置]=新编号;
}
上述版本在约0.65毫秒内执行

第2版:

//
///按顺序运行数组中的所有值,并确定
///当前数字小于排序列表中的最高数字。
/// 
///未排序的数字。
///数组的长度。
///数组,其中将包含已排序数字的部分列表。
[库达菲]
公共静态void CudaSorter(GThread线程,长[,]未排序的编号,int[]回溯计数,长[,]已排序的编号)
{
int threadIndex=thread.threadIdx.x;
int blockIndex=thread.blockIdx.x;
int threadsPerBlock=thread.blockDim.x;
int-gpuThread=(threadIndex+(blockIndex*threadsPerBlock));
如果(gpuThread<32)
{
int maxIndex=(lookbackCount[gpuThread]*10)/100;
int maxLookback=lookbackCount[gpuThread];
对于(int i=0;i未分类编号[gpuThread,i])
{
//更新号码
识别位置2(分类编号、未分类编号[gpuThread,i]、maxIndex、gpuThread);
}
}
}
}
/// 
///标识SortedNumber数组中应放置新编号的位置。
/// 
///已排序的数字。
///要包含在排序数组中的编号。
///SortedNumber数组的长度。
///GPU线程索引。
[Cudafy(eCudafyType.Device)]
公共静态void CUDAIDIdentityPosition(长[,]个SortedNumber,长newNumber,int maxIndex,int gpuThread)
{
对于(int i=0;i位置;i--)
{
SortedNumber[gpuThread,i]=SortedNumber[gpuThread,i-1];
}
SortedNumber[gpuThread,position]=新编号;
}
上述操作的执行时间为2.8毫秒,即大约慢4倍

我已经尝试了以下方法:

  • maxLookBack
    count声明局部变量,并在for循环中使用该变量=>无改进
  • 将数据类型从
    long[,]
    更改为
    int[,]
    =>2.6毫秒(这不可行,因为我需要使用long。)
  • int[,]
    更改为
    int[]
    =>1.3毫秒(这也不可行,因为我需要将多个数组传递给GPU以保持其占用)。我很惊讶这对时间的影响有多大
  • 编辑:由于Henk的评论,我修改了代码。我现在用
    unsortedNumbers[321900]
    在GPU上运行GPU版本,而不是在CPU排序1阵列上运行单个线程。即使我将CPU时间乘以32,它仍然比GPU的时间低很多


    在这里受辱之后,我决定读一点关于这项任务的书,以了解它是关于什么的

    因此,您需要从一个大数组中选择一个最小数的子数组,然后需要对其进行排序。很可能是打赌