【问题标题】:Practice computing grid size for CUDA练习计算 CUDA 的网格大小
【发布时间】:2023-03-23 06:05:01
【问题描述】:
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 页。

【问题讨论】:

    标签: cuda nvidia


    【解决方案1】:

    这是标准 CUDA 习惯用法,用于确定每个维度(“网格”)中完全覆盖所需输入的最小块数。这可以表示为ceil(nx/block.x),即计算出需要多少块才能覆盖所需的大小,然后四舍五入。

    但是全浮点除法和 ceil 比必要的要贵。相反,由于 C 将整数除法定义为“下限”运算,您可以在除法之前添加除数 - 1 以获得“上限”运算的效果。

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

    正如您在评论中指出的那样,+block.x 将地板推到天花板,而 -1 用于完美除数的数字。例如当我们真正想要 (12+4-1)/4 时, (12 + 4)/4 将是 4 是 3

    【讨论】:

    • 谢谢。减 1 如何将值推高到“上限”操作?
    • 我现在明白了。 block.x 将地板推到天花板,-1 用于完美除数的数字。例如当我们实际想要 (12+4-1)/4 时, (12 + 4)/4 将是 4,即 3。
    猜你喜欢
    • 2013-07-18
    • 2015-07-25
    • 1970-01-01
    • 2014-07-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2011-08-04
    相关资源
    最近更新 更多