dim3 block(4, 2)
dim3 grid((nx+block.x-1)/block.x, (ny.block.y-1)/block.y);
Run Code Online (Sandbox Code Playgroud)
我在专业 CUDA C 编程第 53 页中找到了这段代码。它是矩阵乘法的一个简单示例。nx是列数,ny是行数。
您能解释一下网格大小是如何计算的吗?为什么block.x先加上nx然后减去1?
有预览 ( https://books.google.com/books?id=_Z7rnAEACAAJ&printsec=frontcover#v=onepage&q&f=false ),但缺少第 53 页。
这是标准 CUDA 习惯用法,用于确定完全覆盖所需输入的每个维度(“网格”)中块的最小数量。这可以表示为ceil(nx/block.x),即计算出需要多少个块来覆盖所需的大小,然后向上舍入。
但完整的浮点除法和取整单元的成本比必要的要高。相反,由于 C 将整数除法定义为“下限”运算,因此您可以在除法之前添加除数 - 1 以获得“上限”运算的效果。
尝试几个例子:如果nx = 10,则nx + block.x - 1是 13,并且通过整数除法,您需要 3 个大小为 4 的块。
正如您在评论中指出的那样,+block.x 将地板推到天花板,而 -1 则表示完全除以除数的数字。例如,(12 + 4)/4 将是 4,而我们实际上想要 (12+4-1)/4 其中 3
| 归档时间: |
|
| 查看次数: |
507 次 |
| 最近记录: |