哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展? (如何检查 SSE 或 AVX 是不是完全可用?)
Posted
技术标签:
【中文标题】哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展? (如何检查 SSE 或 AVX 是不是完全可用?)【英文标题】:Which versions of Windows support/require which CPU multimedia extensions? (How to check if SSE or AVX are fully usable?)哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展? (如何检查 SSE 或 AVX 是否完全可用?) 【发布时间】:2016-03-08 05:56:23 【问题描述】:到目前为止,我已经设法发现:
SSE 和 SSE2 对于 Windows 8 及更高版本是必需的(当然对于任何 64 位操作系统) AVX 仅受 Windows 7 SP1 或更高版本支持在 Windows 上使用 SSE3、SSSE3、SSE4.1、SSE 4.2、AVX2 和 AVX-512 是否有任何注意事项?
一些说明:如果我使用来自 SSE/AVX 集合之一的指令,我需要它来确定我的程序将在哪些操作系统上运行。
【问题讨论】:
@downvoters:与大多数问题相比,这不是一个糟糕的问题,即使结果证明它没有一个非常有趣的答案。 OP不知道,否则他不会问。很清楚,听起来 OP 试图研究,但不知道要搜索什么(因为他还不知道问题的答案:P)我可以看到关闭它作为 SO / 迁移的题外话SU,但不是反对票。 我不认为这是一个 SU 问题,我怀疑即使是大多数超级用户也会在汇编中编码。我将改写问题以更清楚地表明我正在尝试在我的程序中使用操作码。 我不明白这个问题只是“关于通用计算软件”。它包含“Windows”的唯一事实并不意味着它在这里是题外话。这是一个程序员角度的平台问题,对于SSE/AVX/etc代码的人来说显然很重要。 【参考方案1】:引入新架构状态的扩展需要特殊的操作系统支持,因为操作系统必须在上下文切换时保存/恢复更多数据。因此,从操作系统的角度来看,如果操作系统支持 SSE,那么让用户空间代码运行 SSSE3 指令不需要做任何额外的事情。
SSE、AVX 和 AVX512 是引入新架构状态的扩展。
SSE 引入了xmm
regs(以及用于舍入模式和 FP 异常状态的 MXCSR
)
AVX 引入了ymm
(下半部分是旧的xmm
regs)。
AVX512 引入了zmm
(扩展了x/ymm
regs),并且还将64bit 模式下的vector regs 数量增加了一倍:zmm0-zmm31。 x/y/zmm16..31 只能通过向量指令的 AVX-512 编码(EVEX 前缀)访问,因此有趣的是可以在没有 requiring vzeroupper
和 aren't affected by it.k0..k7
64 位掩码的情况下使用寄存器(或在 Xeon Phi 中没有 AVX-512BW 的 16 位)在 AVX-512 中也是新的。
您可以使用 CPUID 指令以通常的方式检查 CPU 对 SSE 或 AVX 的支持。
为了防止在多任务操作系统上使用新扩展时发生静默数据损坏,该扩展不会在上下文切换时保存/恢复新架构状态,如果操作系统没有 set an OS-support bit in a control register,SSE 指令将作为非法指令出错。因此,矢量扩展在不知道保存/恢复该扩展的必要状态的操作系统上“不起作用”。
对于 SSE,可能没有任何干净的独立于操作系统的方式来检测操作系统已承诺通过设置 CR4.OSFXSR
、CR4.OSXMMEXCPT
等在上下文切换时保存/恢复 SSE 状态. 位,因为even reading a control register is privileged,并且没有反映设置的 CPUID 位。 SSE 支持如此广泛,以至于您必须使用非常古老的版本(或自制)操作系统才能成为问题。
对于 AVX,我们不需要操作系统支持来检测 AVX 是否可用(由硬件支持并由操作系统启用):用户空间可以运行 xgetbv
并检查启用 -功能标志以查看操作系统是否已启用 AVX 指令运行而不会出现故障。
来自Intel's intro to AVX:
验证操作系统是否支持 XGETBV 使用CPUID.1:ECX.OSXSAVE bit 27 = 1
. 同时,验证CPUID.1:ECX bit 28=1
(支持英特尔 AVX)和/或位 25=1(AES 支持)... (以及 FMA、AES 和 PCLMULQDQ 的其他位) 发出XGETBV
,并验证启用功能的掩码 第 1 位和第 2 位是11b
(XMM 状态和 YMM 状态由 操作系统)。
调用 OS 提供的函数来检测 OS 支持可能更容易,而不是使用内联 asm 或功能检测库来完成所有这些工作。例如,Win7SP1 引入了GetEnabledXStateFeatures
以及对 AVX CPU 的支持。 (在没有 SSE 的 CPU 上运行 Win7SP1 是不太可能或不可能的,因此对于 SSE,您只需检查 CPUID 和操作系统版本即可。)
这也被理解为操作系统的上下文切换将正确保存/恢复完整状态的承诺,尽管当然有错误、恶意或深奥的操作系统(可能是协作多任务?)可能会有所不同。对于包括 Windows 在内的主流操作系统,这确实意味着 YMM 寄存器将像您期望的那样保持它们的值。
AVX512 也是如此:您可以检查指令集的 CPUID 功能位,并检查操作系统是否已承诺管理新的架构状态通过启用 XSETBV 中的正确位来切换上下文。 (所以你应该检查 XGETBV)。检查 XGETBV 结果并且 0xE6 等于 0xE6。
【讨论】:
所以这意味着我不能在运行于 2013 年之前发布的操作系统下的程序中使用 AVX512 扩展,因为那是它被宣布的时候。你知道哪些 Windows 版本会收到更新,使它们能够正确处理 zmm 寄存器吗? 其实你应该使用IsProcessorFeaturePresent
和GetEnabledXStateFeatures
,因为它们不仅告诉你CPU特性是否存在,还告诉你操作系统是否支持。如果在 CPU 中检测(比如说)AVX 支持,然后使用 AVX 指令,就会发现您的 AVX 状态在每次上下文切换时都会损坏,因为操作系统不支持 AVX 上下文切换。
@RaymondChen 其实并没有你想象的那么糟糕。处理器强制执行它。如果程序在 XSAVE 位未设置时尝试执行 AVX 指令,则会发出非法指令异常。默认情况下 XSAVE 位未设置以实现向后兼容性。一旦操作系统设置它,它就“接受了合同”,它将在上下文切换中保持 ymm 状态。然后处理器会让你执行 AVX 指令。
替换全功能查询的函数是IsProcessorFeaturePresent。它来自旧操作系统(至少从 WinNT4/Win98 开始就存在)。但它可能不支持检测旧操作系统中的某些功能;例如在 Windows 2000 中它不支持检测 SSE2,而如果 SSE2 存在于 CPU 中,则可以使用。
IsProcessorFeaturePresent
的 AVX/AVX2 标志未记录在案,因此不确定它们需要什么操作系统。它使__cpuid
+_xgetvb
更具吸引力的解决方案。 (也不想向其他可能可移植的代码部分添加 API 调用)以上是关于哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展? (如何检查 SSE 或 AVX 是不是完全可用?)的主要内容,如果未能解决你的问题,请参考以下文章
Windows操作系统中有哪些种磁盘格式,不同磁盘格式的区别是啥。