在编译时启用AVX512支持会显著降低性能



我有一个使用静态库的C/C++项目。图书馆是为"天湖"建筑而建的。该项目是一个数据处理模块,即它执行许多算术运算、内存复制、搜索、比较等。

CPU采用Xeon Gold 6130T,支持AVX512。我试图用-march=skylake-march=skylake-avx512编译我的项目,然后与库链接。

在使用-march=skylake-avx512的情况下,与使用-march=skylake构建的项目相比,项目性能显著降低(平均降低30%(。

这怎么解释呢?原因可能是什么?

信息:

  • Linux 3.10
  • gcc 9.2
  • Intel Xeon Gold 6130T

项目性能显著降低(平均降低30%(

在无法轻松矢量化的代码中,零星的AVX指令会在各处向下锁定您的CPU,但不会带来任何好处。在这种情况下,您可能希望完全关闭AVX指令。

参见高级矢量扩展,下行时钟:

由于AVX指令更宽,产生更多热量,英特尔处理器在执行此类指令时可以降低Turbo Boost频率限制。节流分为三个级别:

  • L0(100%(:正常涡轮增压限制
  • L1(~85%(:;AVX增强";限度由256位"软触发";"重";(浮点单位:FP数学和整数乘法(指令。"硬触发";"轻";(所有其他(512位指令
  • L2(约60%(:;AVX-512升压";限制512位重指令软触发。频率转换可以是软的或硬的。硬转换意味着一旦发现这样的指令,频率就会降低;软转换意味着只有在达到匹配指令的阈值数量之后才降低频率。限制是每个线程

时钟下降意味着在具有Intel处理器的混合工作负载中使用AVX可能会导致频率损失;纯";上下文在这些情况下,避免使用宽而重的说明有助于将影响降至最低。AVX-512VL是在AVX-512中仅使用256位操作数的示例,使其成为混合加载的合理默认值。

另请参阅

  • 关于英特尔频率缩放的危险
  • 收集英特尔AVX-512转换
  • 如何修复英特尔

最新更新