我正在研究一个简单的示例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
答案 0 :(得分:3)
这给出了整数除法:
perl
如果numElements / threadsPerBlock
不能被numElements
整除,那么这不会给出正确的结果 - 我们需要一个额外的线程块来覆盖&#34;额外的&#34;需要线程。
这个算术:
threadsPerBlock
根据需要给我们一个额外的线程块。