内核故障:配置参数无效

时间:2014-01-13 18:53:56

标签: cuda

我对我的代码有疑问,是否可以在我当前的设备上运行它。 基本上,我想做一个3D插值。 当我启动插值内核时,我收到以下错误:内核失败:配置参数无效

我看到in this discussion如果你调用太多线程或块会发生这种情况,但我不确定我的代码是什么情况。有人可以看看它并告诉我出了什么问题吗?

以下是我调用内核的方法:

dim3 blockSize(6,6,6);

dim3 threadSize(dimX/blockSize.x,dimY/blockSize.y,dimZ/blockSize.z);

d_interpolate_kernel<<<blockSize,threadSize>>>(output,dimX,dimY,dimZ);

我的尺寸为dimX = 54或108,dimY = dimX = 42或84。 所以我有blockSize(6,6,6)和threadSize(9,7,7)或(18,14,14)。

我的卡具有以下功能:

MAX_BLOCK_DIM_X = 512
MAX_BLOCK_DIM_Y = 512
MAX_BLOCK_DIM_Z = 64

MAX_GRID_DIM_X = 65535
MAX_GRID_DIM_Y = 65535
MAX_GRID_DIM_Z = 1

我是否因为MAX_GRID_DIM_Z为1而收到错误? 如果是的话,有办法解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

一个问题是您的内核调用中的blockSizethreadSize变量已被颠倒。

你想要这样的东西:

d_interpolate_kernel<<<threadSize,blockSize>>>(output,dimX,dimY,dimZ);

第一个配置参数是块中网格的大小。

第二个配置参数是线程中的大小。

由于你反转它们,你的(18,14,14)值是不可接受的块大小(线程太多),因为每个块的最大线程数是512(对于cc1.x)或1024(否则) ,而18x14x14 = 3528。

对我来说,threadSize是一个令人困惑的名字。我会称它为gridSize或类似的东西。

正如您所指出的第二个问题是,对于cc1.x卡(看起来就是您所拥有的),您的Z网格尺寸必须为1.至少对于您的42个案例,您可以通过重新修复此问题。 - 构造线程块以具有(例如)(2,2,42)的维度,并且您的网格具有例如(27,21,1)的维度。

否则,这些索引只是任意编号方案。您可以使用(6,6,6)块大小来绘制覆盖所有3D体积的2D网格(如果这是您想要的)。您只需要了解如何在插值内核中映射blockIdx.xblockIdx.y内置变量,以模拟3D网格。