電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 22|回復(fù): 0
收起左側(cè)

亂序執(zhí)行會給CPU帶來額外開銷嗎?

[復(fù)制鏈接]

544

主題

544

帖子

3210

積分

四級會員

Rank: 4

積分
3210
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-10-21 08:00:00 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
, O3 q1 |, a7 C( K
點擊上方藍色字體,關(guān)注我們4 ~8 i( L$ b& u' }; e
來源于小伙伴提問。
' C: w. F! ~6 C" Q: e) F- v  ~8 T0 c& [

8 [5 G0 i* W; _( } / ~" _3 A5 d( B. R1 i2 d7 j
" G1 @5 O% h6 {
以下是我的一些看法。
) n) n; s( X/ o( U- c6 {; f1 m
在亂序執(zhí)行的CPU架構(gòu)中,指令的實際執(zhí)行順序與程序中原本的順序可能不一致。CPU可以根據(jù)指令之間的依賴性,在允許的范圍內(nèi)重新安排指令的執(zhí)行順序,以提高并行性,從而提升性能。亂序執(zhí)行通過這樣的方法減少流水線停頓(stall),從而更好地利用CPU的執(zhí)行單元。. Z6 @5 k8 k% ?) a" D1 k/ i2 \

4 F/ l6 i3 L2 f; j, [舉個例子,代碼A與代碼B的性能對比:
  [, z9 {+ f3 }0 l% F
  • 代碼A:經(jīng)過完美優(yōu)化,沒有指令間依賴導(dǎo)致的停頓。在這種情況下,即使亂序執(zhí)行引擎重排指令,最終的指令順序和原本順序會大體相同,因為代碼已經(jīng)被優(yōu)化到最小依賴性。對于代碼A,亂序執(zhí)行能進一步提升的空間較小,因為沒有額外的指令重排能夠提高并行性。
    ( s# ~4 O6 k8 l0 o代碼B:存在依賴,如果按順序執(zhí)行會有停頓。亂序執(zhí)行引擎在處理代碼B時,可以重新安排指令的執(zhí)行順序,來隱藏這些依賴關(guān)系引起的停頓。雖然代碼B原本的順序較差,但是亂序執(zhí)行可以通過重排指令使得性能接近代碼A的水平。2 D) m9 x& I- }! p! x" @" a8 _
    2 i3 i( C) s* W% y. B
    因此,在這種假設(shè)的情況下(不考慮亂序窗口的限制),代碼B可以通過亂序執(zhí)行引擎來消除其劣勢,最終性能接近代碼A。但是,這并不意味著兩者在所有情況下都會有相同的性能。% q4 Y$ w: w# h/ h. Q- K( b
    1 @2 x- K6 Y8 ^3 E2 a  d2 C3 h+ B
    因為:8 E6 H3 l1 f$ @( d" b& z
  • 亂序執(zhí)行的額外開銷:雖然亂序執(zhí)行可以提升性能,但重排指令、跟蹤依賴關(guān)系、硬件重命名寄存器等操作本身是有代價的。如果代碼A已經(jīng)完美優(yōu)化,在亂序執(zhí)行時需要的重排和依賴處理會更少,相對來說能更好地利用CPU資源。
  • 亂序窗口的限制:亂序執(zhí)行有一個窗口(out-of-order window),只能在窗口范圍內(nèi)的指令中進行重排。如果代碼B的依賴關(guān)系較為密集,亂序窗口可能不足以完全消除停頓。4 E, F: b, ?" h6 P
    ' V; }+ ~) ~* Q! H; Y
    1
    ) v# a2 H9 G3 z3 J- b( X4 t  @6 y是否還有必要對匯編代碼進行優(yōu)化?- a4 w! O, p* n8 Q, z5 R3 n: Q3 [/ K
    亂序執(zhí)行雖然能提升CPU指令吞吐量,但手動優(yōu)化匯編代碼依然很有意義,原因如下:$ _* U  ?! L3 I+ N
  • 減少亂序執(zhí)行引擎的負擔(dān):手動優(yōu)化代碼可以減少亂序執(zhí)行過程中對指令重排和依賴分析的需求,使得CPU執(zhí)行更為高效。例如,如果能夠手動消除依賴關(guān)系或者調(diào)整指令順序,就能減少亂序執(zhí)行的重排開銷。
  • 提升并行性:亂序執(zhí)行的硬件能力是有限的,手動優(yōu)化代碼可以更好地利用多執(zhí)行單元的并行能力。例如,交錯使用整數(shù)運算和浮點運算指令,或者同時執(zhí)行內(nèi)存訪問和計算操作。
  • 硬件特性:不同的CPU對亂序執(zhí)行的支持程度不同,優(yōu)化代碼可以更好地針對特定硬件特性。例如,有些老舊或低功耗CPU的亂序執(zhí)行能力較弱,這種情況下代碼的手動優(yōu)化顯得尤為重要。
    ' D  i# T  w- @; z6 L

    ) @, i2 E4 d. C. k& K1 V; f4 ^2# r% y. q/ z+ M' i+ j+ Y
    在亂序執(zhí)行基礎(chǔ)上進一步優(yōu)化的技巧* @* V8 a! M) n3 W
  • 減少數(shù)據(jù)依賴性:盡量減少指令之間的數(shù)據(jù)依賴,例如通過增加指令間的運算、緩存臨時結(jié)果到寄存器來減少對之前指令結(jié)果的依賴。
  • 減少內(nèi)存訪問延遲:內(nèi)存訪問是指令停頓的主要來源之一,可以通過軟件預(yù)。╬refetching)、增加緩存命中率(合理使用數(shù)據(jù)結(jié)構(gòu))等手段,降低訪問延遲。
  • 避免寄存器重命名沖突:亂序執(zhí)行依賴寄存器重命名技術(shù)來消除偽依賴(false dependency)。可以通過合理安排寄存器使用,減少重命名沖突。
  • 利用指令并行性:在指令間隙中插入無關(guān)操作,使得更多的指令可以并行執(zhí)行。例如,將計算指令與加載指令交錯安排,減少流水線的停頓。
  • 合理使用分支預(yù)測:盡量減少分支錯誤預(yù)測帶來的流水線清空,重排代碼或者避免難以預(yù)測的分支。! A+ V' T) H( n5 T  R. g
    ) X- Y) Q2 S: Z: H# U* q
    雖然亂序執(zhí)行可以大大減少流水線停頓,但代碼優(yōu)化仍能顯著提升性能。對于追求極致性能的場合,手動優(yōu)化匯編代碼依然不可或缺。
    , @8 _# n! V0 R3 z% g, P8 M: x" |- Y: e7 R; X

    & B& K  q  U" H& V- T ; V: |3 z, d* N
    點擊閱讀原文,更精彩~
  • 回復(fù)

    使用道具 舉報

    發(fā)表回復(fù)

    您需要登錄后才可以回帖 登錄 | 立即注冊

    本版積分規(guī)則

    關(guān)閉

    站長推薦上一條 /1 下一條


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表