启动内核时CUDA“无效参数”错误

时间:2015-12-17 17:17:33

标签: cuda

内核启动时遇到问题。我启动了一个网格大小为(3000000,16)的内核,CUDA报告了一个“无效参数”运行时错误。我尝试了不同的maxPixelCount值并找到:当maxPixelCount为200000时,会报告错误,而当它为50000时,会继续且没有错误。

dim3 dimGrid(maxPixelCount, imageCount);
printf("grid: %d * %d * %d", dimGrid.x, dimGrid.y, dimGrid.z);
mcudaGetGrayDataKernel <<< dimGrid, 1 >>> (deviceDestDataPtrs, deviceImageDataPtrs, deviceSizes);

cudaStatus = cudaGetLastError();
if (cudaStatus != cudaSuccess) {
    printf("cuda start kernel error\n%s", cudaGetErrorString(cudaStatus);
    goto Error;
}

我检查了最大网格大小以确保我的卡的能力,使用以下句子:

printf("    - max grid size: %d * %d * %d\n", 
    prop.maxGridSize[0], 
    prop.maxGridSize[1], 
    prop.maxGridSize[2]);

我收到以下消息:

- max grid size: 2147483647 * 65535 * 65535

我认为这意味着我的昏暗在适当的范围内。但为什么会出现错误?

我的IDE是Visual Studio 2013

这个问题已经解决了。要达到网格大小的最大限制,必须将Device - &gt; Code Generation选项设置为正确的版本。对于我的GPU,我将其修改为compute_30,sm_30

1 个答案:

答案 0 :(得分:1)

这个表述:

dim3 dimGrid(maxPixelCount, imageCount);

maxPixelCount放在变量(dimGrid)的.x维度中,该维度将用于指定内核启动的网格维度:

mcudaGetGrayDataKernel <<< dimGrid, 1 >>> ...

通过引用the programming guide(或者您可以使用deviceQuery示例代码,或者以编程方式自行查询数据),我们可以看到计算能力2.0的设备仅支持最高65535的限制网格的.x维度。为了在计算能力3.0(或更高)设备中实现更大的维度(2 ^ 31 - 1),有必要:

  1. 编译计算能力3.0+设备<and>
  2. 在计算能力3.0+设备上运行代码。
  3. 有多种方法可以指定如何编译计算能力3.0设备。大多数CUDA示例代码项目都为Windows和Linux(Makefile)项目演示了这一点。有关如何编译给定设备体系结构以及各种开关的含义的更多信息,请参阅this answerthis answer以及the nvcc manual的相关部分。