C++ 推力:CUDA中的设备_矢量
我是CUDA的新手,正在努力学习它的用法。有人能帮忙吗。我在主函数中有以下内容(我在visual studio中,源文件和头文件分别为.cu和.cuh) 推力:设备向量d向量(100); 内核(d_-vec); 然后在内核中我有C++ 推力:CUDA中的设备_矢量,c++,visual-studio-2010,cuda,C++,Visual Studio 2010,Cuda,我是CUDA的新手,正在努力学习它的用法。有人能帮忙吗。我在主函数中有以下内容(我在visual studio中,源文件和头文件分别为.cu和.cuh) 推力:设备向量d向量(100); 内核(d_-vec); 然后在内核中我有 template <typename T> __global__ kernel(thrust::device_vector<T> d_vec) { int tid = threadIdx.x + blockIdx.x*bloc
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;
}
template\uuuuu全局\uuuuuuu内核(推力::设备向量d\uvec)
{int tid=threadIdx.x+blockIdx.x*blockDim.x;
T xxx=3.0;
d_vec[tid]=xxx;
}
我的目标是用float调用内核一次,用double调用一次。还要注意,在这个简单的例子中,我有一个变量xxx(在我的实际情况中,它是一些产生双精度或浮点数的计算)
我得到两个错误:
1> 不允许从\uuuu全局函数调用\uuuu主机函数(运算符=)
2> 不允许从\uuuu全局函数调用\uuuu主机函数(运算符[])
因此,我猜“d_vec[tid]=..”中的“[]”和“=”就是问题所在。但我的问题是如何访问内核中的设备向量。请有人澄清什么是正确的程序,我做错了什么。提前感谢推力::设备\矢量对象/引用不能用作内核参数。
可以使用原始指针传递设备向量数据
thrust::device_vector<float> d_vec(100);
float* pd_vec = thrust::raw_pointer_cast(d_vec.data());
kernel<<<100,1>>>(pd_vec);
推力:设备向量d向量(100);
float*pd_vec=推力::原始指针(d_vec.data());
内核(pd_-vec);
这是内核的原型
template <typename T> __global__ kernel(T* pd_vec)
template\uuuu全局内核(T*pd\uvec)
YouQ和这个很相似 我也意识到我很可能在做一些不好的事情。假设我的向量很大,比如说60000个元素。理想情况下,我希望生成60000个内核,并将每个内核计算的结果复制到向量的适当索引中。但我不想产生60000个向量,每个向量的长度为60000(希望我的代码中不会出现这种情况)
template <typename T> __global__ kernel(T* pd_vec)