Sorting CUDA:推力::按_键排序在内核中不起作用,但推力::排序在内核中起作用

Sorting CUDA:推力::按_键排序在内核中不起作用,但推力::排序在内核中起作用,sorting,cuda,thrust,Sorting,Cuda,Thrust,我正在尝试将一些现有的asch::sort\u by_key调用移动到内核线程。这些都是大量的小排序,因此许多线程运行顺序排序非常有意义 推力::排序在内核中似乎工作正常,例如:(xp是一个浮点*;beg&en是整数索引) 在主机端的原始代码中,我使用的是推力::zip_迭代器。将其移植到内核似乎不起作用,因此我尝试创建自己的索引数组: int*pIDX = new int[en-beg]; // inefficient: eventually this would be a global wo

我正在尝试将一些现有的
asch::sort\u by_key
调用移动到内核线程。这些都是大量的小排序,因此许多线程运行顺序排序非常有意义

推力::排序
在内核中似乎工作正常,例如:(xp是一个浮点*;beg&en是整数索引)

在主机端的原始代码中,我使用的是
推力::zip_迭代器
。将其移植到内核似乎不起作用,因此我尝试创建自己的索引数组:

int*pIDX = new int[en-beg]; // inefficient: eventually this would be a global workspace

for (int i=0; i<en-beg; i++)
    pIDX[i] = i;

thrust::sort_by_key( thrust::seq, xp+beg, xp+en, pIDX);
int*pIDX=newint[en beg];//低效:最终这将是一个全局工作区

对于(int i=0;i找到了解决方案。是的,这是一个堆问题,但不是在代码中的临时
new
中,而是在
sort\u by\u key
本身。扩展堆导致问题消失。出于某种原因,
sort
不需要像
sort\u by\u key
那样多的堆

一时兴起,我尝试了
zip_迭代器
,现在似乎也能用了(抽象简化了我的代码!)


在这个测试中,我使用的是
xp
中的9.7M浮点。更广泛的问题有少量的大排序和大量的小排序-对于这个数据集,最大的排序是9.7M,但它们可以一直下降到2个值。我使用了推力的并行排序,但这对于小排序来说效率太低,所以plan将切换到我自己的内核,在并行线程上运行大量小排序。因此,一旦完全实现,应该可以再次降低堆大小。

根据我的测试,您的方法工作正常。对于类似的问题,So希望您提供第1项中所示的解决方案。我还建议您提供您正在运行的平台(GPU、主机操作系统)和您正在使用的CUDA版本。如果您在大规模(多线程/大数据)上执行此操作,则完全可能会遇到设备堆的限制,请参阅仔细阅读整个部分。在内核
中,new
与在内核
malloc中具有相同的特性()
。要排除这种情况,请测试从
new
返回的指针是否为NULL,并执行适当的操作。测试这只需要一个线程。堆也因为其他原因被扩展了很多。new返回一个非NULL。CUDA 7.5,Ubuntu.GeForce RTX 2080.1168MB我的单线程测试用例。它似乎工作正常。CUDA 10.2,CentOS 7,特斯拉V100。如果您实际使用的是CUDA 7.5(不确定为什么要这样做),这可能就是问题所在。CUDA 7.5已经有5年历史了。
int*pIDX = new int[en-beg]; // inefficient: eventually this would be a global workspace

for (int i=0; i<en-beg; i++)
    pIDX[i] = i;

thrust::sort_by_key( thrust::seq, xp+beg, xp+en, pIDX);