【问题标题】:Performance of branch prediction in a loop循环中分支预测的性能
【发布时间】:2012-08-28 09:15:24
【问题描述】:

这两个 sn-ps 代码之间会有明显的速度差异吗?天真地,我认为第二个 sn-p 会更快,因为遇到的分支指令要少得多,但另一方面,分支预测器应该可以解决这个问题。还是尽管有可预测的模式,但它会产生明显的开销?假设没有使用条件移动指令。

片段 1:

for (int i = 0; i < 100; i++) {
    if (a == 3)
        output[i] = 1;
    else
        output[i] = 0;
}

片段 2:

if (a == 3) {
    for (int i = 0; i < 100; i++)
        output[i] = 1;
} else {
    for (int i = 0; i < 100; i++)
        output[i] = 0;
}

我不打算自己优化这些案例,但我想更多地了解分支的开销,即使是可预测的模式。

【问题讨论】:

  • 如果您的编译器执行循环取消切换,它们是相同的。
  • int val = a == 3 ? 1 : 0; for (int i = 0; i &lt; 100; ++i) output[i] = val;
  • 它不会受到分支错误预测的影响,但无论如何它可能会受到重复分支的影响。要么,要么编译器是否为您进行优化都没有关系。检查装配以确保。
  • 对于现代处理器上的 0 到 99 示例中的循环,即使没有优化,差异也会非常小。

标签: c++ performance optimization branch-prediction


【解决方案1】:

由于a 在进入循环后保持不变,因此这两个代码-sn-p 之间应该没有太大区别。

就个人而言,我更喜欢前者,除非分支预测器无法预测真的不太可能的分支,因为a 在循环中保持不变。

此外,编译器可能会执行此优化:

从而使 两者 code-sn-ps 发出完全相同的机器指令。

【讨论】:

    【解决方案2】:

    您问了一个性能问题,但没有指定硬件(尽管从这个问题我们可以推断它是具有分支预测的架构之一)、工具链或编译选项。

    总的来说,这只是另一个空间与速度的权衡,其中空间本身通常会影响速度(CPU 指令和微码缓存)。

    唯一合理的答案是“性能会因处理器硬件和编译器优化而异。

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2018-11-30
      • 2013-11-14
      • 2020-02-12
      • 2012-09-14
      • 1970-01-01
      • 2017-07-09
      • 1970-01-01
      • 2019-12-13
      相关资源
      最近更新 更多