cudaPrintfInit 和 cudaPrintfDisplay 失败

cudaPrintfInit and cudaPrintfDisplay failed

我正在使用 GeForce 210、计算能力 1.2 和 CUDA 6.5。

我希望从我的 CUDA 内核中打印浮点值,我在我的项目目录中包含了 "cuPrintf.cu" 和 "cuPrintf.cuh",并将它们包含在我的代码中。它编译得很好并且 运行s 没有错误,但是什么都不打印。这就是我编译代码的方式:

$ nvcc -arch=compute_12 test.cu

我阅读了类似的内容 question 然后用 cudaPrintfInit() 和 cudaPrintfDisplay() 围绕我的内核。

if(cudaPrintfInit() != cudaSuccess)
    printf("cudaPrintfInit failed\n");

test_kernel<<<grid, block>>>(val);

if(cudaPrintfDisplay(stdout, true) != cudaSuccess)
    printf("cudaPrintfDisplay failed\n");
cudaPrintfEnd();

我的内核是这样的:

__global__ void test_kernel (float val){
    i = blockIdx.x*BLOCK_X + threadIdx.x;
    j = blockIdx.y*BLOCK_Y + threadIdx.y;
    if( j == 20 )
        cuPrintf("%f is value, %d is j", val, j);
}

在编译和 运行ning 时,输出是:

cudaPrintfInit failed
cudaPrintfDisplay failed

我猜可能是我编译的方式有问题,或者cuPrintf不允许打印float?根据类似 question 的附件 link,问题是每个块的线程数超过了最大值,但我的块大小是 16 x 16(所以这应该不是问题)。 cudaPrintfInit 和 cudaPrintfDisplay 显示失败!

我还有 运行 CUDA 安装附带的 CUDA 示例代码 "simplePrintf"。这非常有效。求助!

只有计算能力为 2.x 及更高的设备才支持格式化输出。

int printf(const char *format[, arg, ...]);

将格式化的输出从内核打印到主机端输出流。

参考:CUDA C 编程指南 2015,第 119 页。

看到这个link:https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialHelloWorld

我可以通过 运行 'cuda-memcheck' 解决问题。 cudaPrintf 不工作,因为 'nan' 值正在内核中生成。某些计算中的分母变为零,当我避免这些情况时,cudaPrintfInit 和 cudaPrintfDisplay 开始工作。