到目前为止,我已经设法找到:
对于Windows 8及更高版本(当然对于任何64位操作系统),SSE和SSE2都是必需的
AVX仅受Windows 7 SP1或更高版本支持
有关在Windows上使用SSE3,SSSE3,SSE4.1,SSE 4.2,AVX2和AVX-512的注意事项吗?
一些澄清:如果我使用其中一个SSE/AVX集合的指令,我需要这个来确定我的程序运行的操作系统.
引入新体系结构状态的扩展需要特殊的OS支持,因为操作系统必须保存/恢复在上下文切换上恢复更多数据.因此,从操作系统的角度来看,如果操作系统支持SSE,那么让用户空间代码运行SSSE3指令就没有什么需要做的.
SSE,AVX和AVX512是引入新架构状态的扩展.
SSE引入了xmm regs(以及用于舍入模式和FP异常状态的MXCSR)
AVX推出了ymm(下半部分是旧的xmm regs).
AVX512引入了zmm(扩展了ymm regs),并且在64位模式下也增加了矢量regs的数量:zmm0-zmm31.
您可以使用CPUID指令以常规方式检查SSE或AVX的CPU支持.
为了防止在多任务操作系统上使用新扩展而无法在上下文切换上保存/恢复新体系结构状态时静默数据损坏,如果操作系统尚未设置OS支持位,SSE指令将作为非法指令进行故障控制寄存器.因此,对于不知道保存/恢复该扩展的必要状态的操作系统,向量扩展"不起作用".
对于SSE,可能没有任何干净的操作系统无关的方法来检测该操作系统已承诺保存/上下文切换恢复SSE状态通过设置CR4.OSFXSR
,CR4.OSXMMEXCPT
等位,因为即使读控制寄存器是特权,而且也没有CPUID反映设置的位.在Windows上,您可以使用GetEnabledXStateFeatures
检查操作系统是否知道如何保存/恢复向量寄存器状态.我不确定你在其他操作系统上需要什么; SSE支持是如此普遍,你必须使用一个非常古老的版本(或自制程序)操作系统,这是一个问题.
对于AVX,我们不需要OS支持来检测AVX是否可用(由硬件支持并由OS启用):CPUID包括OSXSAVE功能位,该位将在OS启用AVX时设置.
从英特尔的介绍到AVX:
验证操作系统是否支持使用XGETBV
CPUID.1:ECX.OSXSAVE bit 27 = 1
.同时,验证
CPUID.1:ECX bit 28=1
(支持Intel AVX)和/或位25 = 1(支持AES)... (以及FMA,AES和PCLMULQDQ的其他位)发出
XGETBV
并验证位1和2的启用功能的掩码是否为11b
(操作系统启用的XMM状态和YMM状态).
调用操作系统提供的函数来检测操作系统支持可能更容易,而不是使用内联asm或功能检测库来完成所有这些操作.
对于AVX512也是如此:您可以检查指令集的CPUID功能位,并通过使用XSETBV启用正确的位来检查操作系统是否已承诺在上下文切换上管理新的架构状态.(所以你应该查看XGETBV).