我們還是先看一個(gè)例子:
看上面的兩個(gè)函數(shù),它們都是calloc一個(gè)全零數(shù)組x(這里不能直接用數(shù)組賦值,否則編譯器會(huì)足夠聰明進(jìn)行自動(dòng)的優(yōu)化),遍歷x中的每個(gè)數(shù),如果等于0,執(zhí)行分支A,否則執(zhí)行分支B。
唯一的不同就是在分支判斷的時(shí)候,prog2.c加了likely。我們先看下實(shí)際的結(jié)果如何:
可以看出,加了likely的prog2,明顯用時(shí)變短。原因何在?
為了理解上面的例子,我們先介紹CPU流水線相關(guān)知識(shí):
3.1. CPU流水線簡介
CPU流水線是一種使用多級(jí)緩存來提高處理器性能的技術(shù)。它是指將CPU操作分為多個(gè)階段,每個(gè)階段單獨(dú)完成一個(gè)操作,然后將結(jié)果傳遞給下一個(gè)階段,以此類推。每個(gè)階段都有一個(gè)獨(dú)立的部件,并且所有部件都能同時(shí)處理不同的指令?,F(xiàn)代CPU都會(huì)采用這種技術(shù)來提高CPU的運(yùn)行效率。
CPU流水線通常包括以下五個(gè)階段:
1)取指令(Instruction fetch):從存儲(chǔ)器中讀取指令。
2)指令譯碼(Instruction decode):將指令轉(zhuǎn)換為可執(zhí)行的指令。
3)執(zhí)行指令(Instruction execute):執(zhí)行指令的操作。
4)寫回(Write back):將執(zhí)行指令得到的結(jié)果寫回內(nèi)存中。
5)更新程序計(jì)數(shù)器(Update program counter):將程序計(jì)數(shù)器加1,使它指向下一個(gè)指令。
舉個(gè)簡單的例子:
我們假設(shè)每一個(gè)步驟執(zhí)行時(shí)間都是一個(gè)時(shí)鐘周期,那么一條指令執(zhí)行需要3個(gè)時(shí)鐘周期
CPU 執(zhí)行指令的3個(gè)時(shí)鐘周期里,取值單元只在第一個(gè)時(shí)鐘周期里工作,其余兩個(gè)時(shí)鐘周期都處于空閑狀態(tài),其它兩個(gè)執(zhí)行單元也是如此,效率太低了。
解決方法就是引入流水線,引入流水線工作模式后可以看到,除了剛開始第一個(gè)時(shí)鐘周期大家還可以偷懶外,其余的時(shí)間都不會(huì)閑著
CPU流水線的優(yōu)點(diǎn)是可以同時(shí)執(zhí)行多個(gè)指令,從而提高了處理器的效率。但它也存在一些問題,例如數(shù)據(jù)相關(guān)性(Data dependency)和控制相關(guān)性(Control dependency),這些問題可能導(dǎo)致流水線停滯,降低CPU的性能。
執(zhí)行的程序指令如果是順序結(jié)構(gòu),沒有中斷或跳轉(zhuǎn),流水線確實(shí)可以提高執(zhí)行效率。但是當(dāng)程序指令中存在跳轉(zhuǎn)、分支結(jié)構(gòu)時(shí),下面預(yù)取的指令可能就要全部丟掉了,需要到要跳轉(zhuǎn)的地方重新取指令執(zhí)行。一般來說分支預(yù)測錯(cuò)誤的處罰大約是19個(gè)時(shí)鐘周期。(具體計(jì)算方法這里不做詳細(xì)介紹了)。
我們看下前面提到的例子匯編出來的結(jié)果:
prog2,這里匯編是”jne”,意思是如果判斷結(jié)果不為0,就跳轉(zhuǎn)到地址 800的地方執(zhí)行。我們知道這里的判斷一直是0。所以,cpu指令順序向下執(zhí)行,并不會(huì)發(fā)生預(yù)判錯(cuò)誤,預(yù)取的指令也不會(huì)丟棄。這樣就不會(huì)遭到分支預(yù)測錯(cuò)誤的懲罰,效率會(huì)提高。
所以有些情況下,當(dāng)我們根據(jù)實(shí)際的情況可以判斷出哪條分支的可能性更高的時(shí)候,我們就可以站在上帝視角給予一定的提示,這樣就可以降低分支預(yù)測錯(cuò)誤,減少CPU的無用功了,從而可以有效的提高性能,同時(shí)也節(jié)省了功耗。
-
cpu
+關(guān)注
關(guān)注
68文章
11077瀏覽量
217030 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70718
發(fā)布評(píng)論請先 登錄
CPU分支預(yù)測對程序的影響
如何統(tǒng)計(jì)蜂鳥E203的分支預(yù)測率?
提高繼電保護(hù)動(dòng)作正確率的策略
labview如何立即退出當(dāng)前事件分支
優(yōu)化技巧:提前if判斷幫助CPU分支預(yù)測
PLC編程的跳轉(zhuǎn)、分支實(shí)驗(yàn)
使用智能外設(shè)提高CPU效率

Thumb指令集之Thumb跳轉(zhuǎn)指令

搜狗推“唇語識(shí)別”正確率達(dá)90%
ARM嵌入式系統(tǒng)的中斷服務(wù)例程跳轉(zhuǎn)
如何使用蝙蝠優(yōu)化算法的網(wǎng)絡(luò)入侵檢測模型提高入侵檢測的正確率

GPU和CPU芯片的區(qū)別
如何才能解決圖像匹配算法的光照變化敏感和匹配正確率低的問題

cpu和gpu的結(jié)構(gòu)區(qū)別

評(píng)論