当前位置:  开发笔记 > 开发工具 > 正文

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

如何解决《哪个版本的Windows支持/需要哪些CPU多媒体扩展?》经验,为你挑选了1个好方法。

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

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

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

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

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



1> Peter Cordes..:

引入新体系结构状态的扩展需要特殊的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).


实际上,您应该使用`IsProcessorFeaturePresent`和`GetEnabledXStateFeatures`,因为它们不仅告诉您CPU功能是否存在,而且还告诉您操作系统是否支持它.在CPU中检测(比方说)AVX支持,然后使用AVX指令,只会发现您的AVX状态在每次上下文切换时都会被破坏,因为操作系统没有AVX上下文切换支持.
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有