You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

CUDA编程疑问:如何将thrust::device_vector传入核函数?

解决Thrust device_vector传入CUDA核函数的问题

嘿,我来帮你搞定这个Thrust向量传核函数的问题!

首先得明确一个关键点:你不能直接把thrust::device_vector对象作为参数传给CUDA核函数。原因很简单——device_vector是运行在主机端的C容器对象,它内部封装了设备内存的管理逻辑,但核函数是在GPU设备上执行的,无法直接识别主机端的C对象结构。

正确的做法:获取device_vector的底层设备指针

Thrust的device_vector提供了data()方法,这个方法会返回指向其底层设备内存的原始指针,而这个指针是可以直接传给核函数使用的。下面结合你的代码给出修改方案:

1. 修改核函数参数为原始指针

把核函数的参数从thrust::device_vector<int>改成int*,同时建议传入向量的大小,避免越界访问:

__global__ void computeCurrent(int* d_ftime, int vec_size) { 
    int idx = blockDim.x * blockIdx.x + threadIdx.x; 
    // 一定要检查索引是否在有效范围内,防止内存越界
    if (idx < vec_size) {
        printf("ftime = %d\n", d_ftime[idx]);
    }
}

2. 调用核函数时传入设备指针

在主机端代码中,通过data()获取device_vector的底层指针,再传入核函数:

// 你的原始device_vector数组
thrust::device_vector<int> dev_firetime[1000];
// 先给dev_firetime的元素填充数据(比如用thrust的fill或copy方法)

// 以操作dev_firetime[0]为例
int* d_ptr = dev_firetime[0].data();
int vec_size = dev_firetime[0].size();

// 配置核函数的网格和块大小(根据你的需求调整)
dim3 block_size(256);
dim3 grid_size((vec_size + block_size.x - 1) / block_size.x);

// 调用核函数
computeCurrent<<<grid_size, block_size>>>(d_ptr, vec_size);
// 同步设备,确保核函数执行完成后再查看输出
cudaDeviceSynchronize();

额外注意事项

  • 如果你使用的是thrust::host_vector,需要先把它的数据拷贝到device_vector中,再获取设备指针;或者直接用thrust::copy将主机向量的数据复制到设备内存分配的指针中。
  • 如果你需要处理dev_firetime数组中的多个device_vector,可以逐个获取它们的指针,或者把这些指针收集到一个设备端的指针数组中,再传给核函数批量处理。
  • 永远记得在核函数中检查索引边界,GPU内存越界访问会导致不可预测的错误甚至程序崩溃。

内容的提问来源于stack exchange,提问作者yuanyesjtu

火山引擎 最新活动