换句话说,是否可以将自动向量化指令(用-fast-math -ftree-vectorize获得)限制为类似于AVX的指令,同时仍然通过显式的内在调用使用AVX512?
此刻,
-mavx512f,GCC说没有AVX-512 f支持就无法编译我的程序。当然可以。-mavx512f,GCC开始使用everywhere。我没有找到任何选择,让GCC使用明确的AVX512本质,同时限制自己的其他东西,自动向量化。
编辑:只是为了提供更多的上下文…我有skylake-avx512 Xeon节点(2个FMA单元)和一个特定于域的程序.
当我使用-Ofast -march=skylake-avx512 -mtune=skylake-avx512编译并在one核心上运行时,比-march=haswell …多出30%的性能。
当我增加所有24核的核数时,-march=haswell … it 比-march=skylake-avx512 …快两倍!
其原因是臭名昭著的核心节流…。
但我的领域专用软件已经包括了手动矢量化部分。我确实在-fno-tree-vectorize -march=skylake-avx512 …中获得了性能上的胜利(但不足以用所有24个内核和autovec击败-march=haswell … ),因此自动矢量化很重要。
最后,如果我在AVX2-optimized手工矢量化内核中使用-march=skylake-avx512 …,我的性能也会很差,因此,我认为导致节流的昂贵部分确实是自动向量化,因此我最初的问题。
发布于 2019-06-08 15:29:24
您可以使用目标属性在每个函数的基础上启用指令,从而允许您调用否则不允许的本质。
我猜您希望根据在运行时确定的CPU功能在某些功能的实现之间切换。如果是这样的话,您可能也想看看target_clones属性。
https://stackoverflow.com/questions/56506950
复制相似问题