在內核之外的CUDA中打印設備變量的最佳方式是什麼?我是否必須對主機執行cudaMemcpy
並打印結果值?當我嘗試在使用cudaMalloc
創建的指針上使用printf
時,程序崩潰。看起來大部分的注意力都集中在內核打印上,而不是普通的代碼中。在內核之外使用CUDA printf來打印設備變量
謝謝,埃裏克
在內核之外的CUDA中打印設備變量的最佳方式是什麼?我是否必須對主機執行cudaMemcpy
並打印結果值?當我嘗試在使用cudaMalloc
創建的指針上使用printf
時,程序崩潰。看起來大部分的注意力都集中在內核打印上,而不是普通的代碼中。在內核之外使用CUDA printf來打印設備變量
謝謝,埃裏克
「當我嘗試對指針用printf創建使用cudaMalloc,程序崩潰」
如果你有這樣的:
int *d_data, *h_data;
cudaMalloc(&d_data, DSIZE);
你不能做到這一點:
printf(" %d ", *d_data);
,因爲這需要在CUDA中通常不合法的主機代碼中取消引用設備指針(d_data
)。
相反,你可以這樣做:
h_data = (int *)malloc(DSIZE);
cudaMemcpy(h_data, d_data, DSIZE, cudaMemcpyDeviceToHost);
printf(" %d ", *h_data);
您也可以調查Unified Memory這是CUDA 6個新的,看看它是否將成爲你的目的。
而且,如註釋中所述,cc2.0或更高版本的設備支持內核中的printf
,該內核僅對設備數據進行操作。
Robert Crovella建議的替代方法是將設備指針由thrust::device_pointer_cast
包裝爲thrust::device_ptr
。當您只需訪問設備陣列中非常少的元素時,這種方式稍微更直接。看下面的例子:
#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();
}
這一切都取決於你正在使用哪個版本的CUDA庫。我相信直接來自內核的'printf'增加了2.1左右。如果你想從主辦方printf,你需要使用'cudaMemcpy',是的。 –