我开始从Udacity视频课程学习CUDA GPU编程(课程是2岁)。我在 Nvidia GeForce GT 630M GPU 上使用 CUDA 5.5与Visual Studio Express 2012 (学生版,因此并非所有CUDA调试功能都不可用)。
刚刚实现了一些向量加法和其他简单的操作。
现在我正在尝试将RGB图像转换为灰度。我在OpenCV的帮助下阅读图像。 (无论如何,我失败了我尝试的任何方法。这就是我在这里的原因)
以下是我的.cpp文件:https://gist.github.com/abidrahmank/7020863
以下是我的.cu文件:https://gist.github.com/abidrahmank/7020910
我的输入图像是一个简单的64x64彩色图像(实际上我首先使用512x512图像,但没有工作,所以降到64x64以检查是否有问题。它似乎不是这样)
问题
我的CUDA实施输出图像为白色图像。所有值都是255.在这里和那里的某处,有一些灰色像素,可能小于1%。剩下的一切都是白色的。
我尝试了什么:
三天,我尝试了以下事情:
CudaMemset
将所有GPU数据设置为零并检查内核中的输入数据,它仍然是255。所以我没有其他选择在StackOverflow上做其他的询问。
谁能告诉我我犯的错误是什么?
答案 0 :(得分:2)
你的内核签名说:
__global__ void kernel(unsigned char* d_in, unsigned char* d_out)
但你称之为:
kernel<<<rows,cols>>>(d_out, d_in);
哪一个 ?
过去做了很多CUDA编程,我强烈建议您使用Thrust而不是手工制作内核。使用原始内核即使thrust::for_each
也很难被击败。
答案 1 :(得分:1)
除了DanielKO指出的参数问题外,您还遇到线程/块设置问题。
由于您已经将二维图像视为一维数组,因此这里有一个很好的示例,说明如何为任意大小的数据设置线程/块。
https://developer.nvidia.com/content/easy-introduction-cuda-c-and-c