练习计算 CUDA 的网格大小

Practice computing grid size for CUDA

dim3 block(4, 2)
dim3 grid((nx+block.x-1)/block.x, (ny.block.y-1)/block.y);

我在第 53 页的 Professional CUDA C Programming 中找到了这段代码。它是一个简单的矩阵乘法示例。 nx 是列数,ny 是行数。

您能解释一下网格大小是如何计算的吗?为什么 block.x 加上 nx 然后再减去 1

有预览(https://books.google.com/books?id=_Z7rnAEACAAJ&printsec=frontcover#v=onepage&q&f=false)但缺少第 53 页。

这是标准的 CUDA 习惯用语,用于确定每个维度("grid")中完全覆盖所需输入的最小块数。这可以表示为ceil(nx/block.x),即计算出需要多少块来覆盖所需的大小,然后向上取整。

但是完整的浮点除法和 ceil 比必要的更昂贵。相反,由于 C 将整数除法定义为 "floor" 运算,因此您可以在除法之前添加除数 - 1 以获得 "ceiling" 运算的效果。

试举几个例子:如果nx = 10,那么nx + block.x - 1就是13,通过整数除法,你需要3个大小为4的块。

正如您在评论中指出的那样,+block.x 将下限推到上限,-1 表示可以完美除以除数的数字。例如当我们实际想要 (12+4-1)/4 时,(12 + 4)/4 将是 4,其中 3