【问题标题】:How can I get my CPU's branch target buffer(BTB) size?如何获取 CPU 的分支目标缓冲区 (BTB) 大小?
【发布时间】:2013-05-07 00:11:57
【问题描述】:

当 LOOPS > BTB_SIZE 时执行此例程很有用, 例如,

来自

int n = 0;
for (int i = 0; i < LOOPS; i++)
    n++;

int n = 0;
int loops = LOOPS / 2;
for(int i = 0; i < loops; i+=2)
    n += 2;

可以减少分支失误。

BTB ref:http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html 但它没有说明如何获取 BTB 大小。

【问题讨论】:

标签: performance hardware branch-prediction


【解决方案1】:

从 BTB 的角度来看,两个版本是相同的。在这两个版本中(如果编译未优化)只有一个条件跳转(每个都源自i&lt;LOOPS),因此代码中只有一个跳转目标,因此只使用一个分支目标缓冲区。您可以使用Matt Godbolt's compiler explorer 查看生成的汇编代码。

会有区别

for(int i=0;i<n;i++){
    if(i%2==0)
        do_something();
}

for(int i=0;i<n;i++){
    if(i%2==0)
        do_something();
    if(i%3==0)
        do_something_different();
}

第一个版本需要 2 个分支目标缓冲区(对于 forif),第二个版本需要 3 个分支目标缓冲区(对于 for 和两个 ifs)。

不过,how Matt Godbolt found out,有 4096 个分支目标缓冲区,所以我不会太担心。

【讨论】:

    【解决方案2】:

    任何称职的现代编译器都应该将代码优化为int n = LOOPS;,但在更复杂的示例中,编译器会负责这种优化;例如,参见LLVM's auto-vectorisation,它处理多种循环展开。与其尝试优化代码,不如找到合适的编译器标志来让编译器完成所有艰苦的工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 2018-07-29
      • 2014-04-28
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多