這似乎是一個recurring problem許多英特爾處理器(除非我錯了,直到Skylake)在將AVX-256指令與SSE指令混合使用時表現不佳。爲什麼SSE指令保留YMM寄存器的高128位?
根據Intel's documentation,這是由於SSE指令被定義爲保留YMM寄存器的高128位,所以爲了能夠通過不使用AVX數據路徑的高128位來節省功耗,CPU在執行SSE代碼時將這些位存儲起來,並在輸入AVX代碼時重新加載它們,存儲和加載代價很高。
但是,我找不到任何明顯的理由或解釋爲什麼SSE指令需要保留這些高128位。通過始終清除YMM寄存器的高128位而不是保留它們,相應的128位VEX指令(使用該指令可以避免性能損失)。在我看來,當Intel定義AVX體系結構,包括將XMM寄存器擴展到YMM寄存器時,他們可能已經簡單地定義了SSE指令也會清除高128位。顯然,由於YMM寄存器是新的,因此可能沒有遺留的代碼會依賴SSE指令來保存這些位,而且在我看來,英特爾可能已經很容易地看到了這一點。
因此,英特爾如何定義SSE指令以保留YMM寄存器的高128位?它有用嗎?
Agner Fog在一個獲得英特爾迴應的問題中有一些洞見:https://software.intel.com/zh-cn/forums/intel-isa-extensions/topic/301853 –
@MichaelPetch:Great find! – Dolda2000