只會(huì)寫 if 的菜炸了,手動(dòng)分支消除,帶你裝〇帶你飛!

分支控制流在處理器指令執(zhí)行中的開銷與效率影響:
1. branch predictor 分支預(yù)測失敗造成的開銷 miss penalty 不中處罰,pipeline stall 流水線堵塞。
2. 對 SIMD 指令級(jí)并行不友好,SIMD 寄存器中各分量,無法即執(zhí)行條件指令又同時(shí)運(yùn)算。
----------
分支消除的推導(dǎo)步驟
1. 先將 if-else 改為三元條件運(yùn)算符表達(dá)式。
2. 將 c ? x : y 轉(zhuǎn)換為等價(jià)形式 y - (c ? (y - x) : 0),假定沒有算術(shù)溢出。
3. [關(guān)鍵點(diǎn)] 重新考慮 bool 系統(tǒng),0 仍作為 false,但將 -1 (0xff...f) 作為 true。三元條件表達(dá)式轉(zhuǎn)換為 y - (c2 & (y - x))
這里的關(guān)鍵思想是用真值的位特性,及位運(yùn)算(這里是按位與),來替代條件判斷。
4. [關(guān)鍵點(diǎn)] 構(gòu)造新的 bool 條件變量 c2。原 bool 條件變量 c 是由關(guān)系運(yùn)算 > < == != 求值出來的,真值只能是 false=0, true=1,現(xiàn)在要構(gòu)造 true 時(shí) c2 真值為 -1。對于這個(gè)例子,v < 10 時(shí),要讓 c2=-1,v >= 10 時(shí),要讓 c2=0。
構(gòu)造方法 1. 直接給原條件表達(dá)式前加負(fù)號(hào) c2=-(v < 10)
構(gòu)造方法 2. 這個(gè)更高效,沒有關(guān)系運(yùn)算,也就是沒有比較指令,而是做減法差值,然后通過移位時(shí)保留符號(hào)位來產(chǎn)生 -1 (0xff...f)。作者寫的是 c2=(v - 10) >> 15,為什么是右移 15 位,而不是 31 位,因?yàn)檫@個(gè)例子中 v - 10 是 ASCII 碼差值(距離),最大的差值是 -127 和 127,有效值在低 15 位里(實(shí)際上是在低 8 位里),只要把它們向右移出即可。
----------