You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用原始设备指针调用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设备内存指针,主机代码直接访问设备内存会触发内存访问违规。
  • 两种解决方式:
    1. 显式指定设备执行策略:在排序函数中传入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);
      
    2. 包装原始指针为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:20:22