dim3 block(4, 2)
dim3 grid((nx+block.x-1)/block.x, (ny.block.y-1)/block.y);
我在第53页的专业CUDA C编程中找到了这个代码。这是一个简单的矩阵乘法示例。 nx
是列数,ny
是行数。
你能解释一下如何计算网格大小吗?为什么将block.x
添加到nx
然后再减去1
?
有预览(https://books.google.com/books?id=_Z7rnAEACAAJ&printsec=frontcover#v=onepage&q&f=false)但缺少第53页。
答案 0 :(得分:3)
这是用于确定完全覆盖所需输入的每个维度(“网格”)中的最小块数的标准CUDA惯用法。这可以表示为ceil(nx/block.x)
,也就是说,计算出需要多少块来覆盖所需的大小,然后向上舍入。
但完全浮点除法和ceil比必要的更昂贵。相反,由于C将整数除法定义为“floor”操作,因此可以在除以得到“上限”操作的效果之前添加除数-1。
尝试一些示例:如果nx = 10
,则nx + block.x - 1
为13,并且通过整数除法,您需要3个大小为4的块。
正如你在评论中指出的那样,+ block.x向上推升,而-1则用于完全划分为除数的数字。例如当我们真正想要(12 + 4-1)/ 4时,(12 + 4)/ 4将是4