是否所有支持AVX2的CPU也都支持SSE4.2和AVX?

时间:2018-11-23 08:45:06

标签: sse simd avx avx2

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

3 个答案:

答案 0 :(得分:4)

支持最新的Intel SIMD ISA扩展意味着支持以前的SIMD。

AVX2绝对暗指AVX1。

我认为AVX1意味着所有SSE / SSE2 / SSE3 / SSSE3 / SSE4.1 / SSE4.2功能位也必须在CPUID中设置。

请注意,popcnt有其自己的功能位,因此从理论上讲,您可以拥有带有AVX2和SSE4.2的CPU,但没有popcnt


理论上,您可以使用AVX制作CPU(或虚拟机),但不接受pcmpistri之类的SSE4.2指令的非VEX编码,但是我认为您违反了英特尔的保证有关AVX功能位的含义。不确定是否将其正式记录在手册中,但是大多数软件会假定这样做。

但是AVX1 确实暗示支持 all SSE4.2和早期SIMD指令的VEX编码,例如vpcmpistrivminss

gcc -mavx2绝对暗含AVX1和以前的扩展名,但只会发出使用VEX编码的代码。但是,它将定义__SSE4_2__宏,依此类推,因此gcc确实将AVX2视为暗示了较早的SSE扩展名和popcnt,而不是AES或PCLMUL。这些是单独的功能,甚至对于GCC也是如此。

(请注意,MSVC没有那么多SIMD ISA检测宏;它具有一个用于AVX的宏,但不是所有早期SSE *扩展的宏。)


请注意,AVX512违反了传统。 AVX512F表示支持AVX2及其之前的所有内容,但例如,AVX512DQ不在“之前”或“之后”提供支持。从理论上讲,您可以选择两者都选,也可以都不选。 (实际上,除AVX512F以外,Skylake-X / Cannonlake /等与至强皮(骑士的着陆点/骑士的磨坊)只有一点重叠。https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX-512

答案 1 :(得分:3)

如果我们设置编译器选项-mavx2,则在使用AVX或SSE内部函数时,GCC不会出错。因此,GCC假定AVX2标志的存在足以运行AVX和SSE代码。当然,有人在没有AVX2和没有SSE的情况下也不会创建CPU,这是不保证的。

答案 2 :(得分:1)

原则上,CPU可以仅支持AVX2,而不支持任何SSE4指令(这听起来并不愚蠢!)。但是实际上,如果它支持AVX2,它也支持SSE4。