在内核之外的 CUDA 中打印设备变量的最佳方法是什么?我是否必须对主机执行 cudaMemcpy
然后打印结果值?当我尝试对使用 cudaMalloc
创建的指针使用 printf
时,程序崩溃了。似乎大部分注意力都集中在内核内部打印,而不是常规代码中。
谢谢,埃里克
最佳答案
"When I try to use printf on pointers created using cudaMalloc, the program crashes"
如果你有这个:
int *d_data, *h_data;
cudaMalloc(&d_data, DSIZE);
你不能这样做:
printf(" %d ", *d_data);
因为这需要取消引用主机代码中的设备指针 (d_data
),这在 CUDA 中通常是非法的。
你可以这样做:
h_data = (int *)malloc(DSIZE);
cudaMemcpy(h_data, d_data, DSIZE, cudaMemcpyDeviceToHost);
printf(" %d ", *h_data);
您还可以调查Unified Memory这是 CUDA 6 中的新功能,看看它是否符合您的目的。
并且,如评论中所述,cc2.0 或更高版本的设备支持来自内核的 printf
,它(仅)对设备数据进行操作。
关于c++ - 在内核外使用 CUDA printf 打印设备变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23473894/