[英]What is the /d2vzeroupper MSVC compiler optimization flag doing?
/d2vzeroupper
MSVC 編譯器優化標志在做什么?
我正在閱讀 AMD 的 Epyc CPU 編譯器選項快速參考指南: https ://developer.amd.com/wordpress/media/2020/04/Compiler%20Options%20Quick%20Ref%20Guide%20for%20AMD%20EPYC% 207xx2%20Series%20Processors.pdf
對於 MSVC,要“針對 64 位 AMD 處理器進行優化”,他們建議啟用/favor:AMD64 /d2vzeroupper
。
/favor:AMD64
正在做什么很清楚,MSVC 文檔中有關於此的文檔。 但我似乎根本找不到/d2vzeroupper
在互聯網上的任何地方被提及,任何地方都沒有文檔。 它在做什么?
TL;DR:當使用/favor:AMD64
添加/d2vzeroupper
以避免 SSE 代碼在當前 AMD CPU 和 Intel CPU 上的性能非常差。
通常/d1...
和/d2...
是用於調整編譯器行為的“秘密”(未記錄)MSVC 選項。 /d1...
適用於編譯器前端, /d2...
適用於編譯器后端。
/d2vzeroupper
啟用編譯器生成的vzeroupper
指令
請參閱我是否需要在 2021 年使用 _mm256_zeroupper? 了解更多信息。
通常它是默認的。 您可以通過/d2vzeroupper-
禁用它。 見這里: https ://godbolt.org/z/P48crzTrb
/favor:AMD64
開關抑制vzeroupper
,因此/d2vzeroupper
啟用它。
最新的 Visual Studio 2022 已修復此問題,因此/favor:AMD64
仍會發出vzeroupper
並且/d2vzeroupper
不需要啟用它。
原因:當前的 AMD 優化指南(可從AMD 網站獲得;直接pdf鏈接)建議:
2.11.6 混合 AVX 和 SSE
當 YMM 寄存器的高 128 位包含非零數據時,混合使用 SSE 和 AVX 指令會有很大的損失。 任一方向的轉換都會導致微故障溢出或填充所有 16 個 YMM 寄存器的高 128 位。 發出信號和處理此故障將有大約 100 個周期的損失。 為避免這種損失,當從 AVX 代碼轉換到 SSE 或未知代碼時,應使用 VZEROUPPER 或 VZEROALL 指令清除所有 YMM 寄存器的高 128 位
較舊的 AMD 處理器不需要vzeroupper
,因此/favor:AMD64
為它們實現了優化,盡管會懲罰 Intel CPU。 來自MS 文檔:
/青睞:AMD64
(僅限 x64)為支持 64 位擴展的 AMD Opteron 和 Athlon 處理器優化生成的代碼。 優化后的代碼可以在所有 x64 兼容平台上運行。 使用 /favor:AMD64 生成的代碼可能會導致支持 Intel64 的 Intel 處理器的性能下降。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.