CUDA - 将RGB图像转换为灰度

时间:2013-10-17 08:20:09

标签: c++ opencv image-processing cuda gpu

我开始从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%。剩下的一切都是白色的。

我尝试了什么:

三天,我尝试了以下事情:

  1. 我认为问题可能是由于图像尺寸所致,因此线程数可能不是最佳的或类似的东西,因此缩小了图像尺寸。结果还是一样。
  2. 我尝试了一个类似的例子,创建了一个64x64阵列。一次取两个像素,找到它们的总和的平方,它工作正常。以下是代码:https://gist.github.com/abidrahmank/7021023
  3. 在每个阶段逐个检查数据。在加载到GPU之前输入图像很好。 但是当我在内核中检查时输入数据总是255。(检查line 14 here
  4. 最后我使用CudaMemset将所有GPU数据设置为零并检查内核中的输入数据,它仍然是255。
  5. 所以我没有其他选择在StackOverflow上做其他的询问。

    谁能告诉我我犯的错误是什么?

2 个答案:

答案 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