如何用原始设备指针调用thrust::sort()/sort_by_key()?调用报错求助
问题描述
我想用thrust::sort()和thrust::sort_by_key()对原始uint64_t设备指针中的数组进行排序(依赖其基数排序实现),测试时通过随机元素初始化数组。参考Thrust库示例传入数组起止指针调用排序方法后,触发运行时错误:
Exception thrown: read access violation. thrust::identity
::operator()(...) returned 0x701A00000.
测试代码如下:
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);
错误原因与解决办法
- 核心问题:Thrust默认采用主机端(CPU)执行策略,但你传入的是CUDA设备内存指针,主机代码直接访问设备内存会触发内存访问违规。
- 两种解决方式:
- 显式指定设备执行策略:在排序函数中传入
thrust::device参数,明确告诉Thrust在GPU上操作设备指针:
若使用thrust::sort(thrust::device, data, data + size);thrust::sort_by_key(),同样需要指定策略:thrust::sort_by_key(thrust::device, keys, keys + size, values); - 包装原始指针为Thrust设备迭代器:将CUDA设备指针包装成
thrust::device_ptr,Thrust会自动识别设备内存并使用GPU执行:thrust::device_ptr<uint64_t> dev_data(data); thrust::sort(dev_data, dev_data + size);
- 显式指定设备执行策略:在排序函数中传入
- 补充说明:Thrust通常会根据迭代器类型自动推导执行策略,但原始CUDA指针不属于Thrust的设备迭代器体系,因此必须显式指定策略或包装指针。
内容的提问来源于stack exchange,提问作者PlatinumFrog
相关产品推荐
相关产品推荐

