芭樂永生

2010年2月21日 星期日

REP RET

會有這個 optimization 其實是 AMD 設計 K8 所產生的硬體 Bug
  test eax, eax
  jz Ldone
  mov eax, 1
Ldone:
  ret
在這段 Code 裡面 K8 的 Branch Prediction
並無法預測 Jcc 的目的有 ret 指令
然而 AMD 反而在 Optimization Manual 上面註明此功能
說明在 ret 前面添加 rep (這是 movs 和 SSE2 的 prefix)
有助於提升 Branch Prediction 效能
所以寫 Compiler 的人也很"貼心"的添加這段 Optimization

最好笑的是 K10 的 Optimization Manual 把這部分又改了
請大家改用 ret imm8
(__stdcall 的 calling convention 專用的)

反正硬體問題軟體改善也不是頭一遭
Intel 的 NetBrust 系列的其中一個 Optimization 就是
  add eax, 1
  inc eax
在以往的經驗裡面 inc 會比 add 快許多
原因在於 instruction length 差 4 bytes
然而 NetBrust 完全顛覆掉這個東西
似乎當初設計並沒有注意到這部份
設計上變成 add (0.5 cycles) / inc (1.0 cycles)
也因為 NetBrust 有自己一套 micro-op 的 cache
在 instruction length 影響不大

0 Comments:

張貼留言

<< Home