c++ 如何使用原始指针插入::sort()或插入::sort_by_key()

ryoqjall  于 2023-01-18  发布在  其他
关注(0)|答案(1)|浏览(150)

我想使用带有thrust::sort()和thrust::sort_by_key()的原始设备指针对数组进行排序,因为它使用基数排序。数据位于原始uint64_t设备指针中,我使用随机元素进行初始化以进行测试。我查看了thrust库,看到一些示例只是传入一个数组变量和数组变量加上要传入数组开始和结束的大小。当我调用排序方法时,它抛出一个运行时错误,指出Exception thrown: read access violation. thrust::identity<unsigned __int64>::operator()(...) returned 0x701A00000.我不确定是什么原因导致了这一情况,因为我是第一次使用thrust进行排序。
下面是一些示例代码,展示我如何调用它:

uint64_t size = 1024ull;
uint64_t* data;
cudaMalloc((void**)&data, size * sizeof(uint64_t));
curandGenerator_t gen;
curandCreateGenerator(&gen, CURAND_RNG_QUASI_SOBOL64);
curandSetPseudoRandomGeneratorSeed(gen, 132748238ull);
curandGenerateLongLong(gen, data, size);
curandDestroyGenerator(gen);
thrust::sort(data, data + size);
b5buobof

b5buobof1#

顶级域名:

调用排序函数,如下所示:
thrust::sort(thrust::device, data, data + size);

详情:

如果您将原始指针传递给推力算法(例如thrust::sort),它无法确定指针是指向主机还是设备上的内存位置。默认情况下,算法的执行被调度到主机后端(CPU)。这意味着,如果数据指针指向设备内存,它将导致崩溃,正如您所遇到的那样。
这就是execution policies的用武之地。执行策略允许我们显式地指定算法的执行将被分派到哪个后端。如果您确定了分配内存的位置,则可以显式地指定目标后端(如上面的示例中所指定的)。

替代方法:

如果您不想使用执行策略,另一种方法是将原始设备指针封装到thrust::device_ptr对象中,如下所示:

auto dptr = thrust::device_ptr<uint64_t>(data); 
thrust::sort(dptr , dptr + size);

thrust documentation中所述:
在device_ptr类型上运行的算法将自动分派给设备系统。

相关问题