在CUDA中推力:: device_vector

时间:2013-01-21 16:28:51

标签: c++ visual-studio-2010 cuda

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

 thrust::device_vector<float> d_vec(100);
 kernel<<<100,1>>>(d_vec);

然后在内核中我有

    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;
     }

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

我得到两个错误: 1 GT;不允许从__host__函数调用__global__函数(operator =) 2 - ;不允许从__host__函数调用__global__函数(operator [])

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

1 个答案:

答案 0 :(得分:3)

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

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

这里是内核的原型

template <typename T> __global__ kernel(T* pd_vec)

You Q与此类似。 how to cast thrust::device_vector<int> to raw pointer