在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
正在做的事情,即使它稍慢但可以对更大的数据集进行排序?
答案 0 :(得分:3)
我一直在搜索,我认为以下是你问题的候选答案。
引用N. Bell和J. Hoberock,“Thrust:面向生产力的CUDA库”,GPU计算宝石翡翠版:
Thrust静态选择高度优化的 Radix Sort 算法,用于对原始类型(
char
,int
,float
和double
)进行排序标准less
和greater
比较运算符。对于所有其他类型(例如,用户定义的数据类型)和比较运算符,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。