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



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

谢谢,Eric

"当我尝试对使用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,它(仅)对设备数据进行操作。

Robert Crovella建议的另一种方法是将设备指针包装到thrust::device_pointer_castthrust::device_ptr中。当您只需要访问设备数组中很少的元素时,这种方式稍微更直接一些。请看下面的例子:

#include <thrustdevice_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 %dn",i,(int)*(dev_ptr_key+i));
    getchar();
}

最新更新