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

Rub*_*ben 6 sse simd avx avx2

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

Pet*_*des 5

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

AVX2绝对暗含AVX1。

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

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


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

但AVX1 确实暗示了的VEX编码支持所有 SSE4.2和更早的SIMD指令,例如vpcmpistrivminss

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

(请注意,MSVC没有太多的SIMD ISA检测宏;它有一个用于AVX,但没有用于所有较早的SSE *扩展。)


请注意,AVX512打破了传统。AVX512F表示支持AVX2及其之前的所有内容,但例如,AVX512DQ不在“ AVX512ER之前”或“之后”。从理论上讲,您可以选择两者都选,也可以都不选。(在实践中,SKYLAKE微架构-X / Cannonlake /等只有一个位与至强披(骑士的降落/骑士的研磨机),超越AVX512F的重叠。 https://en.wikipedia.org/wiki/AVX-512#CPUs_with_AVX- 512

  • 确认你关于 popcnt 有自己的功能位的观点:我查看了 MSVC 的 `std::popcount` 库实现。如果定义了 AVX,则假定 popcnt 内在函数可用。如果未定义 AVX,它将对“__ISA_AVAILABLE_SSE442”的体系结构进行运行时检查。换句话说,如果您以 AVX 为目标,则实现假定隐含 SSE4.2,包括 popcnt。 (2认同)