当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大小。
答案 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个分支目标缓冲区(for
和if
),第二个版本需要3个分支目标缓冲区(for
和2个if
} S)。
然而,how Matt Godbolt found out,有4096个分支目标缓冲区,所以我不会太担心它们。