【问题标题】:What does a high branch efficiency and low control flow efficiency indicate?高分支效率和低控制流效率表明什么?
【发布时间】:2012-09-22 15:12:26
【问题描述】:

我使用 Parallel Nsight 2.2 来分析我用 CUDA 4.2 编写的代码。结果是:分支效率=0.9,而控制流执行效率=0.26

来自用户指南,

Branch Efficiency=({Branches} - {Diverged Branches}) / {Branches}
Control Flow Efficiency={Thread Instructions Executed} / {Instructions Executed} / {Warps Size}

我很困惑:更高的分支效率不是意味着有更多的活动线程在一个扭曲中执行相同的指令,因此更高的控制流效率吗?高分支效率和低控制流效率意味着什么?非常感谢您的任何评论。

【问题讨论】:

    标签: cuda


    【解决方案1】:

    分支效率是衡量分支数量的指标。 100% 表示没有分支分叉。当分支发散时,经线线程活动掩码减少到小于 32,因此执行效率不高。此外,根据分支分支的方式,分支可能必须执行多次。

    已执行的线程指令 计算断定线程。编译器可以使用谓词标志来避免控制流分歧。对于具有小条件执行代码块的代码,此计数器可能会显示为 100%。

    控制流效率衡量每个指令有多少线程处于活动状态。除非您启动 32 个线程的非倍数,否则这将是 32 个线程或 100%。如果代码出现分歧,这个数字将小于 100%。

    示例 1:每个块启动 32 个线程并且没有发散的分支。

    分支效率 = 100% 控制流效率 = 100%

    示例 2:每个块启动 1 个线程并且没有分歧分支。

    分支效率 = 100% 控制流效率 = 3% (1/32)

    示例 3:每个块启动 32 个线程,并在第一条指令上以 2 种方式发散(偶数线程向一个方向,奇数线程向另一个方向)并执行发散块直到退出。假设这是唯一的分支。

    分支效率 = 0%(在某些设备上可能更高,因为出口被视为分支) 控制流效率 = 50%(大部分时间只执行 16 个线程/warp)

    【讨论】:

    • 感谢您提供的好例子。非常有帮助!我总共使用了 100 万个线程,每个块的暗淡是 512,所以每个块的非多 32 线程问题似乎是微不足道的(只发生在最后一个块上)。我是否可以将我的问题归结为“虽然发散的分支只占所有分支条件的一小部分,但只有少数线程占用了它们,而正是这些分支需要很长时间才能运行”?
    • 0.9 的分支效率证明您很少有不同的分支。 0.26 的控制流效率是少数不同分支执行大量指令的证据。指令的持续时间不是计算的一部分。该计算仅考虑执行的指令数。如果您不知道这种情况发生在哪里,我建议您使用 CUDA 调试器并单步执行代码。 CUDA Info Window Warps 视图将显示线程活动掩码。即将发布的 Nsight CUDA Profiler 版本将根据源代码行或指令显示此信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2019-05-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多