繁体   English   中英

在内核外部使用CUDA printf来打印设备变量

[英]Using CUDA printf outside the kernel to print device variables

在内核之外的CUDA中打印设备变量的最佳方法是什么? 我是否必须对主机执行cudaMemcpy ,然后打印结果值? 当我尝试在使用cudaMalloc创建的指针上使用printf时,程序崩溃了。 似乎大多数注意力都集中在内核中的打印上,而不是常规代码中。

谢谢,埃里克

“当我尝试在使用cudaMalloc创建的指针上使用printf时,程序崩溃了”

如果你有这个:

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);

您还可以调查CUDA 6中新增的统一内存 ,并查看它是否可以满足您的需求。

并且,如评论中所述,cc2.0或更高版本的设备支持来自内核的printf ,该内核仅对设备数据进行操作(仅限)。

一种替代的方法是什么建议由罗伯特·Crovella是包装设备指针变成thrust::device_ptr通过thrust::device_pointer_cast 当您只需要访问设备阵列中很少的元素时,这种方式会更加直接。 请参阅以下示例:

#include <thrust\device_vector.h>

void main() {

    const int N = 10;

    int *h_data = (int*)malloc(N*sizeof(int));
    for (int i=0; i<N; i++) h_data[i] = 3;

    int *d_data; cudaMalloc(&d_data, N*sizeof(int));    

    cudaMemcpy(d_data,h_data,N*sizeof(int),cudaMemcpyHostToDevice);

    // --- Alternative approach
    thrust::device_ptr<int> dev_ptr_key     = thrust::device_pointer_cast(d_data);
    int i = 4; printf("Element number %d is equal to %d\n",i,(int)*(dev_ptr_key+i));

    getchar();

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM