應(yīng)對(duì)分支預(yù)測(cè)有哪些優(yōu)化措施
下面再來看一下分支預(yù)測(cè),這也是 ChatGPT 給出的一個(gè)簡(jiǎn)易答案
// 不利于流水線的循環(huán)結(jié)構(gòu)
for (int i = 0; i < N; ++i) {
if (condition) {
// 循環(huán)體
}
}
// 更有利于流水線的循環(huán)結(jié)構(gòu)
if (condition) {
for (int i = 0; i < N; ++i) {
// 循環(huán)體
}
}
上面的案例就是說明,我們應(yīng)該在循還外進(jìn)行條件判斷,這樣即便是預(yù)測(cè)失敗概率 10%,也只有 10%的回滾情況,但是如果放到循環(huán)體內(nèi)部,那么這個(gè) 10%的回滾操作將被執(zhí)行 N 次。
除了把判斷語句從循環(huán)體中挪出來,還有一些小的技巧供大家參考一下。
合并條件,盡可能減少分支預(yù)測(cè)失敗時(shí)對(duì)效率的影響
優(yōu)化前:
if(case1)
{
if( case2 )
{
do();
}
}
優(yōu)化后:
if( case1 && case2 )
{
do();
}
優(yōu)化前:
if( case1 == 0 && case2 == 0 && case3 == 0 )
{
do();
}
優(yōu)化后:
if( ( case1 | case2 | case3 ) == 0 )
{
do();
}
跳轉(zhuǎn)避免分支預(yù)測(cè)
將if else
改寫成switch
形式(switch
使用的指針 list 進(jìn)行跳轉(zhuǎn)的指令,直接跳轉(zhuǎn)到對(duì)應(yīng)分支)。這樣就相當(dāng)于將多個(gè)函數(shù)使用函數(shù)指針的形式存儲(chǔ)到數(shù)組中,然后通過 case 查表,直接進(jìn)行調(diào)用。
直接運(yùn)算,避免判斷
先說明一些基本位運(yùn)算知識(shí):
|x| > > 31 = 0 // 非負(fù)數(shù)右移31為一定為0
~(|x| > > 31) = -1 // 0取反為-1
-|x| > > 31 = -1 // 負(fù)數(shù)右移31為一定為0xffff = -1
~(-|x| > > 31) = 0 // -1取反為0
-1 = 0xffff
-1 & x = x // 以-1為mask和任何數(shù)求與,值不變
如對(duì)于
if(value < 0 ) value = 0
可改成
value &= ~(value > > 31 )
再比如:
if (data[c] >= 128)
{
sum += data[c];
}
可以優(yōu)化為:
int t = (data[c] - 128) 31; // 非負(fù)數(shù)右移 31 為 0,負(fù)數(shù)右移則為 -1
sum += ~t & data[c]; // 這里利用 0 和 -1,正好等同于條件,大于 128 忽略,小于 128
-
處理器
+關(guān)注
關(guān)注
68文章
19293瀏覽量
229968 -
mcu
+關(guān)注
關(guān)注
146文章
17162瀏覽量
351349 -
預(yù)測(cè)
+關(guān)注
關(guān)注
0文章
37瀏覽量
12371
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論