所有支持AVX2的CPU都支持SSE4.2和AVX吗



我计划实现SIMD扩展的运行时检测。如果我发现处理器支持AVX2,它是否也保证支持SSE4.2和AVX?

支持最新的英特尔SIMD ISA扩展意味着支持以前的SIMD扩展

AVX2肯定意味着AVX1。

我认为AVX1意味着所有SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2特征位也必须设置在CPUID中。如果没有正式保证,许多事物都会做出这一假设,违反这一假设的CPU在商业上可能无法通用。

注意,popcnt有自己的特征位,所以理论上,你可以有一个带有AVX2和SSE4.2的CPU,但不能有popcnt,但很多事情都把SSE4.2视为意味着popcnt。因此,更像是可以在没有SSE4.2的情况下宣传对popcnt的支持。


理论上,你可以用AVX制作一个CPU(或虚拟机(,但它不接受像pcmpistri这样的SSE4.2指令的非VEX遗留SSE编码,但我认为你违反了英特尔对AVX功能位含义的保证。不确定这是否正式写在手册中,但大多数软件都会假设这一点。

但是AVX1并不意味着支持所有SSE4.2和早期SIMD指令的VEX编码,例如vpcmpistrivminss

gcc -mavx2明确表示AVX1和以前的扩展,但只会发出使用VEX编码的代码。它将定义__SSE4_2__宏等等,因此GCC确实将AVX2视为暗示早期SSE扩展和popcnt,而不是FMA、AES-NI或PCLMUL。即使对于GCC来说,这些都是单独的功能。

(在实践中,您应该使用gcc -march=nativegcc -march=znver1或其他任何功能来启用CPU的所有功能,为其设置调整选项。不仅仅是-mavx2 -mfma,这会使调整设置处于糟糕的默认值,例如将每个可能未对齐的256位加载/存储拆分为128位的一半。(

(请注意,MSVC没有那么多SIMD ISA检测宏;它有一个用于AVX,但不是用于所有早期的SSE*扩展。MSVC的模型是基于这样的假设设计的,即程序将进行运行时CPU检测,而不是为本地机器编译。尽管MSVC现在有AVX和AVX2选项,可以将它们用作基线。(


注意,AVX512有点打破了传统。AVX512F意味着对AVX2及其之前的一切的支持,但除此之外,AVX512DQ并没有出现;在";或";在";例如AVX512ER。你可以(在理论上(要么两者都有,要么两者都没有。(在实践中,Skylake-X/Cannonlake/等与Xeon Phi(骑士登陆/骑士磨坊(只有一点重叠,超过了AVX512F。https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX-512

如果我们设置编译器选项-mavx2,那么当我们使用AVX或SSE内部函数时,GCC不会给出错误。所以GCC假设AVX2标志的存在足以运行AVX和SSE代码。当然,这并不意味着有人不会用AVX2和SSE来创建CPU。

原则上,CPU可以只支持AVX2,而不支持任何SSE4指令(这并不像听起来那么愚蠢!(。然而,在实践中,如果它支持AVX2,它也支持SSE4。

最新更新