2015-06-01 10 views
1

Я рассматриваю одну из простых программ CUDA для примера и задал вопрос о том, как она определила количество блоков в сетке. Соответствующая часть кода:CUDA: определение количества блоков нитей в сетке

// Launch the Vector Add CUDA Kernel 
int threadsPerBlock = 256; 
int blocksPerGrid =(numElements + threadsPerBlock - 1)/threadsPerBlock; 
printf("CUDA kernel launch with %d blocks of %d threads\n", blocksPerGrid, threadsPerBlock); 
vectorAdd<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, numElements); 

Почему blocksPerGrid равна

(numElements + threadsPerBlock - 1)/threadsPerBlock 

и не только

numElements/threadsPerBlock 

?

+1

Спросите себя, что произойдет, если 'numElement talonmies

ответ

3

Это дает целочисленное деление:

numElements/threadsPerBlock 

Если numElements не нацело на threadsPerBlock, то это не даст правильный результат - нам нужен дополнительный threadblock, чтобы покрыть «лишние» темы необходимо.

Эта арифметика:

(numElements + threadsPerBlock - 1)/threadsPerBlock 

дает нам дополнительную threadblock, по мере необходимости.