我开始从Udacity视频课程学习CUDA GPU编程(课程是2岁) . 我在 Nvidia GeForce GT 630M GPU 上使用 CUDA 5.5 with Visual Studio Express 2012 (学生版,因此并非所有CUDA调试功能都不可用) .
刚刚实现了一些向量加法和其他简单的操作 .
现在我想 convert a RGB image to Grayscale . 我在OpenCV的帮助下阅读图像 . (无论如何,我失败了我尝试的任何方法 . 这就是我在这里的原因)
下面是我的.cpp文件:https://gist.github.com/abidrahmank/7020863
下面是我的.cu文件:https://gist.github.com/abidrahmank/7020910
我的输入图像是一个简单的64x64彩色图像(实际上我首先使用了512x512图像,没有工作,所以降到64x64以检查是否是问题 . 它似乎不是这样)
Problem
My output image of CUDA implementation is a white image . 所有值都是255.在这里和那里的某处,有一些灰色像素,可能小于1% . 剩下的一切都是白色的 .
What I tried:
三天,我尝试了以下事情:
-
我认为问题可能是由于图像尺寸,因此线程数可能不是最佳或类似的东西,因此图像尺寸减小 . 还是一样的结果 .
-
我尝试了一个类似的例子,创建了一个64x64阵列 . 一次取两个像素,找到它们的总和的平方,它工作正常 . 这是代码:https://gist.github.com/abidrahmank/7021023
-
开始在每个阶段逐个检查数据 . 在加载到GPU之前输入图像很好 . But input data, when I checked inside kernel, is always 255. (检查line 14 here)
-
最后我使用
CudaMemset
将所有GPU数据设置为零并检查内核中的输入数据,它仍然是255 .
所以我没有任何其他选择在StackOverflow上做其他的询问 .
Can anyone tell me what is the mistake I am making?
2 回答
你的内核签名说:
但你称之为:
哪一个是 in ,哪一个是 out ?
在过去完成了相当多的CUDA编程之后,我强烈建议您使用Thrust而不是手工制作内核 . 甚至
thrust::for_each
也很难被原始内核击败 .除了DanielKO指出的参数问题,你还有线程/块设置问题 .
由于您已经将二维图像视为一维数组,因此这里有一个很好的示例,说明如何为任意大小的数据设置线程/块 .
https://developer.nvidia.com/content/easy-introduction-cuda-c-and-c