cuda将.png转换为灰度

时间:2014-05-03 17:28:03

标签: c++ c cuda png grayscale

我在c中编写应用程序,可以将.png图像转换为灰度图像。 我使用c和cuda。我有cuda代码的问题,我不知道为什么。 (我是cuda begginer)。

我的转换功能看起来:

__global__
void setPixelToGrayscale(unsigned char *image)
{
    int i = threadIdx.x*4;
    float gray;
    float r, g, b;
    r = image[i + 0];
    g = image[i + 1];
    b = image[i + 2];
    gray = .299f*r + .587f*g + .114f*b;
    image[i + 0] = gray;
    image[i + 1] = gray;
    image[i + 2] = gray;
    image[i + 3] = 255;
}


void transformToGrayCuda(rgb_image *img)
{

    unsigned char* image = img->image;
    unsigned char* image_d;
    unsigned width = img->width;
    unsigned height = img->height;
    int N = (int)width * (int)height; 
    size_t size = N * sizeof(unsigned char);
    cudaMalloc((void **) image_d, size);
    cudaMemcpy(image_d, image,  size, cudaMemcpyHostToDevice);
    setPixelToGrayscale<<<1, N>>>(image_d);
    cudaMemcpy(image, image_d, size, cudaMemcpyDeviceToHost);
    cudaFree(image_d);

/* this works fine if cuda code is commented
int j=0;
for(j=0; j<N; j++)
{
    int i = j*4;
    float gray;
    float r, g, b;
    r = image[i + 0];
    g = image[i + 1];
    b = image[i + 2];
    gray = .299f*r + .587f*g + .114f*b;
    image[i + 0] = gray;
    image[i + 1] = gray;
    image[i + 2] = gray;
    image[i + 3] = 255;
}
*/

}

我在cuda版本中做错了,因为当cuda代码被注释并且在循环c代码中运行时,一切正常。为什么我的cuda代码无法正常工作?

编辑: 这是我的测试图片:http://i.imgur.com/HdRn7x3.png

我的结果是cuda:http://i.imgur.com/Ima4ma1.png

我的结果只有c代码:http:// [此处没有空格,我没有代表] i.imgur.com/lU4vIiK.png

当我写下我的cuda代码无法正常工作时,我的意思是什么。

2 个答案:

答案 0 :(得分:2)

代码中的问题是:

cudaMalloc((void **) image_d, size);

您应该指定指针,而不是将变量转换为指针。 正确的代码是:

cudaMalloc(&image_d, size);

答案 1 :(得分:2)

N的大小是多少?您正在一个块中运行所有N个线程。每块有512或1024个线程的限制,具体取决于GPU。如果N> 1,请更改块数。 512.块数= 1 + N / 512,每块线程数= 512.这里,你需要检查内核是否是threadid&lt; N以避免访问越界内存。

此外,内核执行是异步的。因此,在内核调用之后需要一个cudadevicesynchronize()调用。

如果您提出确切的错误/问题,那么我可以提供更多帮助。