首页 文章

CUDA - 将RGB图像转换为灰度

提问于
浏览
1

我开始从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 回答

  • 2

    你的内核签名说:

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

    但你称之为:

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

    哪一个是 in ,哪一个是 out

    在过去完成了相当多的CUDA编程之后,我强烈建议您使用Thrust而不是手工制作内核 . 甚至 thrust::for_each 也很难被原始内核击败 .

  • 1

    除了DanielKO指出的参数问题,你还有线程/块设置问题 .

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

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

相关问题