我如何限制 GCC 中的自动矢量化级别?
How can I limit autovectorization level in GCC?
换句话说,是否可以通过显式内部调用将自动向量化指令(通过 -fast-math -ftree-vectorize
获得)限制为类似 AVX
的东西,同时仍然使用 AVX512
?
目前,
- without
-mavx512f
,GCC 失败说它不能在没有 avx-512f 支持的情况下编译我的程序。很公平。
- 和
-mavx512f
, GCC开始在处. 使用它
我没有找到任何选项让 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 属性也是如此。
换句话说,是否可以通过显式内部调用将自动向量化指令(通过 -fast-math -ftree-vectorize
获得)限制为类似 AVX
的东西,同时仍然使用 AVX512
?
目前,
- without
-mavx512f
,GCC 失败说它不能在没有 avx-512f 支持的情况下编译我的程序。很公平。 - 和
-mavx512f
, GCC开始在处. 使用它
我没有找到任何选项让 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 属性也是如此。