如何限制GCC中的自动矢量化级别?
换句话说,在仍然通过显式内在调用使用AVX512时,是否可以将自动矢量化指令(通过如何限制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
-fast math-ftree vectorize
获得)限制为类似于AVX
目前,
- 如果没有
,GCC会失败,说它无法在没有avx-512f支持的情况下编译我的程序。很公平李>-mavx512f
- 使用
,GCC开始在任何地方使用它-mavx512f
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缩放不是你观察的主要原因。我想避免更改代码。然而,这证实了我确实没有遗漏文档中的任何内容,并且没有在命令行级别实现自动向量化级别的封顶。