我有一个运行两次不同网格大小的内核。
我的问题在于cuPrintf。当我在内核运行之前没有cudaPrintfInit()
并且在内核运行之后没有cudaPrintfDisplay(stdout, true)
和cudaPrintfEnd()
时,我没有错误,但当我把它们放在那里时,我得到“未指定的启动失败”错误。
在我的设备代码中,只有一个这样的循环用于打印:
if (threadIdx.x==0) {
cuPrintf("MAX:%f x:%d y:%d\n", maxVal, blockIdx.x, blockIdx.y);
}
我正在使用带有cuda功能2.0的卡的CUDA 4.0,所以我用这种语法编译我的代码:
nvcc LB2.0.cu -arch=compute_20 -code=sm_20
答案 0 :(得分:1)
如果您使用的是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()增加默认的printf FIFO大小,并传递cudaLimitPrintfFifoSize
选项。