以下代码对检查 CPU 是否支持 SSE3 指令集有效吗?
使用 IsProcessorFeaturePresent()
函数显然在 Windows XP 上不起作用。
bool CheckSSE3()
{
int CPUInfo[4] = {-1};
//-- Get number of valid info ids
__cpuid(CPUInfo, 0);
int nIds = CPUInfo[0];
//-- Get info for id "1"
if (nIds >= 1)
{
__cpuid(CPUInfo, 1);
bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false;
return bSSE3NewInstructions;
}
return false;
}
原文由 Stiefel 发布,翻译遵循 CC BY-SA 4.0 许可协议
我创建了一个 GitHub repro,它将检测所有主要 x86 ISA 扩展的 CPU 和操作系统支持: https ://github.com/Mysticial/FeatureDetector
这是一个较短的版本:
首先,您需要访问 CPUID 指令:
然后您可以运行以下代码:
请注意,这仅检测 CPU 是否支持指令。要实际运行它们,您还需要有操作系统支持。
具体来说,需要操作系统支持:
ymm
寄存器的指令。有关如何检测到这一点,请参阅 Andy Lutomirski 的答案。zmm
和掩码寄存器的指令。检测操作系统对 AVX512 的支持与 AVX 相同,但使用标志0xe6
而不是0x6
。