我們還是先看一個(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流水線簡(jiǎn)介
CPU流水線是一種使用多級(jí)緩存來(lái)提高處理器性能的技術(shù)。它是指將CPU操作分為多個(gè)階段,每個(gè)階段單獨(dú)完成一個(gè)操作,然后將結(jié)果傳遞給下一個(gè)階段,以此類推。每個(gè)階段都有一個(gè)獨(dú)立的部件,并且所有部件都能同時(shí)處理不同的指令。現(xiàn)代CPU都會(huì)采用這種技術(shù)來(lái)提高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è)簡(jiǎn)單的例子:
我們假設(shè)每一個(gè)步驟執(zhí)行時(shí)間都是一個(gè)時(shí)鐘周期,那么一條指令執(zhí)行需要3個(gè)時(shí)鐘周期
CPU 執(zhí)行指令的3個(gè)時(shí)鐘周期里,取值單元只在第一個(gè)時(shí)鐘周期里工作,其余兩個(gè)時(shí)鐘周期都處于空閑狀態(tài),其它兩個(gè)執(zhí)行單元也是如此,效率太低了。
解決方法就是引入流水線,引入流水線工作模式后可以看到,除了剛開(kāi)始第一個(gè)時(shí)鐘周期大家還可以偷懶外,其余的時(shí)間都不會(huì)閑著
CPU流水線的優(yōu)點(diǎn)是可以同時(shí)執(zhí)行多個(gè)指令,從而提高了處理器的效率。但它也存在一些問(wèn)題,例如數(shù)據(jù)相關(guān)性(Data dependency)和控制相關(guān)性(Control dependency),這些問(wèn)題可能導(dǎo)致流水線停滯,降低CPU的性能。
執(zhí)行的程序指令如果是順序結(jié)構(gòu),沒(méi)有中斷或跳轉(zhuǎn),流水線確實(shí)可以提高執(zhí)行效率。但是當(dāng)程序指令中存在跳轉(zhuǎn)、分支結(jié)構(gòu)時(shí),下面預(yù)取的指令可能就要全部丟掉了,需要到要跳轉(zhuǎn)的地方重新取指令執(zhí)行。一般來(lái)說(shuō)分支預(yù)測(cè)錯(cuò)誤的處罰大約是19個(gè)時(shí)鐘周期。(具體計(jì)算方法這里不做詳細(xì)介紹了)。
我們看下前面提到的例子匯編出來(lái)的結(jié)果:
prog2,這里匯編是”jne”,意思是如果判斷結(jié)果不為0,就跳轉(zhuǎn)到地址 800的地方執(zhí)行。我們知道這里的判斷一直是0。所以,cpu指令順序向下執(zhí)行,并不會(huì)發(fā)生預(yù)判錯(cuò)誤,預(yù)取的指令也不會(huì)丟棄。這樣就不會(huì)遭到分支預(yù)測(cè)錯(cuò)誤的懲罰,效率會(huì)提高。
所以有些情況下,當(dāng)我們根據(jù)實(shí)際的情況可以判斷出哪條分支的可能性更高的時(shí)候,我們就可以站在上帝視角給予一定的提示,這樣就可以降低分支預(yù)測(cè)錯(cuò)誤,減少CPU的無(wú)用功了,從而可以有效的提高性能,同時(shí)也節(jié)省了功耗。
-
cpu
+關(guān)注
關(guān)注
68文章
10698瀏覽量
209329 -
代碼
+關(guān)注
關(guān)注
30文章
4670瀏覽量
67761
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論