CUDA 中的推力::device_vector

use*_*986 1 c++ cuda visual-studio-2010

我是 CUDA 的新手,正在尝试学习用法。有人可以帮忙吗?我在主函数中有以下内容(我在 Visual Studio 中,我的源文件和头文件分别是 .cu 和 .cuh)

 thrust::device_vector<float> d_vec(100);
 kernel<<<100,1>>>(d_vec);
Run Code Online (Sandbox Code Playgroud)

然后在内核中我有

    template <typename T> __global__ kernel(thrust::device_vector<T> d_vec)
    {  int tid = threadIdx.x + blockIdx.x*blockDim.x;
       T xxx = 3.0;
       d_vec[tid] = xxx;
     }
Run Code Online (Sandbox Code Playgroud)

我的目标是用 float 调用内核一次,用 double 调用一次。还要注意,在这个简单的例子中,我有变量 xxx(在我的实际情况下是一些产生双精度或浮点数的计算)。

和我得到两个误差:1>调用__host__从函数(操作符=)__global__函数是不允许2>调用一个__host__从函数(操作符[])__global__函数是不允许

所以我猜“d_vec[tid] = ..”中的“[]”和“=”是问题所在。但我的问题是如何访问内核中的设备向量。有人可以澄清什么是正确的程序以及我做错了什么。提前致谢

kan*_*yin 5

推力::device_vector 对象/引用不能用作内核参数。您可以使用原始指针来传递设备矢量数据。

thrust::device_vector<float> d_vec(100);
float* pd_vec = thrust::raw_pointer_cast(d_vec.data());
kernel<<<100,1>>>(pd_vec);
Run Code Online (Sandbox Code Playgroud)

这是内核的原型

template <typename T> __global__ kernel(T* pd_vec)
Run Code Online (Sandbox Code Playgroud)

你Q和这个很像。如何将推力::device_vector<int> 转换为原始指针