问题描述
使用cuda实现向量加法时,使用引用作为传参时,发现设备端输出得到的结果和CPU主机端输出结果并不一致
具体核函数代码如下所示
__global__ void Add(T * x, T * y, T * & z, int N)
{
int index = blockDim.x * (blockIdx.x + blockIdx.y * gridDim.x) + threadIdx.x;
if (index < N)
{
z[index] = x[index] + y[index];
}
}
原因分析:
通过检查发现问题出现在引用,使用引用的本质其实就是使用的是指针,此时给核函数传入的指针是指向指针的指针,而不是cudaMalloc申请的指针,进而导致最终核函数并不是对指定地址进行元素的赋值与修改。
可以得到结论:cuda中给核函数传参的指针必须是cudaMalloc申请的指针
解决方案:
删除核函数中的引用即可,正确的核函数如下
__global__ void Add(T * x, T * y, T * z, int N)
{
int index = blockDim.x * (blockIdx.x + blockIdx.y * gridDim.x) + threadIdx.x;
if (index < N)
{
z[index] = x[index] + y[index];
}
}