练习计算 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
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