【问题标题】:CUDA - convert RGB image to GrayscaleCUDA - 将 RGB 图像转换为灰度
【发布时间】:2013-10-25 15:16:46
【问题描述】:

我开始从 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。(检查line 14 here
  4. 最后,我使用CudaMemset 将所有 GPU 数据设置为零,并检查内核内部的输入数据,它仍然是 255。

所以我没有任何其他选择可以在 StackOverflow 上进行其他询问。

谁能告诉我我犯了什么错误?

【问题讨论】:

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


    【解决方案1】:

    你的内核签名说:

    __global__ void kernel(unsigned char* d_in, unsigned char* d_out)
    

    但你这样称呼它:

    kernel<<<rows,cols>>>(d_out, d_in);
    

    哪个进入,哪个退出

    在过去做过很多 CUDA 编程,我强烈建议您使用 Thrust 而不是手工制作内核。即使是 thrust::for_each 也很难用原始内核击败。

    【讨论】:

    • 天哪....我怎么会错过呢?更正它并且工作正常。浪费了我生命中的三天。十分感谢你的帮助。嗯,刚入手CUDA,对Thrust了解不多。无论如何我会检查它。
    • Thrust 现在随 CUDA 一起提供(尽管它支持 CUDA 以外的后端)。它提供了大多数 STL 算法的并行实现,以及一堆非常有用的算法。它让微软的 PPL 和英特尔的 TBB 相形见绌。我不可能在这些 cmets 中给 Thrust 写下足够的赞美,相信我。
    【解决方案2】:

    除了DanielKO指出的参数问题外,你在线程/块设置上也有问题。

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

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

    【讨论】:

    • +1 - 感谢您的链接。我刚开始它,仍然对线程、块等概念感到头疼。所以在这个特定的任务中,我只想让它首先工作。所有其他优化和担忧留待未来。 @DanielKO 的回答解决了我的问题,所以我不得不接受他的回答。
    • 制定正确的索引计算、内核启动配置等可能是一项混乱的任务。正如我所提到的,Thrust 可以为您完成所有工作(它具有启发式算法,可以为您的 GPU 找出最佳启动配置,并且可以通过计算迭代器为您提供索引)。
    猜你喜欢
    • 2014-02-26
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    相关资源
    最近更新 更多