我如何限制 GCC 中的自动矢量化级别?

How can I limit autovectorization level in GCC?

换句话说,是否可以通过显式内部调用将自动向量化指令(通过 -fast-math -ftree-vectorize 获得)限制为类似 AVX 的东西,同时仍然使用 AVX512

目前,

我没有找到任何选项让 GCC 使用显式 AVX512 内在函数,同时将自身限制为自动矢量化的其他东西。


编辑: 只是为了提供更多背景信息……我有 skylake-avx512 Xeon Gold 节点(2 个 FMA 单元)和一个特定领域的程序。

当我在 一个核心 上使用 -Ofast -march=skylake-avx512 -mtune=skylake-avx512 和 运行 编译时,我获得了 30% 的性能提升-march=haswell ….

当我将核心数增加到所有 24 个核心时-march=haswell …-march=skylake-avx512 … 快两倍 ]!

原因是臭名昭著的核心节流……

但我的特定领域软件已经包含手动矢量化部分。我确实通过 -fno-tree-vectorize -march=skylake-avx512 … 获得了性能胜利(但不足以击败 -march=haswell … 所有 24 个内核和 autovec)因此自动矢量化很重要。

最后,如果我使用 AVX2 优化的手动矢量化内核和 -march=skylake-avx512 …,我也会得到糟糕的性能,因此我认为导致节流的昂贵部分确实是自动-矢量化,因此是我最初的问题。

您可以使用 target 属性在 per-function 基础上启用指令,允许您调用原本不允许的内部函数。

我猜您想根据 CPU 在运行时确定的功能在某些功能的实现之间切换...如果是这样,您可能想看看 target_clones 属性也是如此。