2012-09-19 42 views
0

我嘗試了一種方法,以便不使用從主機到設備的數據傳輸。通常,我們使用一個循環將值分配給主機陣列中的元素,並將其傳送到設備。這對我在1D和2D陣列上工作正常。我試過的新方法是給內核中的數組元素賦值。我成功了一維數組。但是,對於2D陣列,結果爲0。我的設備每塊可以支持(512,512)線程。輸出值可以達到長度= 22,但長度= 23時顯示爲'0'[22<sqrt(512)<23]。根據[22<sqrt(512)<23],我可以看到只有22x22線程正在使用。有什麼問題??這是爲什麼發生?使用threadIdx在內核中分配值

驗證碼:

const int Length=23; 

主要功能:

int A[Length],B[Length],C[Length],D[Length],*Ad,*Bd; 
    int size=Length*sizeof(int); 
    cudaMalloc((void**)&Ad,size); 
    cudaMalloc((void**)&Bd,size); 
    dim3 dimGrid(1,1); 
    dim3 dimBlock(Length,Length); 
    FuncG<<<dimGrid,dimBlock>>>(Ad,Bd); 
    cudaMemcpy(C,Ad,size,cudaMemcpyDeviceToHost); 
    cudaMemcpy(D,Bd,size,cudaMemcpyDeviceToHost); 
    for(int i=0;i<Length;i++){ 
     printf("%d %d\n",C[i],D[i]); 
    } 
    return 0; 

核函數:

__global__ void FuncG(int *Ad,int *Bd){ 
    int tx=threadIdx.x; 
    int ty=threadIdx.y; 
    Ad[tx]=tx; 
    Bd[ty]=ty; 
} 

回答

2

您的設備每塊只能支持512個線程。前兩個線程塊維度的最大維度是512. 22x22塊(484個線程)是合法塊大小,但23x23塊(529個線程)不是。

由於內核永遠不會運行,因此您的輸出爲0。如果您檢查它,您會發現內核啓動失敗,並顯示無效的執行配置錯誤。檢查此類型的發射失敗的典型方式是這樣的:

FuncG<<<dimGrid,dimBlock>>>(Ad,Bd); 
if (cudaPeekAtLastError() != cudaSuccess) { 
    // handle error..... 
} 
+0

我經歷的塊大小[百科](http://en.wikipedia.org/wiki/CUDA#Version_features_and_specifications) 。是(512,512,64)還是(512,1,1)? – Fr34K

+0

每個尺寸最多可以分別爲512,512,64,但也可能是所有尺寸的乘積不能大於512. – tera

+0

是否適用於blockIdx? – Fr34K