无法调用CUDA内存的推力

时间:2014-10-28 16:49:47

标签: cuda thrust

我试图使用推力库找到数组的总和(已存在于CUDA内存中)。这里很少有回复说,可以通过使用thrust :: device_ptr包装它,但它给我带来了错误。

初始代码

cudaMemcpy((void *)(data + stride), (void *)d_output, sizeof(unsigned int) * rows * cols, cudaMemcpyDeviceToHost);
thrust::device_vector<unsigned int> vec((data + stride), (data + stride + (rows * cols)));
sum = thrust::reduce(vec.begin(), vec.end());

以上代码完美无缺。但如果我把它改成

thrust::device_ptr<unsigned int> outputPtrBegin(d_output);
thrust::device_ptr<unsigned int> outputPtrEnd((d_output + stride + (rows * cols)));
sum = thrust::reduce(outputPtrBegin, outputPtrEnd);

它引发了以下错误。

 terminate called after throwing an instance of 'thrust::system::system_error'
 what():  an illegal memory access was encountered
 Aborted (core dumped)

可能是什么问题? 非常感谢你的时间。

* Robert Crovella的编辑输入 错误在于使用步幅。 我有以下问题(与上述声明有关)

根据切换的值,我需要调用推力

if(toggle) {
    thrust::device_ptr<unsigned int> outputPtrBegin(d_output);
    thrust::device_ptr<unsigned int> outputPtrEnd((d_output + (rows * cols)));
}
else {
    thrust::device_ptr<unsigned int> outputPtrBegin(d_X);
    thrust::device_ptr<unsigned int> outputPtrEnd((d_X + (rows * cols)));
}

但编译说没有声明outputPtrBegin和outputPtrEnd,因为它们在if语句中。如何在使用之前声明这些设备指针然后使用?

1 个答案:

答案 0 :(得分:3)

这是错误的:

thrust::device_ptr<unsigned int> outputPtrEnd((d_output + stride + (rows * cols)));

应该是:

thrust::device_ptr<unsigned int> outputPtrEnd((d_output + (rows * cols)));

在您的第一个(工作)示例中,您正在将区域从设备复制到主机。在设备上,该区域从d_output开始,长度为rows*cols个元素。这是您正在通过reduce操作的数据。是的,在主机上,它恰好被复制到以data + stride开头的区域,但这是无关紧要的。在您的第一次实施中,最终您将执行减少rows*cols元素。

很明显,在第二个实现中,您正尝试从d_output开始执行reduce操作并转到d_output+stride+(rows*cols)。这与大小操作不同。

此外,你可能想要做这样的事情:

thrust::device_ptr<unsigned int> outputPtrBegin(d_output);
thrust::device_ptr<unsigned int> outputPtrEnd = outputPtrBegin + (rows * cols);
sum = thrust::reduce(outputPtrBegin, outputPtrEnd);

关于你的第二个问题(请将新问题作为新问题发布),而不是:

if(toggle) {
    thrust::device_ptr<unsigned int> outputPtrBegin(d_output);
    thrust::device_ptr<unsigned int> outputPtrEnd((d_output + (rows * cols)));
}
else {
    thrust::device_ptr<unsigned int> outputPtrBegin(d_X);
    thrust::device_ptr<unsigned int> outputPtrEnd((d_X + (rows * cols)));
}

做这样的事情:

thrust::device_ptr<unsigned int> outputPtrBegin;
thrust::device_ptr<unsigned int> outputPtrEnd;
if(toggle) outputPtrBegin=thrust::device_pointer_cast<unsigned int>(d_output);
else outputPtrBegin=thrust::device_pointer_cast<unsigned_int>(d_X);
outputPtrEnd = outputPtrBegin + (rows * cols);