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

哪些版本的Windows支持/需要哪些CPU多媒体扩展?,windows,assembly,sse,avx,avx512,Windows,Assembly,Sse,Avx,Avx512,到目前为止,我已设法发现: SSE和SSE2对于Windows 8及更高版本是必需的(当然对于任何64位操作系统也是如此) AVX仅受Windows 7 SP1或更高版本支持 在Windows上使用SSE3、SSSE3、SSE4.1、SSE4.2、AVX2和AVX-512是否有任何注意事项 一些说明:如果我使用SSE/AVX集合中的指令,我需要这个来确定我的程序将运行在什么OSs上。引入新体系结构状态的扩展需要特殊的操作系统支持,因为操作系统必须在上下文开关上保存/恢复更多数据。因此,从操作

到目前为止,我已设法发现:

  • SSE和SSE2对于Windows 8及更高版本是必需的(当然对于任何64位操作系统也是如此)
  • AVX仅受Windows 7 SP1或更高版本支持
在Windows上使用SSE3、SSSE3、SSE4.1、SSE4.2、AVX2和AVX-512是否有任何注意事项


一些说明:如果我使用SSE/AVX集合中的指令,我需要这个来确定我的程序将运行在什么OSs上。

引入新体系结构状态的扩展需要特殊的操作系统支持,因为操作系统必须在上下文开关上保存/恢复更多数据。因此,从操作系统的角度来看,如果操作系统支持SSE,那么让用户空间代码运行SSSE3指令不需要做任何额外的事情

SSE、AVX和AVX512是引入新体系结构状态的扩展

  • SSE引入了xmm REG(以及用于舍入模式和FP异常状态的MXCSR)
  • AVX引入了ymm(下半部分是旧的xmm注册表)
  • AVX512引入了zmm(扩展了ymm REG),并在64位模式下将矢量REG的数量增加了一倍:zmm0-zmm31

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

在多任务操作系统上使用新的扩展时,如果没有在上下文交换机上保存/恢复新的体系结构状态,为防止静默数据损坏,如果操作系统没有保存/恢复新的体系结构状态,则SSE指令会作为非法指令出错。因此,向量扩展在不知道如何保存/恢复扩展所需状态的操作系统上“不起作用”


对于SSE,可能没有任何干净的独立于操作系统的方法来检测操作系统是否承诺通过设置
CR4.OSFXSR
CR4.OSXMMEXCPT
等位来保存/恢复上下文交换机上的SSE状态,因为没有反映该设置的CPUID位。在Windows上,您可以使用
GetEnabledXStateFeatures
检查操作系统是否知道如何保存/恢复向量寄存器状态。我不确定你在其他操作系统上需要什么;SSE支持是如此广泛,以至于您必须使用非常古老的版本(或自制)操作系统才能解决这一问题


对于AVX,我们不需要操作系统支持来检测AVX是否可用(由硬件支持并由操作系统启用):CPUID包含一个OSXSAVE功能位,该功能位将在操作系统启用AVX时设置

发件人:

  • 使用验证操作系统是否支持XGETBV
    CPUID.1:ECX.OSXSAVE bit 27=1
  • 同时,验证
    CPUID.1:ECX位28=1(支持英特尔AVX)和/或位25=1(AES)
    支持)。。。(以及用于FMA、AES和PCLMULQDQ的其他位)
  • 发出
    XGETBV
    ,并验证已启用功能的掩码 第1位和第2位为
    11b
    (XMM状态和YMM状态由 操作系统)
调用操作系统提供的函数来检测操作系统支持可能更容易,而不是使用内联asm或功能检测库来完成这一切



AVX512也是如此:您可以检查指令集的CPUID功能位,并检查操作系统是否承诺通过在XSETBV中启用正确的位来管理上下文交换机上的新体系结构状态。(所以你应该向XGETBV查询)。

@downVorters:与大多数人相比,这不是一个糟糕的问题,即使它没有一个非常有趣的答案。警察不知道,否则他不会问的。很明显,这听起来像OP试图研究,但不知道搜索什么(因为他还不知道问题的答案:P)我可以将其视为SO/migrate to SU的离题,但不是反对票。我不认为这是SU问题,我怀疑汇编编码是即使是最超级用户也会做的事情。我将改写这个问题,以便更清楚地说明我正在试图在我的程序中使用操作码。我不明白这个问题怎么只是“关于通用计算软件”。它包含“窗口”的唯一事实并不意味着它在这里是离题的。从程序员的角度来看,这是一个关于平台的问题,对于那些使用SSE/AVX/etc编写代码的人来说,这显然是很重要的。因此,这意味着我不能在2013年之前发布的操作系统下运行的程序中使用AVX512扩展,因为它是在2013年之前发布的。您知道哪些Windows版本将接收更新以使其正确处理zmm寄存器吗?实际上,您应该使用
IsProcessorFeaturePresent
GetEnabledXStateFeatures
,因为它们不仅告诉您CPU功能是否存在,还告诉您操作系统是否支持它。如果在CPU中检测(比如)AVX支持,然后使用AVX指令,结果却发现您的AVX状态在每次上下文切换时都会损坏,这将是不好的,因为操作系统不支持AVX上下文切换。@Alexey:在英特尔宣布后,一个经过充分测试的实现需要时间才能准备就绪。AVX512仍然没有出现在任何出售的普通CPU中,只有骑士的许多核心部件。无论如何,我不知道Windows的AVX512支持会是什么样子。添加操作系统支持以保存/恢复额外状态非常容易。只需为XSAVE/XRSTOR再设置几个功能位,CPU就会保存额外的状态。@RaymondChen它并不像你想象的那么糟糕。处理器执行它。如果程序在未设置XSAVE位的情况下尝试执行AVX指令,则会发出非法指令异常。默认情况下,为了向后兼容,XSAVE位未设置。一旦操作系统设置了它,它就“接受了契约”,即它将在上下文切换中保留ymm状态。然后处理器会让你执行AVX指令。@Mysticial:谢谢,我一直想回来纠正这个问题,因为我知道Intel确实制造了一个独立于操作系统的处理器