换句话说,是否有可能将使用“-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个核心和自动向量化的“-march = haswell …”),因此自动向量化很重要。
最后,如果我使用针对“AVX2”的手工矢量化内核和“-march = skylake-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个核心和自动向量化的“-march = haswell …”),因此自动向量化很重要。
最后,如果我使用针对“AVX2”的手工矢量化内核和“-march = skylake-avx512…”,我也会得到糟糕的性能,因此我认为导致限制的昂贵部分是自动向量化,因此我的原始问题。
vmovdqu ymm
,而不是vmovdqu ymm{k1}{z}
。显然,如果你确实在指令上使用了掩码,那么你需要使用 EVEX 编码。但是很多时候你并不需要。幸运的是,对于许多指令来说,没有单独的助记符,汇编程序会为像vpaddb ymm1, ymm2, ymm3
这样的指令选择 VEX 和 EVEX 中最短的编码。但整数向量移动或位布尔运算(AVX512 之前没有元素宽度)确实有新的助记符。 - Peter Cordesvblendvps
更好。但许多SIMD循环不受掩码的影响,也不需要条件加载/存储。在最近更新问题之前,完全不清楚OP只是想避免512位向量,而不需要避免EVEX前缀。 - Peter Cordes