我有一个以不同的网格大小运行两次的内核。

我的问题是cuPrintf。当我在内核运行之前没有cudaPrintfInit()以及内核运行之后没有cudaPrintfDisplay(stdout, true)cudaPrintfEnd()时,我没有错误,但是当我将它们放在那里时,会出现“未指定的启动失败”错误。

在我的设备代码中,只有一个这样的循环可以打印:

if (threadIdx.x==0) {
     cuPrintf("MAX:%f x:%d y:%d\n", maxVal, blockIdx.x, blockIdx.y);
}

我将CUDA 4.0与具有cuda功能2.0的卡一起使用,因此我使用以下语法编译代码:
nvcc LB2.0.cu -arch=compute_20 -code=sm_20

最佳答案

如果您使用的是CC 2.0 GPU,则根本不需要cuPrintf - CUDA内置了适用于CC-2.0和更高版本GPU的printf。因此,只需将您对cuPrintf的调用替换为:

#if __CUDA_ARCH__ >= 200
if (threadIdx.x==0) {
    printf("MAX:%f x:%d y:%d\n", maxVal, blockIdx.x, blockIdx.y);
}
#endif

(请注意,如果您要为sm_20和更早的版本编译代码,则只需要#if/#endif行。使用您提供的示例编译命令行,可以消除它们。)

使用printf,您不需要cudaPrintfInit()或cudaPrintfDisplay()-它是自动的。但是,如果您打印大量数据,则可能需要使用cudaDeviceSetLimit()选项(通过cudaLimitPrintfFifoSize选项)来增加默认的printf FIFO大小。

08-03 23:11