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

如何限制GCC中的自动矢量化级别?,gcc,compilation,simd,instruction-set,auto-vectorization,Gcc,Compilation,Simd,Instruction Set,Auto Vectorization,换句话说,在仍然通过显式内在调用使用AVX512时,是否可以将自动矢量化指令(通过-fast math-ftree vectorize获得)限制为类似于AVX 目前, 如果没有-mavx512f,GCC会失败,说它无法在没有avx-512f支持的情况下编译我的程序。很公平 使用-mavx512f,GCC开始在任何地方使用它 我还没有找到任何选项可以让GCC使用显式的AVX512intrinsic,同时将自身限制为自动矢量化的其他内容 编辑:只是为了提供更多的上下文…我有skylake-av

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

目前,

  • 如果没有
    -mavx512f
    ,GCC会失败,说它无法在没有avx-512f支持的情况下编译我的程序。很公平
  • 使用
    -mavx512f
    ,GCC开始在任何地方使用它
我还没有找到任何选项可以让GCC使用显式的
AVX512
intrinsic,同时将自身限制为自动矢量化的其他内容


编辑:只是为了提供更多的上下文…我有
skylake-avx512
Xeon黄金节点(2个FMA单元)和一个特定于域的程序

当我使用
-Ofast-march=skylake-avx512-mtune=skylake-avx512
编译并在一个内核上运行时,我的性能比
-march=haswell…
高出30%

当我将内核数增加到所有24内核时,
-march=haswell…
it
-march=skylake-avx512…
快两倍

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

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


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

您可以使用target属性在每个函数的基础上启用指令,从而允许您调用不允许的intrinsic


我猜您希望根据运行时确定的CPU功能在某些函数的实现之间切换。。。如果是这样,您可能还需要查看target_clones属性。

-mpreferevector width=
。顺便说一下,我建议您使用
-mavx512f
,而不是
-mavx512f
,这样gcc就可以更好地了解AVX512指令的效率。gcc对
tune=generic
skylake-AVX512
的默认值仍然是
-mpreferevector width=256
,所以,在大多数代码中,很多指令仍然是用VEX编码的。除非gcc是哑的并且使用
vmovdqu64 ymm0
时,它本可以使用
vmovdqu ymm
。对于FP代码,AVX512版本没有不同的助记符。但是,如果您需要确保它对某些函数的使用不超过AVX2+FMA+BMI2+任何值(
-march=haswell
),那么这对您没有帮助。TL:DR:您不能,GCC不是这样工作的。无论是否使用内部函数,目标ISA选项都在每个函数级别上。请参阅(并注意注释:确保在足够大的函数上执行此操作,例如,包含一个未在热循环中调用的热循环)@marglisse,当然我实际使用的是
-march=…
(实际目标是
skylake-avx512
):
-mavx512f
只是为了让一切都简短而甜蜜。没有任何黄金模型可以解释AVX turbo缩放将1.3倍的性能优势转变为2倍的性能缺陷:甚至不接近,因此AVX-512缩放不是你观察的主要原因。我想避免更改代码。然而,这证实了我确实没有遗漏文档中的任何内容,并且没有在命令行级别实现自动向量化级别的封顶。