在多任务操作系统上使用新扩展时防止静默数据损坏,而不是't save/restore the new architectural state on context switches, SSE instructions fault as illegal instructions if the OS hasn' t set an OS-support bit in a control register . 因此,操作系统上的矢量扩展"don't work"不知道保存/恢复该扩展的必要状态 .
For SSE, there may not be any clean OS-independent way 通过设置 CR4.OSFXSR , CR4.OSXMMEXCPT 等位来检测操作系统是否已承诺在上下文切换时保存/恢复SSE状态,因为even reading a control register is privileged,并且没有反映设置的CPUID位 . 在Windows上,您可以使用 GetEnabledXStateFeatures 来检查操作系统是否知道如何保存/恢复向量寄存器状态 . 我必须使用一个非常古老的版本(或自制程序)操作系统来解决这个问题 .
For AVX, we don't need OS support to detect that AVX is usable (由硬件支持并由OS启用):CPUID包括OSXSAVE功能位,该功能位将在OS启用AVX时设置 .
1 回答
引入新体系结构状态的扩展需要特殊的OS支持,因为操作系统必须保存/恢复在上下文切换上恢复更多数据 . 因此,从操作系统的角度来看,如果操作系统支持SSE,那么让用户空间代码运行SSSE3指令就没有什么需要做的 .
SSE,AVX和AVX512是引入新架构状态的扩展 .
SSE引入了xmm regs(和MXCSR用于舍入模式和FP异常状态)
AVX介绍了ymm(下半部分是旧的xmm regs) .
AVX512引入了zmm(扩展ymm regs),并且在64位模式下也增加了矢量regs的数量:zmm0-zmm31 .
您可以使用CPUID指令以常规方式检查SSE或AVX的CPU支持 .
在多任务操作系统上使用新扩展时防止静默数据损坏,而不是't save/restore the new architectural state on context switches, SSE instructions fault as illegal instructions if the OS hasn' t set an OS-support bit in a control register . 因此,操作系统上的矢量扩展"don't work"不知道保存/恢复该扩展的必要状态 .
For SSE, there may not be any clean OS-independent way 通过设置
CR4.OSFXSR
,CR4.OSXMMEXCPT
等位来检测操作系统是否已承诺在上下文切换时保存/恢复SSE状态,因为even reading a control register is privileged,并且没有反映设置的CPUID位 . 在Windows上,您可以使用GetEnabledXStateFeatures
来检查操作系统是否知道如何保存/恢复向量寄存器状态 . 我必须使用一个非常古老的版本(或自制程序)操作系统来解决这个问题 .For AVX, we don't need OS support to detect that AVX is usable (由硬件支持并由OS启用):CPUID包括OSXSAVE功能位,该功能位将在OS启用AVX时设置 .
来自Intel's intro to AVX:
调用操作系统提供的函数来检测操作系统支持可能更容易,而不是使用内联asm或功能检测库来完成所有这些操作 .
对于AVX512也是如此:您可以检查指令集的CPUID功能位,并通过使用XSETBV启用正确的位来检查操作系统是否已承诺管理上下文切换的新架构状态 . (所以你应该查看XGETBV) .