gpt4 book ai didi

windows - 哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展? (如何检查 SSE 或 AVX 是否完全可用?)

转载 作者:可可西里 更新时间:2023-11-01 12:46:41 32 4
gpt4 key购买 nike

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

  • SSE 和 SSE2 对于 Windows 8 及更高版本(当然对于任何 64 位操作系统)都是强制性的
  • AVX 仅受 Windows 7 SP1 或更高版本支持

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

一些说明:如果我使用来自 SSE/AVX 集之一的指令,我需要这个来确定我的程序将在哪些操作系统上运行。

最佳答案

引入新架构状态的扩展需要特殊的操作系统支持,因为操作系统必须在上下文切换时保存/恢复恢复更多数据。因此,从操作系统的角度来看,如果操作系统支持 SSE,则无需执行任何额外操作即可让用户空间代码运行 SSSE3 指令。

SSE、AVX 和 AVX512 是引入新架构状态的扩展。

  • SSE 推出了 xmm regs(和 MXCSR 用于舍入模式和 FP 异常状态)
  • AVX 介绍 ymm (下半部分是旧的 xmm regs)。
  • 推出 AVX512 zmm (扩展 x/ymm regs),并且还在 64 位模式下将向量 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。

在不保存/恢复上下文切换的新架构状态的多任务操作系统上使用新扩展时,为了防止静默数据损坏,如果操作系统没有,SSE 指令将作为非法指令出错 set an OS-support bit in a control register .因此,矢量扩展在不知道如何保存/恢复该扩展的必要状态的操作系统上“不起作用”。


对于 SSE,可能没有任何干净的独立于操作系统的方法来检测操作系统是否已 promise 通过设置 CR4.OSFXSR 在上下文切换时保存/恢复 SSE 状态, CR4.OSXMMEXCPT等位,因为even reading a control register is privileged ,并且没有反射(reflect)该设置的 CPUID 位。 SSE 支持如此广泛,以至于您必须使用非常古老的版本(或自制软件)操作系统才能解决这个问题。


对于 AVX,我们不需要操作系统支持来检测 AVX 是否可用(由硬件支持并由操作系统启用):用户空间可以运行 xgetbv并检查启用功能标志以查看操作系统是否已启用 AVX 指令以无故障运行。

来自 Intel's intro to AVX :

  • Verify that the operating system supports XGETBV usingCPUID.1:ECX.OSXSAVE bit 27 = 1.
  • At the same time, verify thatCPUID.1:ECX bit 28=1 (Intel AVX supported) and/or bit 25=1 (AESsupported) ... (and other bits for FMA, AES, and PCLMULQDQ)
  • Issue XGETBV, and verify that the feature-enabled maskat bits 1 and 2 are 11b (XMM state and YMM state enabled by theoperating system).

调用操作系统提供的函数来检测操作系统支持可能更容易,而不是使用内联汇编或功能检测库来完成所有这些工作。比如Win7SP1引入了GetEnabledXStateFeatures以及对 AVX CPU 的支持。 (不太可能或不可能找到在没有 SSE 的 CPU 上运行的 Win7SP1,因此对于 SSE,您只需检查 CPUID 和操作系统版本即可。)

这也被理解为操作系统的上下文切换将正确保存/恢复完整状态的 promise ,当然,有缺陷的、恶意的或深奥的操作系统(可能是协作式多任务处理?)可能会有所不同。对于包括 Windows 在内的主流操作系统,这确实意味着 YMM 寄存器将像您期望的那样保持其值。


AVX512 也是如此:您可以检查指令集的 CPUID 功能位,检查操作系统是否已 promise 管理新架构状态通过在 XSETBV 中启用正确的位来进行上下文切换。 (所以你应该检查 XGETBV)。检查 XGETBV 结果和 0xE6 等于 0xE6。

关于windows - 哪些版本的 Windows 支持/需要哪些 CPU 多媒体扩展? (如何检查 SSE 或 AVX 是否完全可用?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34069054/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com