内核启动时遇到问题。我启动了一个网格大小为(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
。
答案 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),有必要:
<and>
有多种方法可以指定如何编译计算能力3.0设备。大多数CUDA示例代码项目都为Windows和Linux(Makefile)项目演示了这一点。有关如何编译给定设备体系结构以及各种开关的含义的更多信息,请参阅this answer和this answer以及the nvcc manual的相关部分。