内存节省CUDA Thrust sort_by_key的替代方案?

时间:2014-06-30 15:35:11

标签: c++ cuda thrust

cuda/thrust: Trying to sort_by_key 2.8GB of data in 6GB of GPU RAM throws bad_alloc中,我已经读过sort_by_key占用了其中考虑的测试用例的大部分内存。

是否有替代方案可以完全执行sort_by_key正在做的事情,即使它稍慢但可以对更大的数据集进行排序?

1 个答案:

答案 0 :(得分:3)

我一直在搜索,我认为以下是你问题的候选答案。

引用N. Bell和J. Hoberock,“Thrust:面向生产力的CUDA库”,GPU计算宝石翡翠版:

  

Thrust静态选择高度优化的 Radix Sort 算法,用于对原始类型(charintfloatdouble)进行排序标准lessgreater比较运算符。对于所有其他类型(例如,用户定义的数据类型)和比较运算符,Thrust使用一般的合并排序算法。因为使用Radix Sort排序基元比合并排序快得多,所以这种静态优化具有重要价值。

现在,合并排序需要O(N)个内存空间,请参阅Space requirements of a merge-sort

此外,基数排序仍然需要O(N)个内存空间,请参阅Comparison of Bucket Sort and RADIX Sort

两个消耗更多内存中的哪一个未定义,取决于要排序的输入序列以及算法调整参数,请参阅对Why quicksort is more popular than radix-sort?的答案之一的评论。

与此相反,快速排序如果就地执行则需要O(logN)内存空间,否则需要O(N)。对于快速排序算法的CUDA实现,您可以查看How Tesla K20 Speeds Quicksort

对于其他就地排序算法(就地策略值得探讨,因为与非in-相比,它可以节省内存地点对应的),看看 Bitonic Sort ,请参阅Fast in-place sorting with CUDA based on bitonic sort