到目前为止,我已经设法找到了:
在Windows上使用SSE3,SSSE3,SSE4.1,SSE 4.2,AVX2和AVX-512有什么警告吗?
一些澄清:如果我使用其中一个SSE / AVX集合的指令,我需要这个来确定我的程序运行的操作系统。
答案 0 :(得分:10)
引入新体系结构状态的扩展需要特殊的OS支持,因为操作系统必须保存/恢复在上下文切换上恢复更多数据。因此,从操作系统的角度来看,如果操作系统支持SSE,那么让用户空间代码运行SSSE3指令就没有什么需要做的。
SSE,AVX和AVX512是引入新架构状态的扩展。
使用CPUID指令以常规方式检查SSE或AVX的CPU支持。
为防止在多任务操作系统上使用新扩展而无法在上下文切换上保存/恢复新架构状态时出现静默数据损坏,如果操作系统没有{{3},SSE指令将作为非法指令进行故障}。因此,对于不知道保存/恢复该扩展所必需状态的操作系统,矢量扩展“不起作用”。
对于SSE,可能没有任何干净的OS独立方式通过设置CR4.OSFXSR
,{{来检测操作系统已承诺在上下文切换上保存/恢复SSE状态 1}}等位,因为set an OS-support bit in a control register,并且没有反映设置的CPUID位。在Windows上,您可以使用CR4.OSXMMEXCPT
检查操作系统是否知道如何保存/恢复向量寄存器状态。我不确定你在其他操作系统上需要什么; SSE的支持是如此普遍,你必须使用一个非常古老的版本(或自制程序)操作系统,这是一个问题。
对于AVX,我们不需要OS支持来检测AVX是否可用(由硬件支持并由OS启用):CPUID包括OSXSAVE功能位,将在OS时设置启用了AVX。
来自even reading a control register is privileged:
- 验证操作系统是否支持使用XGETBV
GetEnabledXStateFeatures
。- 同时验证
CPUID.1:ECX.OSXSAVE bit 27 = 1
(支持Intel AVX)和/或bit 25 = 1(AES 支持)... (以及FMA,AES和PCLMULQDQ的其他位)- 问题
CPUID.1:ECX bit 28=1
,并验证启用了功能的掩码 第1位和第2位是XGETBV
(XMM状态和YMM状态由 操作系统)。
调用操作系统提供的函数来检测操作系统支持可能更容易,而不是使用内联asm或功能检测库来完成所有这些操作。
对于AVX512也是如此:您可以检查指令集的CPUID功能位,和检查操作系统是否已承诺通过启用正确的位来管理上下文切换上的新架构状态在XSETBV中。 (所以你应该查看XGETBV)。