所以我開始使用CUDA編程,並且對內核編碼部分有疑問。以下是我正在嘗試的代碼。我試圖用8塊8線程打印數字1-64。看到該程序正在使用8個8線程塊。從CUDA開始,關於設備代碼
問題是我的輸出是不可能的大而且每次都是不同的,只有一個值。
#include <stdio.h>
__global__
void start(int *a){
*a = blockIdx.x*threadIdx.x*blockDim.x;;
}
int main(){
int a;
int *d_a;
int size = 64*sizeof(int);
cudaMalloc((void**)&d_a,size);
cudaMemcpy(d_a,&a,size, cudaMemcpyHostToDevice);
start<<<8,8>>>(d_a);
cudaMemcpy(&a,d_a,size,cudaMemcpyDeviceToHost);
cudaFree(d_a);
printf("%d\n",a);
return 0;
}
編輯:好吧,這聽起來很愚蠢,但我如何檢查代碼是否實際發送到GPU卡?我懷疑內核代碼根本沒有被處理。也許是因爲GPU關閉了或者什麼的。我使用PUTTY,因此我沒有物理訪問實際的機器。
「我怎麼檢查,如果代碼被實際發送到GPU」?一個好的起點是使用[適當的cuda錯誤檢查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda- runtime-api)並用'cuda-memcheck'運行你的代碼。 –
如果我使用lspci -vnn並且我看到「功能:<訪問被拒絕」,我認爲我需要聯繫管理員? – watisit
我會在考慮lspci之前就提出我已經提出的建議。如果錯誤檢查和/或'cuda-memcheck'的結果表明配置錯誤的機器,那麼可能需要查看lspci的外觀和/或讓管理員參與。即使你的機器運行正常,'cuda-memcheck'可能會報告API級別的錯誤,因爲在答案的評論中下面指示的'cudaMemcpy'大小不匹配。 –