1

It's useful when execute this routine when LOOPS > BTB_SIZE, eg,

from

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

to

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

can reduce branch misses.

BTB ref:http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html but it doesn't tell how to get the BTB size.

4

2 回答 2

0

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

于 2013-05-13T02:11:21.707 回答
0

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

会有区别

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 个分支目标缓冲区(forfor和 for if),第二个版本需要 3 个分支目标缓冲区(forfor和 for 两个ifs)。

但是,Matt Godbolt 是如何发现的,有 4096 个分支目标缓冲区,所以我不会太担心它们。

于 2016-08-08T19:38:23.067 回答