【发布时间】:2011-09-01 13:59:07
【问题描述】:
下面的代码是否可以用来检查 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;
}
【问题讨论】:
-
这似乎是正确的,据我阅读英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷(2A 和 2B):指令集参考,AZ,第 284 页。此外, CPUInfo[2] 的第 9 位表示补充 SSE3 指令。
-
SSE3和AVX(以及CLMUL和MOVD)是不同的功能,它们分别进行测试。来自 Intel 手册(由 Norbert 引用),第 3-189 页:“软件必须在使用该功能之前使用 CPUID 返回的功能标志确认处理器功能是否存在。软件不应依赖于保留所有功能的未来产品." 所以不要仅仅因为SSE3存在就依赖AVX的可用性。 -
另外,CPU 支持不同于操作系统支持。请参阅下面安迪的回答。
-
在
bool bSSE3NewInstructions = (CPUInfo[2] & 0x1) || false;上,你不需要|| false部分:bool bSSE3NewInstructions = (CPUInfo[2] & 0x1);然后你也可以去掉bSSE3NewInstructions变量:return (CPUInfo[2] & 0x1);
标签: c++ sse instruction-set avx cpuid