2013-05-13 46 views
1

当执行此程序时LOOPS> BTB_SIZE, 例如,如何获得CPU的分支目标缓冲区(BTB)大小?

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

+0

检查http://xania.org/201602/bpu-part-one较新的英特尔处理器上的静态分支预测 http://xania.org/201602/bpu-part-two分支预测 - 第二部分及其后相同标签的出版物(http://xania.org/Microarchitecture-archive);测试代码在https://github.com/mattgodbolt/agner(tests/btb * py)和https://github.com/rmmh/whomp – osgx 2016-07-21 20:06:47

回答

0

任何现代编译器都应该将其代码优化到int n = LOOPS;,但是在一个更复杂的例子中,编译器会考虑这样的优化;例如,参见LLVM's auto-vectorisation,它处理多种循环展开。而不是试图优化你的代码,找到适当的编译器标志让编译器做所有的努力工作。

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和两个if s)。

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