2016-02-29 99 views
0

所以我開始使用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,因此我沒有物理訪問實際的機器。

+0

「我怎麼檢查,如果代碼被實際發送到GPU」?一個好的起點是使用[適當的cuda錯誤檢查](http://stackoverflow.com/questions/14038589/what-is-the-canonical-way-to-check-for-errors-using-the-cuda- runtime-api)並用'cuda-memcheck'運行你的代碼。 –

+0

如果我使用lspci -vnn並且我看到「功能:<訪問被拒絕」,我認爲我需要聯繫管理員? – watisit

+0

我會在考慮lspci之前就提出我已經提出的建議。如果錯誤檢查和/或'cuda-memcheck'的結果表明配置錯誤的機器,那麼可能需要查看lspci的外觀和/或讓管理員參與。即使你的機器運行正常,'cuda-memcheck'可能會報告API級別的錯誤,因爲在答案的評論中下面指示的'cudaMemcpy'大小不匹配。 –

回答

1

兩個問題,都在同一行代碼中。

*a = blockIdx.x*threadIdx.x*blockDim.x;; 

1.您的所有線程正在寫入相同的位置。假設你想要一個包含1-64的數組,這不是你想要做的。你想是這樣的:

a[id] = id; 
  • 你的算法是錯誤的。如果你想要你的塊和線程映射到1-64,你可以用這個代替

    blockIdx.x * blockDim.x + threadIdx.x;

  • 將所有內容放在一起,你可以這樣做:

    int id= blockIdx.x*blockDim.x+threadIdx.x; 
    a[id] = id; 
    
    +1

    另外,主機和設備陣列必須具有相同的大小,否則cudaMemcpy將會出錯。 – Hopobcn