基数排序算法的思想很简单,但如何提高并行性,使得能用GPU进行高效的排序计算呢?本文介绍适合于GPU计算版本的排序算法。
为了说明GPU版的排序算法,我们先复习一下最初版本的排序算法:
基数排序算法
A picture is worth than a thousand words.
因此我们上图说话。
基数排序是从最低位看起,把这一位数字值相同的按照扫描顺序放入同一个桶里面,值小的桶在前面。当所有数字都扫描完,再使用高一位,循环上述步骤,直至达到所有数字所有的最高位数,最后输出的就是排序后的答案。
CPU版本迭代基数排序算法
input: unsigned int inputVals[n]
output: unsigned int outputVals[n]
for(i=0; i< numBins; i+= numBits)
1. 计算inputVal中第i位值为0到numBins-1的各有多少个,其值分别放入binHistogram[numBins]中
2. 对binHistogram[numBins]进行scan计算,其值分别放入binScan[numBins]中,即
binScan[k]=binHistogram[0]+···+binHistogram[k-1]
3. 遍历inputVal数组,计算第j个量时,计算其值所属的桶bin的值
outputVals[binScan[bin]] = vals_src[j];
binScan[bin]++;
4. swap(inputVals,outputVals)
- 其中numBins是数字由多少位表示的,比如int就是32个bit位表示。
- numBits表示一次考虑多少位,比如可=1,2,…
- binHistogram[k] 记录了第k个桶中的数目
- binScan[k]记录了第k个桶中的应该起始的位置
GPU版本基数排序算法
GPU版本的排序算法与CPU在前两步都是类似的。