2012-12-11 26 views
0
dim3 DimGrid((n-1)/256 + 1, 1, 1); 
dim3 DimBlock(256, 1, 1); 
vecAddKernel<<<DimGrid,DimBlock>>>(d_A, d_B, d_C, n); 
__global__ 
void vecAddkernel(float* A, float* B, float* C, int n) 
{ 
int i = threadIdx.x + blockDim.x * blockIdx.x; 
if(i<n) C[i] = A[i] + B[i]; 
} 

在上述函數中假設我們有一個長度爲n = 257的向量,我們將只有2個塊被分配。我只是想知道在調用vecAddkernel函數時在第二個塊中會發生什麼。只有一個線程在第二個塊中執行,或者所有256個線程都執行,儘管255個線程沒有輸出。所以最基本的問題是每個vecAddKernel調用的參數'n'是如何確定的?對於每個塊是256還是對於第一個塊是256,對於第二個塊是1?如何在CUDA中執行正確的線程數

回答

5

塊中執行多少個線程僅由塊的維數決定,因此256個線程執行,儘管255個線程沒有「輸出」。另外'n'只定義了網格的維度,並且網格的每個塊中都有相同數量的線程。