【发布时间】:2013-06-25 16:58:14
【问题描述】:
当他们分配网格大小时,我在 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 的新手。欢迎对此背后的任何解释或知识。
【问题讨论】: