【问题标题】:CUDA: unable to calculate grid sizeCUDA:无法计算网格大小
【发布时间】:2013-07-18 10:11:14
【问题描述】:

我正在编写一个程序来将 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);

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

【问题讨论】:

  • 这是一种广泛使用的逻辑,用于创建更多线程并在内核内部执行绑定检查。这是计算网格大小的通用公式。 gridSizeX = (numCols + blockSize.x - 1)/blockSize.x;
  • this 的可能重复项。我认为这是 udacity 课程的标准问题..
  • @SagarMasuti;我也读了那篇文章,但我无法弄清楚我的代码有什么问题。如果您能在我的(逻辑正确的)代码中指出错误,那将会很有帮助。
  • 即使在写完这个之后:gridSizeX = (numCols + blockSize.x - 1) / blockSize.x; gridSizeY = (numRows + blockSize.y - 1) / blockSize.y; const dim3 gridSize(gridSizeX, gridSizeY, 1);它只从顶部转换一条非常薄的像素。有人可以验证内核本身是否正确吗?

标签: image-processing cuda gpu


【解决方案1】:

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

【讨论】:

  • 谢谢。也许我对存储在一维数组中的图像感到困惑。这就像计算二维数组中单元格的内存地址一样。我确信调试器和本地 CUDA 环境的可用性会有所帮助。顺便说一句,您是否了解 Windows 中的 CUDA 电子化环境,或者可以指向一些 gpuocelot for Windows 的文档?
  • @HarshilSharma 不,抱歉。
猜你喜欢
  • 2023-03-23
  • 2015-07-25
  • 1970-01-01
  • 2014-07-24
  • 2011-08-04
  • 2013-12-08
  • 1970-01-01
  • 2013-05-14
相关资源
最近更新 更多