我开始从 Udacity 视频类(class)(类(class)已有 2 年历史)学习 CUDA GPU 编程。我在 Nvidia GeForce GT 630M GPU 上使用 CUDA 5.5 和 Visual Studio Express 2012(学生版,因此并非所有 CUDA 调试功能都不可用)。
只是实现了一些 vector 加法和其他简单的操作。
现在我正在尝试将 RGB 图像转换为灰度图像。我正在 OpenCV 的帮助下阅读图像。 (无论如何,我尝试过任何方法都失败了。这就是我在这里的原因)
下面是我的.cpp 文件:https://gist.github.com/abidrahmank/7020863
下面是我的 .cu 文件:https://gist.github.com/abidrahmank/7020910
我的输入图像是一个简单的 64x64 彩色图像(实际上我首先使用 512x512 图像,没有用,所以降低到 64x64 以检查是否是问题所在。似乎不是)
问题
我的 CUDA 实现输出图像是白色图像。全部值255。有些地方,有一些灰色像素,可能小于1%。剩下的一切都是白色的。
我尝试了什么:
三天来,我尝试了以下事情:
- 我认为问题可能是由于图像大小,因此线程数可能不是最佳的或类似的,所以减小了图像大小。结果还是一样。
- 我尝试了一个类似的例子,创建了一个 64x64 数组。一次取它的两个像素,求它们总和的平方,效果很好。这是代码:https://gist.github.com/abidrahmank/7021023
- 开始在每个阶段逐一检查数据。在加载到 GPU 之前输入图像是可以的。 但是输入数据,当我检查内核内部时,总是 255。(检查 line 14 here)
- 最后,我使用
CudaMemset
将所有 GPU 数据设置为零,并检查了内核中的输入数据,它仍然是 255。
所以我没有任何其他选择可以在 StackOverflow 上进行其他询问。
谁能告诉我我犯了什么错误?
最佳答案
你的内核签名说:
__global__ void kernel(unsigned char* d_in, unsigned char* d_out)
但是你这样调用它:
kernel<<<rows,cols>>>(d_out, d_in);
哪个是在,哪个是在?
我过去做过很多 CUDA 编程,强烈建议您使用 Thrust而不是手工制作内核。甚至 thrust::for_each
也很难被原始内核打败。
关于c++ - CUDA - 将 RGB 图像转换为灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19421529/