首页 文章

哪个版本的Windows支持/需要哪些CPU多媒体扩展? [关闭]

提问于
浏览
8

到目前为止,我已经设法找到:

  • SSE和SSE2对于Windows 8及更高版本(当然对于任何64位操作系统)都是必需的

  • AVX仅受Windows 7 SP1或更高版本支持

有关在Windows上使用SSE3,SSSE3,SSE4.1,SSE 4.2,AVX2和AVX-512的注意事项吗?

一些澄清:如果我使用其中一个SSE / AVX集合的指令,我需要这个来确定我的程序运行的操作系统 .

1 回答

  • 10

    引入新体系结构状态的扩展需要特殊的OS支持,因为操作系统必须保存/恢复在上下文切换上恢复更多数据 . 因此,从操作系统的角度来看,如果操作系统支持SSE,那么让用户空间代码运行SSSE3指令就没有什么需要做的 .

    SSE,AVX和AVX512是引入新架构状态的扩展 .

    • SSE引入了xmm regs(和MXCSR用于舍入模式和FP异常状态)

    • AVX介绍了ymm(下半部分是旧的xmm regs) .

    • AVX512引入了zmm(扩展ymm regs),并且在64位模式下也增加了矢量regs的数量:zmm0-zmm31 .


    您可以使用CPUID指令以常规方式检查SSE或AVX的CPU支持 .

    在多任务操作系统上使用新扩展时防止静默数据损坏,而不是't save/restore the new architectural state on context switches, SSE instructions fault as illegal instructions if the OS hasn' t set an OS-support bit in a control register . 因此,操作系统上的矢量扩展"don't work"不知道保存/恢复该扩展的必要状态 .


    For SSE, there may not be any clean OS-independent way 通过设置 CR4.OSFXSRCR4.OSXMMEXCPT 等位来检测操作系统是否已承诺在上下文切换时保存/恢复SSE状态,因为even reading a control register is privileged,并且没有反映设置的CPUID位 . 在Windows上,您可以使用 GetEnabledXStateFeatures 来检查操作系统是否知道如何保存/恢复向量寄存器状态 . 我必须使用一个非常古老的版本(或自制程序)操作系统来解决这个问题 .


    For AVX, we don't need OS support to detect that AVX is usable (由硬件支持并由OS启用):CPUID包括OSXSAVE功能位,该功能位将在OS启用AVX时设置 .

    来自Intel's intro to AVX

    使用CPUID.1验证操作系统是否支持XGETBV:ECX.OSXSAVE位27 = 1.同时,验证CPUID.1:ECX位28 = 1(支持Intel AVX)和/或位25 = 1(支持AES)...(以及FMA,AES和PCLMULQDQ的其他位)发出XGETBV,并验证位1和2的启用功能的掩码是否为11b(操作系统启用XMM状态和YMM状态) .

    调用操作系统提供的函数来检测操作系统支持可能更容易,而不是使用内联asm或功能检测库来完成所有这些操作 .


    对于AVX512也是如此:您可以检查指令集的CPUID功能位,并通过使用XSETBV启用正确的位来检查操作系统是否已承诺管理上下文切换的新架构状态 . (所以你应该查看XGETBV) .

相关问题