当他们分配网格大小时,我在 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 的新手。欢迎对此背后的任何解释或知识。