我們還是先看一個例子:
看上面的兩個函數(shù),它們都是calloc一個全零數(shù)組x(這里不能直接用數(shù)組賦值,否則編譯器會足夠聰明進行自動的優(yōu)化),遍歷x中的每個數(shù),如果等于0,執(zhí)行分支A,否則執(zhí)行分支B。
唯一的不同就是在分支判斷的時候,prog2.c加了likely。我們先看下實際的結(jié)果如何:
可以看出,加了likely的prog2,明顯用時變短。原因何在?
為了理解上面的例子,我們先介紹CPU流水線相關(guān)知識:
3.1. CPU流水線簡介
CPU流水線是一種使用多級緩存來提高處理器性能的技術(shù)。它是指將CPU操作分為多個階段,每個階段單獨完成一個操作,然后將結(jié)果傳遞給下一個階段,以此類推。每個階段都有一個獨立的部件,并且所有部件都能同時處理不同的指令?,F(xiàn)代CPU都會采用這種技術(shù)來提高CPU的運行效率。
CPU流水線通常包括以下五個階段:
1)取指令(Instruction fetch):從存儲器中讀取指令。
2)指令譯碼(Instruction decode):將指令轉(zhuǎn)換為可執(zhí)行的指令。
3)執(zhí)行指令(Instruction execute):執(zhí)行指令的操作。
4)寫回(Write back):將執(zhí)行指令得到的結(jié)果寫回內(nèi)存中。
5)更新程序計數(shù)器(Update program counter):將程序計數(shù)器加1,使它指向下一個指令。
舉個簡單的例子:
我們假設(shè)每一個步驟執(zhí)行時間都是一個時鐘周期,那么一條指令執(zhí)行需要3個時鐘周期
CPU 執(zhí)行指令的3個時鐘周期里,取值單元只在第一個時鐘周期里工作,其余兩個時鐘周期都處于空閑狀態(tài),其它兩個執(zhí)行單元也是如此,效率太低了。
解決方法就是引入流水線,引入流水線工作模式后可以看到,除了剛開始第一個時鐘周期大家還可以偷懶外,其余的時間都不會閑著
CPU流水線的優(yōu)點是可以同時執(zhí)行多個指令,從而提高了處理器的效率。但它也存在一些問題,例如數(shù)據(jù)相關(guān)性(Data dependency)和控制相關(guān)性(Control dependency),這些問題可能導(dǎo)致流水線停滯,降低CPU的性能。
執(zhí)行的程序指令如果是順序結(jié)構(gòu),沒有中斷或跳轉(zhuǎn),流水線確實可以提高執(zhí)行效率。但是當(dāng)程序指令中存在跳轉(zhuǎn)、分支結(jié)構(gòu)時,下面預(yù)取的指令可能就要全部丟掉了,需要到要跳轉(zhuǎn)的地方重新取指令執(zhí)行。一般來說分支預(yù)測錯誤的處罰大約是19個時鐘周期。(具體計算方法這里不做詳細(xì)介紹了)。
我們看下前面提到的例子匯編出來的結(jié)果:
prog2,這里匯編是”jne”,意思是如果判斷結(jié)果不為0,就跳轉(zhuǎn)到地址 800的地方執(zhí)行。我們知道這里的判斷一直是0。所以,cpu指令順序向下執(zhí)行,并不會發(fā)生預(yù)判錯誤,預(yù)取的指令也不會丟棄。這樣就不會遭到分支預(yù)測錯誤的懲罰,效率會提高。
所以有些情況下,當(dāng)我們根據(jù)實際的情況可以判斷出哪條分支的可能性更高的時候,我們就可以站在上帝視角給予一定的提示,這樣就可以降低分支預(yù)測錯誤,減少CPU的無用功了,從而可以有效的提高性能,同時也節(jié)省了功耗。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
相關(guān)推薦
分支預(yù)測的英文名字是“Branch Prediction”,如果大家在Google上搜索這個關(guān)鍵字,可以看到關(guān)于分支預(yù)測的很多內(nèi)容。不過,要搞清楚分支預(yù)測是如何工作的,才是問題的關(guān)鍵。
發(fā)表于 09-23 14:11
?1134次閱讀
和復(fù)雜,一旦發(fā)生局部電網(wǎng)和設(shè)備事故,而得不到有效控制,就會造成電網(wǎng)的穩(wěn)定破壞和大面積停電事故?,F(xiàn)代化大電網(wǎng)對繼電保護的依賴性更強,對其動作正確率的要求更高。2 提高繼電保護動作正確率的措施2.1
發(fā)表于 08-20 14:58
`想按Stop按鍵起到急停作用,想法就是:按Stop按鈕,立即停止當(dāng)前執(zhí)行的事件分支,跳轉(zhuǎn)到另一個急停事件中,所有的閥門和泵全部關(guān)閉??紤]到當(dāng)前分支的執(zhí)行時間比較但是我想只要按下Stop鍵就會停止當(dāng)前
發(fā)表于 10-28 15:12
分支預(yù)測(branch prediction)和指令流水線(instruction pipeline),這兩個結(jié)合可以極大提高CPU效率。對于像簡單的if跳轉(zhuǎn),
發(fā)表于 06-13 16:27
正確配置了它?我是否正確使用標(biāo)稱同步跳轉(zhuǎn)寬度?(我沒有在網(wǎng)站上看到同步跳轉(zhuǎn)寬度的提及)。如果我犯了任何錯誤,我將不勝感激一些反饋!(請注意,我此時沒有示波器訪問權(quán)限,這就是我首先在這
發(fā)表于 12-02 11:08
PLC編程的跳轉(zhuǎn)、分支實驗
一. 實驗?zāi)康?. 熟悉編程軟件及編程方式。2. 掌握跳轉(zhuǎn)、分支指令的使用。二.
發(fā)表于 09-30 18:33
?6772次閱讀
現(xiàn)代微控制器添加了一個范圍廣泛的新功能,在正確使用時可以大大提高應(yīng)用效率。特別是,可以使用獨立于CPU獨立操作的智能外設(shè)和外圍設(shè)備,允許CPU并行執(zhí)行其他任務(wù),或者進入低功耗睡眠模式。
發(fā)表于 06-09 14:32
?7次下載
進行狀態(tài)切換可以在程序中設(shè)定選擇)。 ⑤ 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令(是否進行狀態(tài)切換可以在程序中設(shè)定選擇)。 ⑥ 第二種形式的帶返回和狀態(tài)切換的跳轉(zhuǎn)指令。 下面詳細(xì)介紹各指令的特點及用途。 11.3.1 跳轉(zhuǎn)指令B Thumb
發(fā)表于 10-19 10:04
?1次下載
人機交互是未來讓人們更好的去理解程序的執(zhí)行的效果,或者說讓機器可以更準(zhǔn)備的知道人們對他發(fā)布的指令進行正確的執(zhí)行。搜狗推出新型的人機交互技術(shù)“唇語識別”據(jù)悉在垂直場景下可以達到90%準(zhǔn)確率。
發(fā)表于 12-14 16:43
?1543次閱讀
在32位 ARM 系統(tǒng)中,一般都是在中斷向量表中放置一條分支指令或PC寄存器加載指令,實現(xiàn) 程序跳轉(zhuǎn) 到 中斷服務(wù) 例程的功能。例如: IRQEntry B HandleIRQ ;跳轉(zhuǎn)范圍較小 B
發(fā)表于 04-10 10:11
?2831次閱讀
網(wǎng)絡(luò)入侵具有突發(fā)性和隱蔽性等特點,傳統(tǒng)的技術(shù)很難描述其變化規(guī)律,這導(dǎo)致入侵檢測正確率非常的低。為提高入侵檢測正確率,降低誤檢率,提出了一種基于動態(tài)自適應(yīng)權(quán)重和柯西變異的蝙蝠優(yōu)化算法優(yōu)化
發(fā)表于 11-14 17:34
?5次下載
CPU和GPU之所以大不相同,是由于其設(shè)計目標(biāo)的不同,它們分別針對了兩種不同的應(yīng)用場景。CPU需要很強的通用性來處理各種不同的數(shù)據(jù)類型,同時又要邏輯判斷又會引入大量的分支跳轉(zhuǎn)和中斷的處
發(fā)表于 05-10 09:04
?1.9w次閱讀
針對現(xiàn)有的基于局部特征的圖像匹配算法對光照變化敏感、匹配正確率低等問題,提出一種具有光照魯棒性的圖像匹配算法。首先使用實時對比保留去色(RTCP)算法灰度化圖像,然后利用對比拉伸函數(shù)模擬不同光照變換
發(fā)表于 11-14 15:16
?12次下載
CPU和GPU之所以大不相同,是由于其設(shè)計目標(biāo)的不同,它們分別針對了兩種不同的應(yīng)用場景。 CPU需要很強的通用性來處理各種不同的數(shù)據(jù)類型,同時又要邏輯判斷又會引入大量的分支跳轉(zhuǎn)和中斷的
發(fā)表于 11-15 10:24
?1452次閱讀
什么是分支預(yù)測 在超標(biāo)量的流水線架構(gòu)上,我們得知,CPU 在運行指令的時候,會在一個時鐘上做多個操作,也就是涉及到調(diào)用前后相關(guān)的指令,比如我們在一個簡單的判斷語句中。 if (n > 0 ) { n
發(fā)表于 11-29 17:22
?1038次閱讀
評論