如何获得CPU的分支目标缓冲区(BTB)大小?

时间:2013-05-13 01:58:44

标签: performance hardware branch-prediction

当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大小。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

从BTB的角度来看,两个版本都是相同的。在两个版本中(如果编译未经优化),只有一个条件跳转(每个都来自i<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和2个if } S)。

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