换句话说,是否可以在通过显式内在调用仍使用-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属性。

10-05 19:49