如何获得CPU的分支目标缓冲区(BTB)大小?
问题描述:
当执行此程序时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大小。
答
任何现代编译器都应该将其代码优化到int n = LOOPS;
,但是在一个更复杂的例子中,编译器会考虑这样的优化;例如,参见LLVM's auto-vectorisation,它处理多种循环展开。而不是试图优化你的代码,找到适当的编译器标志让编译器做所有的努力工作。
答
从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个分支目标缓冲器(用于for
和if
),第二将需要3个分支目标缓冲器(对于for
和两个if
s)。
但是,how Matt Godbolt found out,有4096个分支目标缓冲区,所以我不会太担心它们。
检查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