【问题标题】:Control flow efficiency控制流效率
【发布时间】:2019-04-11 19:54:21
【问题描述】:

如 Branch statistic manual 中所述,有两个指标:分支效率和控制流效率。

前者有一个硬件计数器branch_efficiency。但是,后者似乎没有直接的硬件计数器。是否可以找到执行和发出的控制流指令的比率并将其用作第二个效率指标?还是控制流利用率指标cf_fu_utilization

由于控制流效率可以解释为warp中一条指令的活动线程数,我想warp_execution_efficiency也可以使用,因为定义说

每个warp的平均活动线程与多处理器支持的每个warp的最大线程数之比

对此有何评论?

【问题讨论】:

    标签: cuda control-flow


    【解决方案1】:

    分支效率和控制流效率都是衡量标准。可以在单个 psd 中收集分支效率,并根据 SM 值显示。控制流效率为 smsp__thread_inst_executed / smsp__inst_executed / WARP_SIZE * 100.0。无法在所有硬件上一次性从所有 SM 收集这些计数器,因此该指标在图表上显示为所有 SM 的平均值。

    如果使用 CUPTI/NVPROF,硬件事件是:

    • inst_executed:每个 warp 执行的指令数。 警告:描述说明“每经线”。这应该是总和。
    • thread_inst_executed:活动线程执行的指令数。对于每条指令,它会增加执行该指令的线程数,包括断定线程数。它不包括重播。
    • not_predicated_off_thread_inst_executed:执行的未断定的线程指令数

    这些事件可用于计算 average_threads_executed_per_inst_executed 或 average_threads_executed_not_predicated_off_per_inst_executed。这可以转换为 % by / 32 x 100.0。

    如果条件的主体很小(多条指令),编译器将使用谓词而不是分支。

    【讨论】:

    • 分支效率由 nvprof 报告。因此,对于被调用 10 次的内核来说,100% 意味着对于所有 10 次调用,有 32 个线程处于活动状态,没有分歧的分支。 smsp__thread_inst_executed 的硬件指标是什么?
    • 正确。如果您在每个块中启动奇数个线程,即使您在内核中没有控制流,您也会看到该值减少。我用硬件计数器和 nvprof/CUPTI 公式更新了答案。
    • 关于inst_executed,nvprof 报告一个数字,例如。 100,对于被调用 50 次的内核。因此,我假设这是来自所有线程的 50 次退役指令的总数。不是吗?否则,我必须知道调用中的扭曲数是多少。
    • 我没有看到第二个和第三个项目符号的任何指标。我的意思是docs.nvidia.com/cuda/profiler-users-guide/…
    • 该文档列出了指标。它不列出事件。运行 nvprof --query-events 以列出所有事件。 inst_executed 事件返回 1 次网格启动的所有 SM 上执行(退出)的所有指令的总和。如果您希望每个 warp 执行指令,则公式为 inst_executed / warps_launched。 UI 将打印事件名称,然后是 min、max、avg、total。这些是在同一内核的所有启动中计算的,并且在网格/GPU 级别的 min/max/avg 和 total 是所有启动的总和。
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2015-02-22
    • 1970-01-01
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多