使用Win32 API确定处理器是否为Intel Skylake Gen的最可靠方法是什么?这似乎是一个简单的问题,因为可以检查注册表中CPU的友好名称并获取一些数据,但我发现它不是权威的,并且觉得我缺少一些其他数据存储要查询。
注意:我指定Win32 API既清楚这是Windows,也是为了阻止编写设备驱动程序的答案(通过deviceioctrl / IRP与它们连接就可以了)。
谢谢!
答案 0 :(得分:1)
(回答我自己的问题) 虽然没有使用Windows API的可用方法变得明显,但我在https://en.wikipedia.org/wiki/CPUID找到了很好的总结。
使用CPUID指令,可以根据EAX寄存器中返回的最高支持的特征计数推导出模型;加上供应商(在其他地方返回)。我现在有了一个很好的抽象层。
以下是处理器列表和支持的最高功能:https://en.wikipedia.org/wiki/CPUID
对于Skylake CPU,这是0x16(32)。
历史记录显示这对于CPU模型来说是唯一的(参见链接)。
答案 1 :(得分:1)
最可靠/最直接的方法可能是将CPUID instruction与适当的输入寄存器值一起使用,并解码供应商/系列/型号ID号。
根据http://www.sandpile.org/x86/cpuid.htm,
SKL拥有Family = 0x6(与i686 PPro(P6核心)的每个后代一样)。
SKX模型= 0x55(Skylake-E Xeons,尚未发布AFAIK)
KBL Y / U:型号= 0x8E(Kaby Lake低功耗,双核)
双核桌面i3 CPU可能与四核i5相同,但禁用了2个核心。 (通常是因为制造缺陷会妨碍它作为四核部件出售。)有趣的是,模型#反映了双核芯片与四核芯片融合到双核芯片之间的差异
如果您希望根据Skylake的某些内容启用某些内容,则最好直接检测(使用其他一些CPUID查询)。例如直接检查功能位的指令集扩展。这样,在CPUID显示SKL CPU的VM中,您不会遇到麻烦,但VM不会通过所有指令集扩展。 (例如,有些人不通过AVX传递给客户操作系统。)
但是,如果您在为Haswell vs. Skylake调整的功能版本之间进行选择,这可能会很有用。例如psrlvd ymm, ymm, ymm
在Skylake上是1 uop / 1个循环,但Haswell上有3个uop和3个循环。所以在Haswell上,如果你使用psrld ymm, ymm, xmm
(在xmm reg的low元素中计数),重复移位相同的量(当它不是编译时常量时)会更快,但是Skylake预先广播班次计数并使用可变班次更快。
对前端吞吐量,索引寻址模式的微融合以及在更多端口上运行的指令进行了其他改进,这些改进可能使Skylake与Haswell具有不同的微优化版本的东西变得有用。