2013-05-13 70 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個分支目標緩衝區,所以我不會太擔心它們。