簡體   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