簡體   English   中英

/d2vzeroupper MSVC 編譯器優化標志在做什么?

[英]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.

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