簡體   English   中英

CMP + JE是否比單個MUL消耗更多的時鍾周期?

[英]Does a CMP+JE consume more clock cycles than a single MUL?

我正在運行x86處理器,但我相信我的問題很籠統。 我對CMP + JE序列與單個MUL操作所消耗的時鍾周期的理論差異感到好奇。

在C偽代碼中:

unsigned foo = 1;    /* must be 0 or 1 */
unsigned num = 0;

/* Method 1: CMP + JE*/
if(foo == 1){
    num = 5;
}

/* Method 2: MUL */
num = foo*5;    /* num = 0 if foo = 0 */

不要太過深入地研究偽代碼,它純粹是在闡明這兩種方法背后的數學邏輯。

我實際比較的是以下兩個指令序列:

方法1:CMP + JE

    MOV EAX, 1    ; FOO = 1 here, but can be set to 0
    MOV EBX, 0    ; NUM = 0

    CMP EAX, 1    ; if(foo == 1)
    JE  SUCCESS   ; enter branch
    JMP FINISH    ; end program

SUCCESS:
    MOV EBX, 5    ; num = 5

FINISH:

方法2:MUL

    MOV EAX, 1    ; FOO = 1 here, but can be set to 0

    MOV ECX, EAX  ; save copy of FOO to ECX
    MUL ECX, 5    ; result = foo*5
    MOV EBX, ECX  ; num = result = foo*5

似乎單個MUL (總共4條指令)比CMP + JE (總共6條指令)效率更高,但是對於指令來說,時鍾周期的消耗是相等的-即,完成一條相同指令所需的時鍾周期數還有其他指示嗎?

如果實際消耗的時鍾周期取決於機器,那么單個MUL通常比大多數處理器上的分支方法快嗎,因為它需要的總指令更少?

現代的CPU性能比僅計算每條指令的周期數復雜得多。 您需要(至少)考慮以下所有因素:

  • 分支預測
  • 指令重新排序
  • 注冊重命名
  • 指令緩存命中/未命中
  • 數據緩存命中/未命中
  • TLB未命中/頁面錯誤

所有這些都會受到周圍代碼的嚴重影響。

因此,從本質上講,幾乎不可能執行這樣的微基准測試並獲得有用的結果!

但是,如果我不得不猜測,我會說沒有JE的代碼通常會更有效,因為它消除了分支,從而簡化了分支預測行為。

通常,在現代x86處理器上, CMPMUL指令都將占用一個整數執行單元一個周期( CMP本質上是一個SUB ,它丟棄結果並僅修改標志寄存器)。 但是,現代x86處理器也具有流水線,超標量和亂序,這意味着性能不僅取決於此基礎周期成本。

如果不能很好地預測分支,則分支錯誤預測損失將淹沒其他因素,並且MUL版本的性能將明顯更好。

另一方面,如果可以很好地預測分支, 並且在隨后的計算中立即使用num ,則分支版本在平均情況下可能會表現更好。 那是因為當正確預測分支時,它可以使用比較結果num的預測值開始推測性地執行下一條指令(而在MUL情況下,隨后使用num將對MUL結果-在退出該結果之前將無法執行)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM