0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何幫助提高CPU分支跳轉(zhuǎn)的正確率

麥辣雞腿堡 ? 來(lái)源:OPPO內(nèi)核工匠 ? 作者:Rock ? 2023-12-13 11:25 ? 次閱讀

我們還是先看一個(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é)省了功耗。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10698

    瀏覽量

    209329
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67761
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CPU分支預(yù)測(cè)對(duì)程序的影響

    分支預(yù)測(cè)的英文名字是“Branch Prediction”,如果大家在Google上搜索這個(gè)關(guān)鍵字,可以看到關(guān)于分支預(yù)測(cè)的很多內(nèi)容。不過(guò),要搞清楚分支預(yù)測(cè)是如何工作的,才是問(wèn)題的關(guān)鍵。
    發(fā)表于 09-23 14:11 ?1019次閱讀

    提高繼電保護(hù)動(dòng)作正確率的策略

    和復(fù)雜,一旦發(fā)生局部電網(wǎng)和設(shè)備事故,而得不到有效控制,就會(huì)造成電網(wǎng)的穩(wěn)定破壞和大面積停電事故。現(xiàn)代化大電網(wǎng)對(duì)繼電保護(hù)的依賴性更強(qiáng),對(duì)其動(dòng)作正確率的要求更高。2 提高繼電保護(hù)動(dòng)作正確率的措施2.1
    發(fā)表于 08-20 14:58

    labview如何立即退出當(dāng)前事件分支

    `想按Stop按鍵起到急停作用,想法就是:按Stop按鈕,立即停止當(dāng)前執(zhí)行的事件分支,跳轉(zhuǎn)到另一個(gè)急停事件中,所有的閥門和泵全部關(guān)閉??紤]到當(dāng)前分支的執(zhí)行時(shí)間比較但是我想只要按下Stop鍵就會(huì)停止當(dāng)前
    發(fā)表于 10-28 15:12

    優(yōu)化技巧:提前if判斷幫助CPU分支預(yù)測(cè)

    分支預(yù)測(cè)(branch prediction)和指令流水線(instruction pipeline),這兩個(gè)結(jié)合可以極大提高CPU效率。對(duì)于像簡(jiǎn)單的if跳轉(zhuǎn)
    發(fā)表于 06-13 16:27

    怎樣去正確的配置CAN協(xié)議的波特

    正確配置了它?我是否正確使用標(biāo)稱同步跳轉(zhuǎn)寬度?(我沒(méi)有在網(wǎng)站上看到同步跳轉(zhuǎn)寬度的提及)。如果我犯了任何錯(cuò)誤,我將不勝感激一些反饋!(請(qǐng)注意,我此時(shí)沒(méi)有示波器訪問(wèn)權(quán)限,這就是我首先在這
    發(fā)表于 12-02 11:08

    PLC編程的跳轉(zhuǎn)、分支實(shí)驗(yàn)

    PLC編程的跳轉(zhuǎn)分支實(shí)驗(yàn) 一. 實(shí)驗(yàn)?zāi)康?. 熟悉編程軟件及編程方式。2. 掌握跳轉(zhuǎn)分支指令的使用。二.
    發(fā)表于 09-30 18:33 ?6376次閱讀

    使用智能外設(shè)提高CPU效率

    現(xiàn)代微控制器添加了一個(gè)范圍廣泛的新功能,在正確使用時(shí)可以大大提高應(yīng)用效率。特別是,可以使用獨(dú)立于CPU獨(dú)立操作的智能外設(shè)和外圍設(shè)備,允許CPU并行執(zhí)行其他任務(wù),或者進(jìn)入低功耗睡眠模式。
    發(fā)表于 06-09 14:32 ?7次下載
    使用智能外設(shè)<b class='flag-5'>提高</b><b class='flag-5'>CPU</b>效率

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

    進(jìn)行狀態(tài)切換可以在程序中設(shè)定選擇)。 ⑤ 帶返回和狀態(tài)切換的跳轉(zhuǎn)指令(是否進(jìn)行狀態(tài)切換可以在程序中設(shè)定選擇)。 ⑥ 第二種形式的帶返回和狀態(tài)切換的跳轉(zhuǎn)指令。 下面詳細(xì)介紹各指令的特點(diǎn)及用途。 11.3.1 跳轉(zhuǎn)指令B Thumb
    發(fā)表于 10-19 10:04 ?1次下載
    Thumb指令集之Thumb<b class='flag-5'>跳轉(zhuǎn)</b>指令

    搜狗推“唇語(yǔ)識(shí)別”正確率達(dá)90%

    人機(jī)交互是未來(lái)讓人們更好的去理解程序的執(zhí)行的效果,或者說(shuō)讓機(jī)器可以更準(zhǔn)備的知道人們對(duì)他發(fā)布的指令進(jìn)行正確的執(zhí)行。搜狗推出新型的人機(jī)交互技術(shù)“唇語(yǔ)識(shí)別”據(jù)悉在垂直場(chǎng)景下可以達(dá)到90%準(zhǔn)確。
    發(fā)表于 12-14 16:43 ?1508次閱讀

    ARM嵌入式系統(tǒng)的中斷服務(wù)例程跳轉(zhuǎn)

    在32位 ARM 系統(tǒng)中,一般都是在中斷向量表中放置一條分支指令或PC寄存器加載指令,實(shí)現(xiàn) 程序跳轉(zhuǎn) 到 中斷服務(wù) 例程的功能。例如: IRQEntry B HandleIRQ ;跳轉(zhuǎn)范圍較小 B
    發(fā)表于 04-10 10:11 ?2775次閱讀

    如何使用蝙蝠優(yōu)化算法的網(wǎng)絡(luò)入侵檢測(cè)模型提高入侵檢測(cè)的正確率

    網(wǎng)絡(luò)入侵具有突發(fā)性和隱蔽性等特點(diǎn),傳統(tǒng)的技術(shù)很難描述其變化規(guī)律,這導(dǎo)致入侵檢測(cè)正確率非常的低。為提高入侵檢測(cè)正確率,降低誤檢,提出了一種基于動(dòng)態(tài)自適應(yīng)權(quán)重和柯西變異的蝙蝠優(yōu)化算法優(yōu)化
    發(fā)表于 11-14 17:34 ?5次下載
    如何使用蝙蝠優(yōu)化算法的網(wǎng)絡(luò)入侵檢測(cè)模型<b class='flag-5'>提高</b>入侵檢測(cè)的<b class='flag-5'>正確率</b>

    GPU和CPU芯片的區(qū)別

    CPU和GPU之所以大不相同,是由于其設(shè)計(jì)目標(biāo)的不同,它們分別針對(duì)了兩種不同的應(yīng)用場(chǎng)景。CPU需要很強(qiáng)的通用性來(lái)處理各種不同的數(shù)據(jù)類型,同時(shí)又要邏輯判斷又會(huì)引入大量的分支跳轉(zhuǎn)和中斷的處
    的頭像 發(fā)表于 05-10 09:04 ?1.8w次閱讀

    如何才能解決圖像匹配算法的光照變化敏感和匹配正確率低的問(wèn)題

    針對(duì)現(xiàn)有的基于局部特征的圖像匹配算法對(duì)光照變化敏感、匹配正確率低等問(wèn)題,提出一種具有光照魯棒性的圖像匹配算法。首先使用實(shí)時(shí)對(duì)比保留去色(RTCP)算法灰度化圖像,然后利用對(duì)比拉伸函數(shù)模擬不同光照變換
    發(fā)表于 11-14 15:16 ?12次下載
    如何才能解決圖像匹配算法的光照變化敏感和匹配<b class='flag-5'>正確率</b>低的問(wèn)題

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

    CPU和GPU之所以大不相同,是由于其設(shè)計(jì)目標(biāo)的不同,它們分別針對(duì)了兩種不同的應(yīng)用場(chǎng)景。 CPU需要很強(qiáng)的通用性來(lái)處理各種不同的數(shù)據(jù)類型,同時(shí)又要邏輯判斷又會(huì)引入大量的分支跳轉(zhuǎn)和中斷的
    發(fā)表于 11-15 10:24 ?967次閱讀
    <b class='flag-5'>cpu</b>和gpu的結(jié)構(gòu)區(qū)別

    CPU中什么是分支預(yù)測(cè)

    什么是分支預(yù)測(cè) 在超標(biāo)量的流水線架構(gòu)上,我們得知,CPU 在運(yùn)行指令的時(shí)候,會(huì)在一個(gè)時(shí)鐘上做多個(gè)操作,也就是涉及到調(diào)用前后相關(guān)的指令,比如我們?cè)谝粋€(gè)簡(jiǎn)單的判斷語(yǔ)句中。 if (n > 0 ) { n
    的頭像 發(fā)表于 11-29 17:22 ?872次閱讀