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

最佳答案

支持最新的Intel 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(或虚拟机),但它不接受SSE4.2指令的非VEX旧版SSE编码,例如pcmpistri,但是我认为您违反了英特尔对AVX的保证功能位暗示。不确定是否正式将其记录在手册中,但是大多数软件都会假定这样做。
但是AVX1确实暗示支持所有SSE4.2和更早的SIMD指令的VEX编码,例如 vpcmpistri vminss
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

10-08 19:51