【问题标题】:What is the /d2vzeroupper MSVC compiler optimization flag doing?/d2vzeroupper MSVC 编译器优化标志在做什么?
【发布时间】:2021-11-17 23:44:35
【问题描述】:

/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,任何地方都没有文档。它在做什么?

【问题讨论】:

标签: c++ visual-studio visual-c++ compiler-flags amd-processor


【解决方案1】:

TL;DR:当使用 /favor:AMD64 时添加 /d2vzeroupper 以避免 SSE 代码在当前 AMD CPU 和 Intel CPU 上的性能非常差。


通常/d1... 和/d2... 是用于调整编译器行为的“秘密”(未记录)MSVC 选项。 /d1... 适用于编译器前端,/d2... 适用于编译器后端。


/d2vzeroupper 启用编译器生成的vzeroupper 指令

更多信息请参见Do I need to use _mm256_zeroupper in 2021?。

通常是默认设置。您可以通过/d2vzeroupper- 禁用它。见这里:https://godbolt.org/z/P48crzTrb

/favor:AMD64 开关抑制了vzeroupper,所以/d2vzeroupper 启用它。


原因:当前 AMD 优化指南(可从AMD site 获得;直接pdf 链接)建议:

2.11.6 混合 AVX 和 SSE

当 SSE 和 AVX 指令的高 128 位混合使用时,会有很大的损失。 YMM 寄存器包含非零数据。向任一方向过渡都会导致微故障 溢出或填充所有 16 个 YMM 寄存器的高 128 位。大约有100个周期 惩罚信号和处理此故障。为了避免这种惩罚,VZEROUPPER 或 VZEROALL 转换时应使用指令清除所有 YMM 寄存器的高 128 AVX 代码转 SSE 或未知代码

较旧的 AMD 处理器不需要 vzeroupper,因此 /favor:AMD64 对其进行了优化,尽管会惩罚 Intel CPU。来自MS docs:

/favor:AMD64

(仅限 x64)为支持 64 位扩展的 AMD Opteron 和 Athlon 处理器优化生成的代码。优化后的代码可以在所有 x64 兼容平台上运行。使用 /favor:AMD64 生成的代码可能会导致支持 Intel64 的 Intel 处理器的性能下降。

【讨论】:

  • 有趣,谢谢!您是否知道 AMD 建议在 MSVC 上手动指定 /d2vzeroupper 如果默认启用它有什么意义?这似乎有点奇怪。您确定在所有代码上不添加 /d2vzeroupper 与添加 /d2vzeroupper 具有完全相同的效果吗?
  • @JohnAl 我做了更多的实验并编辑了我的答案。现在它应该有意义了
  • @JohnAl:/favor:AMD64 是一个整体调整选项(如gcc -mtune=znver1),它可能具有更多效果,例如为内联和循环展开决策启发式设置值。 AMD CPU(直到并包括至少 Zen 1;IDK Zen2 如何处理事情,因为它具有完整的 256 位宽 SIMD 寄存器条目和执行单元)没有 SSE/AVX 转换惩罚,因此不需要 vzeroupper性能原因。但如果没有vzeroupper,您的代码可能在 Intel CPU 上运行非常很差,因此 AMD 可能会建议制作通常可用的二进制文件。
  • @JohnAl:或者这可能表明当前的 AMD CPU确实需要vzeroupper 来避免 SSE/AVX 转换惩罚,就像带有 AVX 的 Intel CPU。
  • @JohnAl 因为现在很明显该建议适用于当前的 AMD,我创建了 Dev Com 问题以使 /favor:AMD64 不跳过 vzeroupper developercommunity.visualstudio.com/t/…
猜你喜欢
  • 2013-12-05
  • 2011-10-05
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多