我有一个使用静态库的 C/C++ 项目。该图书馆是为“天湖”建筑而建的。该项目是一个数据处理模块,即它执行许多算术运算、内存复制、搜索、比较等
CPU为Xeon Gold 6130T,支持AVX512。我尝试使用
-march=skylake
和 -march=skylake-avx512
编译我的项目,然后与库链接。
使用
-march=skylake-avx512
时,与使用 -march=skylake
构建的项目相比,项目性能显着下降(平均下降 30%)。
这该如何解释呢?可能是什么原因?
信息:
项目绩效显着下降(平均下降30%)
在无法轻松矢量化的代码中,零星的 AVX 指令会降低 CPU 的频率,但不会带来任何好处。在这种情况下,您可能需要完全关闭 AVX 指令。
请参阅高级矢量扩展,降频:
由于 AVX 指令更宽并产生更多热量,因此英特尔处理器在执行此类指令时会降低 Turbo Boost 频率限制。节流分为三级:
- L0 (100%):正常涡轮增压限制。
- L1 (~85%):“AVX 提升”限制。由 256 位“重”(浮点单元:FP 数学和整数乘法)指令软触发。由“轻”(所有其他)512 位指令硬触发。
- L2 (~60%):“AVX-512 提升”限制。 由 512 位重指令软触发。 频率转换可以是软的或硬的。硬转换是指一旦发现这样的指令就降低频率;软转换意味着仅在达到匹配指令的阈值数量后才降低频率。限制是每个线程。
降频意味着在具有英特尔处理器的混合工作负载中使用 AVX 可能会导致频率损失,尽管它在“纯”环境中速度更快。避免使用宽而重的指令有助于最大限度地减少这些情况下的影响。 AVX-512VL 是在 AVX-512 中仅使用 256 位操作数的示例,使其成为混合负载的合理默认值。
另外,请参阅