2
當我們在分配網格大小時,我在cuda示例中看到了一種常見習慣。以下是一個例子:cuda的每個網格分配習慣中的塊
int
main(){
...
int numElements = 50000;
int threadsPerBlock = 1024;
int blocksPerGrid =(numElements + threadsPerBlock - 1)/threadsPerBlock;
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements);
...
}
__global__ void
vectorAdd(const float *A, const float *B, float *C, int numElements)
{
int i = blockDim.x * blockIdx.x + threadIdx.x;
if (i < numElements)
{
C[i] = A[i] + B[i];
}
}
我很好奇的是blocksPerGrid的初始化。我不明白爲什麼它的
int blocksPerGrid = (numElements + threadsPerBlock - 1)/threadsPerBlock;
,而不是簡單的
int blocksPerGrid = numElements/threadsPerblock;
看來這是一個相當普遍的習慣。我在各種項目中看到。他們都是這樣做的。 我是新來的cuda。歡迎任何背後的解釋或知識。