Существует одна общая привычка, которую я видел в примере 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];
}
}
Что мне интересно, это инициализация блоковPerGrid. Я не понимаю, почему это
int blocksPerGrid = (numElements + threadsPerBlock - 1)/threadsPerBlock;
, а не просто
int blocksPerGrid = numElements/threadsPerblock;
Кажется, это довольно распространенная привычка. Я видел в разных проектах. Все это делают так. Я новичок в cuda. Любые объяснения или знания по этому поводу приветствуются.