在Xcode(版本10.1 (10B61))中,我使用宏来检测AVX512支持,如下所示。
#ifdef __SSE4_1__
#error "sse4_1"
#endif
#ifdef __AVX__
#error "avx"
#endif
#ifdef __AVX2__
#error "avx2"
#endif
#ifdef __AVX512__
#error "avx512"
#endif在默认构建设置中,SSE4_1是活动的,但avx、avx2却没有。当我在构建设置中添加-mavx时->Apple-自定义编译器标志-->启用AVX的其他C标记,进一步添加-mavx2来启用AVX和AVX 2E 212,但不知道参数:‘--mavx 512’。如何启用avx512并检测它?似乎没有几个宏可以检测到avx512。
#define __AVX512BW__ 1
#define __AVX512CD__ 1
#define __AVX512DQ__ 1
#define __AVX512F__ 1
#define __AVX512VL__ 1 他们之间有什么区别?
发布于 2019-03-27 07:06:27
AVX512不是一个单独的扩展,并且在这个上下文中没有一个特定的-足够的意义来有用。编译器只处理特定的CPU特性,如AVX512F、AVX512DQ、AVX512CD等。
所有支持任何AVX512扩展的CPU都必须支持AVX512F,即“基础”。AVX512F 是,是其他AVX512扩展所基于的基线AVX512扩展。
在想要使用AVX512本质的代码中,您应该查看AVX-512并选择一组可以在您所关心的CPU上一起使用的扩展,例如F+ CD和VL、DQ、BW当前可用的Skylake。
然后,例如,在对256位向量使用vpermt2w的代码之前使用vpermt2w。__AVX512(anything)__ 意味着 __AVX512F__;,这是您不必单独检查的扩展名。
但是如果你只使用AVX512F指令,他们就会检查这个宏。
您几乎不应该直接使用-mavx512f :使用-march=skylake-avx512、-march=knl或-march=native.或者在将来,-march=icelake或者其他什么。
1/x和1/sqrt(x),其精度是普通AVX512 14位版本的两倍)等重要功能,可能会严重影响性能。特别是,如果您在Xeon上进行任何除法或日志/exp,那么AVX512ER是非常重要的,因为与Skylake相比,在KNL上完全精确的除法非常慢。-march=x意味着-mtune=x,启用与目标相关的调优选项。KNL基本上是带有AVX512的Silvermont,与-mtune=skylake-avx512有显着性差异。这些都是您通常不应该使用-mfma -mavx2 直接的相同原因,但目前没有带有AVX512的CPU,因此只有两个主要的调优目标(Xeon和主流Skylake/CannonLake/冰岛),它们还支持不同的AVX512扩展集。不幸的是,没有-mtune=generic-avx2调优设置,但是Ryzen几乎支持Haswell所做的几乎所有扩展(并且它不会自动使用GCC / clang的扩展,比如事务性内存),所以-march=haswell可能是合理的,可以为带有FMA、AVX2、popcnt等的CPU进行代码调优,而不会在Ryzen上遭受太多的痛苦。
也是相关的(对GCC来说,目前可能不太合拍。)https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html):
-mprefer-vector-width=256自动矢量化与256位矢量在默认情况下,如果大部分时间是在非矢量循环。在Intel Xeon CPU上,使用512位矢量可以显著降低最大涡轮时钟速度(在Skylake-X的i9桌面版本上可能没有那么多),所以在程序的小零散位中使用512位矢量可能是一种净减速。因此,在GCC中,256是默认的tune=skylake-avx512,但是KNL使用512。-mprefer-avx-128是-mprefer-vector-width=选项的旧版本,在AVX512存在之前。使用AVX512掩码寄存器、32个矢量寄存器和/或它的新指令,即使在相同的矢量宽度下也是一个重要的胜利,因此即使您不想使用512位的矢量宽度,启用AVX512也是有意义的。(虽然有时使用内部代码或自动向量化的代码会以更糟糕的方式编译,而不是更好的编译,但如果AVX512比较寄存器版本完全可用的话。但是,随着AVX512的广泛应用,这种反优化的But有望得到解决。)
https://stackoverflow.com/questions/55370864
复制相似问题