0

我正在编写一个将 rgba 图像转换为灰度的程序。我在这方面做了很多工作并正确实现了内核。但是,网格大小可能是错误的,即使按照我的逻辑它是正确的。

内核:

__global__
void rgba_to_greyscale(const uchar4* const rgbaImage,
                   unsigned char* const greyImage,
                   int numRows, int numCols)
{   
    int x = (blockIdx.x * blockDim.x) + threadIdx.x;
    int y = (blockIdx.y * blockDim.y) + threadIdx.y;

    if(x >= numCols || y >= numRows)
        return;

    uchar4 rgba = rgbaImage[x+y];
    float channelSum = 0.299f*rgba.x + 0.587f*rgba.y + 0.114f*rgba.z;

    greyImage[x+y] = channelSum;
}

和内核启动:

const dim3 blockSize(10, 10, 1);  //TODO
  size_t gridSizeX, gridSizeY;
  gridSizeX = numCols + (10 - (numCols % 10) );  //adding some number to make it multiple of 10
  gridSizeY = numRows + (10 - (numRows % 10) );  //adding some number to make it multiple of 10

  const dim3 gridSize( gridSizeX, gridSizeY, 1);  //TODO
  rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);

我正在创建更多数量的线程然后需要,然后在内核中应用绑定检查。

4

1 回答 1

4

您正在使用 访问您的图像x+y。但是考虑一下,您可以通过这种方式获得的最大图像尺寸是numRows+numCols. 您不能只添加这两个坐标,因为这意味着 eg是与普通垃圾(1,2)相同的图像元素。(3,0)相反,对于每个 y 坐标,您必须跳过图像的整行,因此它应该是rgbaImage[x+y*numCols]greyImage当然,对于 y 坐标也是如此)。但请注意,根据您的图像数据的布局,它也可能是相反的 ( x*numRows+y),但我假设这里是通常的图像布局(在您的内核中无论如何都无关紧要,因为所有像素都被处理一样)。

于 2013-07-19T08:27:18.043 回答