换句话说,是否可以在通过显式内在调用仍使用-fast-math -ftree-vectorize
的同时,将自动矢量化指令(通过AVX
获取)的上限限制为AVX512
?
在这一刻,
如果没有-mavx512f
,GCC无法说没有avx-512f支持就无法编译我的程序。很公平。
使用-mavx512f
,GCC开始在任何地方使用它。
我没有找到任何让GCC使用显式AVX512
内在函数,同时将其自身限制为自动矢量化的其他选项。
编辑:只是为了给出更多的上下文……我有skylake-avx512
Xeon Gold节点(2个FMA单元)和一个特定于域的程序。
当我使用-Ofast -march=skylake-avx512 -mtune=skylake-avx512
编译并在一个内核上运行时,我获得的性能比-march=haswell …
高30%。
当我将内核数增加到全部24个内核时,-march=haswell …
的速度是-march=skylake-avx512 …
的两倍!
原因是臭名昭著的核心节流……
但是我的特定领域软件已经包含了手工矢量化的部分。我确实在-fno-tree-vectorize -march=skylake-avx512 …
上获得了性能上的胜利(但不足以在所有24个内核和autovec上击败-march=haswell …
),因此自动矢量化非常重要。
最后,如果我将AVX2
优化的手动矢量化内核与-march=skylake-avx512 …
一起使用,我也会得到糟糕的性能,因此,我认为引起节流的昂贵部分的确是自动矢量化,因此这就是我的初衷。
最佳答案
您可以使用target属性在每个函数的基础上启用指令,从而可以调用原本不允许的内在函数。
我猜您想根据运行时确定的CPU功能在某些功能的实现之间进行切换...如果是这样,您可能还希望看看target_clones属性。