CUDA - 将 RGB 图像转换为灰度

CUDA - convert RGB image to Grayscale

本文关键字:转换 灰度 图像 RGB CUDA      更新时间:2023-10-16

我开始从 Udacity 视频课程(课程已有 2 年历史)学习 CUDA GPU 编程。我在 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。(在此处查看第 14 行)
  4. 最后,我使用 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也很难用原始内核击败。

除了 DanielKO 指示的参数问题外,您在线程/块设置方面也存在问题。

由于您已经将 2-D 图像视为 1-D 数组,因此这里有一个很好的示例,展示了如何为任意大小的数据设置线程/块。

https://developer.nvidia.com/content/easy-introduction-cuda-c-and-c