C# 部分排序算法,为什么会有这样的性能差异?
我有一个随机生成的数字列表,其中包含1900个数字,我想获得前190个数字的排序列表。我已经编写了两个版本的部分排序算法,第一个是CPU版本,第二个是为了在Cudafy.net上运行而编写的。但是它们之间的执行时间有很大的差异,当在CPU上运行时,,我想知道是否有人能解释一下为什么,+是否有可能进一步加快第二个版本的速度 注意:第二个算法将在GPU上运行,因此我不能使用linq或任何不能在C上运行的算法,因为我将使用cudafy.net来运行代码。不幸的是,cudafy.net也不支持锯齿阵列 第1版:C# 部分排序算法,为什么会有这样的性能差异?,c#,sorting,cudafy.net,C#,Sorting,Cudafy.net,我有一个随机生成的数字列表,其中包含1900个数字,我想获得前190个数字的排序列表。我已经编写了两个版本的部分排序算法,第一个是CPU版本,第二个是为了在Cudafy.net上运行而编写的。但是它们之间的执行时间有很大的差异,当在CPU上运行时,,我想知道是否有人能解释一下为什么,+是否有可能进一步加快第二个版本的速度 注意:第二个算法将在GPU上运行,因此我不能使用linq或任何不能在C上运行的算法,因为我将使用cudafy.net来运行代码。不幸的是,cudafy.net也不支持锯齿阵列
//
///按顺序运行数组中的所有值,并确定
///当前数字小于排序列表中的最高数字。
///
///未排序的数字数组。
///用于保存已排序数字的部分列表的数组。
公共静态无效新闻分拣机(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以保持其占用)。我很惊讶这对时间的影响有多大unsortedNumbers[321900]
在GPU上运行GPU版本,而不是在CPU排序1阵列上运行单个线程。即使我将CPU时间乘以32,它仍然比GPU的时间低很多
在这里受辱之后,我决定读一点关于这项任务的书,以了解它是关于什么的 因此,您需要从一个大数组中选择一个最小数的子数组,然后需要对其进行排序。很可能是打赌