應對分支預測有哪些優化措施
下面再來看一下分支預測,這也是 ChatGPT 給出的一個簡易答案
// 不利于流水線的循環結構
for (int i = 0; i < N; ++i) {
if (condition) {
// 循環體
}
}
// 更有利于流水線的循環結構
if (condition) {
for (int i = 0; i < N; ++i) {
// 循環體
}
}
上面的案例就是說明,我們應該在循還外進行條件判斷,這樣即便是預測失敗概率 10%,也只有 10%的回滾情況,但是如果放到循環體內部,那么這個 10%的回滾操作將被執行 N 次。
除了把判斷語句從循環體中挪出來,還有一些小的技巧供大家參考一下。
合并條件,盡可能減少分支預測失敗時對效率的影響
優化前:
if(case1)
{
if( case2 )
{
do();
}
}
優化后:
if( case1 && case2 )
{
do();
}
優化前:
if( case1 == 0 && case2 == 0 && case3 == 0 )
{
do();
}
優化后:
if( ( case1 | case2 | case3 ) == 0 )
{
do();
}
跳轉避免分支預測
將if else
改寫成switch
形式(switch
使用的指針 list 進行跳轉的指令,直接跳轉到對應分支)。這樣就相當于將多個函數使用函數指針的形式存儲到數組中,然后通過 case 查表,直接進行調用。
直接運算,避免判斷
先說明一些基本位運算知識:
|x| > > 31 = 0 // 非負數右移31為一定為0
~(|x| > > 31) = -1 // 0取反為-1
-|x| > > 31 = -1 // 負數右移31為一定為0xffff = -1
~(-|x| > > 31) = 0 // -1取反為0
-1 = 0xffff
-1 & x = x // 以-1為mask和任何數求與,值不變
如對于
if(value < 0 ) value = 0
可改成
value &= ~(value > > 31 )
再比如:
if (data[c] >= 128)
{
sum += data[c];
}
可以優化為:
int t = (data[c] - 128) 31; // 非負數右移 31 為 0,負數右移則為 -1
sum += ~t & data[c]; // 這里利用 0 和 -1,正好等同于條件,大于 128 忽略,小于 128
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
處理器
+關注
關注
68文章
19165瀏覽量
229129 -
mcu
+關注
關注
146文章
16992瀏覽量
350313 -
預測
+關注
關注
0文章
37瀏覽量
12346
發布評論請先 登錄
相關推薦
CPU分支預測對程序的影響
分支預測的英文名字是“Branch Prediction”,如果大家在Google上搜索這個關鍵字,可以看到關于分支預測的很多內容。不過,要搞清楚分
發表于 09-23 14:11
?1096次閱讀
嵌入式處理器動態分支預測機制研究與設計
嵌入式處理器動態分支預測機制研究與設計針對嵌入式處理器的特定應用環境,通過對傳統神經網絡算法的改進,結合定制的分支目標緩沖,提出一種復合式動態分支預
發表于 10-06 09:53
如何應對歐盟玩具安全新指令的措施
歐盟玩具安全新指令的措施實施后,相關企業應何應對呢?北測檢測作為第三方權威檢測機構,建議相關企業積極應對歐盟玩具安全新指令的措施,盡量做到以下幾點: 1.加快了解國際玩具標準體系。玩
發表于 01-18 11:22
優化技巧:提前if判斷幫助CPU分支預測
摘要: 在stackoverflow上有一個非常有名的問題:為什么處理有序數組要比非有序數組快?,可見分支預測對代碼運行效率有非常大的影響。要提高代碼執行效率,一個重要的原則就是盡量避免CPU把
發表于 06-13 16:27
ADC輸出雜散的成因是什么?有哪些優化措施?
Giga ADC 是 TI 推出的采樣率大于 1GHz 的數據轉換產品系列,主要應用于微波通信、衛星通信以及儀器儀表。本文介紹了 Giga ADC 的主要架構以及 ADC 輸出雜散的成因分析,以及優化性能的主要措施。
發表于 04-07 06:23
安騰處理器中多級分支預測機制
分支預測技術可消除分支指令之后損失的周期,防止流水線斷流。高比率的分支預測精確度是高性能微處理器性能的保證。本文詳細分析了安騰處理器(Ita
發表于 08-21 12:11
?12次下載
CPU中什么是分支預測
什么是分支預測 在超標量的流水線架構上,我們得知,CPU 在運行指令的時候,會在一個時鐘上做多個操作,也就是涉及到調用前后相關的指令,比如我們在一個簡單的判斷語句中。 if (n > 0 ) { n
評論