1

我开始从 Udacity 视频课程(课程 2 岁)学习 CUDA GPU 编程。我在Nvidia GeForce GT 630M GPU上使用CUDA 5.5 和 Visual Studio Express 2012(学生版,因此并非所有 CUDA 调试功能都不可用)。

刚刚实现了一些向量加法和其他简单的操作。

现在我正在尝试将 RGB 图像转换为 Grayscale。我在 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 上进行其他询问。

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

4

2 回答 2

2

您的内核签名说:

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

但是你这样称呼它:

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

哪个哪个

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

于 2013-10-17T08:42:55.117 回答
1

除了 DanielKO 指出的参数问题外,您还遇到了线程/块设置的问题。

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

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

于 2013-10-17T08:57:01.143 回答