使用 Win32 API 确定处理器是否为 Intel Skylake Gen 的更可靠方法是什么?
What is the more reliable way, using the Win32 API, to determine if a processor is an Intel Skylake Gen?
使用 Win32 API 确定处理器是否为 Intel Skylake Gen 的最可靠方法是什么?这似乎是一个简单的问题,因为可以在注册表中检查 CPU 的友好名称并获取一些数据,但我发现这不够权威,我觉得我缺少其他一些数据存储查询。
注意:我指定 Win32 API 既明确这是 Windows,也阻止涉及编写设备驱动程序的答案(通过 deviceioctrl/IRP 与它们交互)很好)。
谢谢!
(回答我自己的问题)
虽然没有可用的方法使用 Windows API 变得明显,但我在 https://en.wikipedia.org/wiki/CPUID.
找到了很好的总结
使用CPUID指令,可以根据EAX寄存器中返回的最高支持特征数导出模型;加上供应商(在别处返回)。我现在有一个很好的抽象层来处理所有这些。
这是处理器列表和支持的最高功能:https://en.wikipedia.org/wiki/CPUID
对于 Skylake CPUs,这是 0x16 (32)。
历史表明这对于 CPU 个模型是独一无二的(参见 link)。
可能最可靠/最直接的方法是使用 CPUID instruction 和适当的输入寄存器值,并解码 vendor/family/model ID 号。
根据http://www.sandpile.org/x86/cpuid.htm,
SKL 有 Family = 0x6(就像 i686 PPro(P6 核心)的每个后代)。
- SKL Y/U: 型号 = 0x4E(低功耗,双核 i7)
- SKL S/H:型号 = 0x5E(desktop/high-power 笔记本电脑,四核 i3 除外)
SKX 型号 = 0x55(Skylake-E Xeons,尚未发布 AFAIK)
KBL Y/U: model = 0x8E (Kaby Lake 低功耗, 双核)
- KBL S/H:型号 = 0x9E(Kaby Lake desktop/high-power 笔记本电脑,四核 i3 除外)
双核桌面 i3 CPUs 可能与四核 i5 相同,但禁用了 2 个内核。 (通常是因为制造缺陷会阻止它作为四核零件出售。)有趣的是,模型 # 反映了双核硅片与四核芯片融合成双核之间的这种差异.
如果您想根据 Skylake 拥有的东西启用某些东西,最好直接检测它(使用其他一些 CPUID 查询)。例如直接检查指令集扩展的功能位。这样您就不会 运行 在 CPUID 显示 SKL CPU 的 VM 中遇到麻烦,但 VM 不会通过所有指令集扩展。 (例如,有些不通过 AVX 传递给来宾 OS)。
但是,如果您在针对 Haswell 和 Skylake 调整的函数版本之间进行选择,这可能会有用。例如psrlvd ymm, ymm, ymm
在 Skylake 上是 1 微指令/1 个周期,但在 Haswell 上是 3 微指令和 3 个周期。因此,在 Haswell 上,如果使用 psrld ymm, ymm, xmm
(计数在 xmm reg 的低元素中),重复相同数量的移位(当它不是编译时间常数时)会更快,但是Skylake 预广播班次计数并使用可变班次更快。
前端吞吐量、索引寻址模式的微融合以及在更多端口上的指令 运行 还有其他改进,这可能有助于为 Skylake 提供不同的微优化版本对阵哈斯韦尔。
使用 Win32 API 确定处理器是否为 Intel Skylake Gen 的最可靠方法是什么?这似乎是一个简单的问题,因为可以在注册表中检查 CPU 的友好名称并获取一些数据,但我发现这不够权威,我觉得我缺少其他一些数据存储查询。
注意:我指定 Win32 API 既明确这是 Windows,也阻止涉及编写设备驱动程序的答案(通过 deviceioctrl/IRP 与它们交互)很好)。
谢谢!
(回答我自己的问题) 虽然没有可用的方法使用 Windows API 变得明显,但我在 https://en.wikipedia.org/wiki/CPUID.
找到了很好的总结使用CPUID指令,可以根据EAX寄存器中返回的最高支持特征数导出模型;加上供应商(在别处返回)。我现在有一个很好的抽象层来处理所有这些。
这是处理器列表和支持的最高功能:https://en.wikipedia.org/wiki/CPUID
对于 Skylake CPUs,这是 0x16 (32)。
历史表明这对于 CPU 个模型是独一无二的(参见 link)。
可能最可靠/最直接的方法是使用 CPUID instruction 和适当的输入寄存器值,并解码 vendor/family/model ID 号。
根据http://www.sandpile.org/x86/cpuid.htm,
SKL 有 Family = 0x6(就像 i686 PPro(P6 核心)的每个后代)。
- SKL Y/U: 型号 = 0x4E(低功耗,双核 i7)
- SKL S/H:型号 = 0x5E(desktop/high-power 笔记本电脑,四核 i3 除外)
SKX 型号 = 0x55(Skylake-E Xeons,尚未发布 AFAIK)
KBL Y/U: model = 0x8E (Kaby Lake 低功耗, 双核)
- KBL S/H:型号 = 0x9E(Kaby Lake desktop/high-power 笔记本电脑,四核 i3 除外)
双核桌面 i3 CPUs 可能与四核 i5 相同,但禁用了 2 个内核。 (通常是因为制造缺陷会阻止它作为四核零件出售。)有趣的是,模型 # 反映了双核硅片与四核芯片融合成双核之间的这种差异.
如果您想根据 Skylake 拥有的东西启用某些东西,最好直接检测它(使用其他一些 CPUID 查询)。例如直接检查指令集扩展的功能位。这样您就不会 运行 在 CPUID 显示 SKL CPU 的 VM 中遇到麻烦,但 VM 不会通过所有指令集扩展。 (例如,有些不通过 AVX 传递给来宾 OS)。
但是,如果您在针对 Haswell 和 Skylake 调整的函数版本之间进行选择,这可能会有用。例如psrlvd ymm, ymm, ymm
在 Skylake 上是 1 微指令/1 个周期,但在 Haswell 上是 3 微指令和 3 个周期。因此,在 Haswell 上,如果使用 psrld ymm, ymm, xmm
(计数在 xmm reg 的低元素中),重复相同数量的移位(当它不是编译时间常数时)会更快,但是Skylake 预广播班次计数并使用可变班次更快。
前端吞吐量、索引寻址模式的微融合以及在更多端口上的指令 运行 还有其他改进,这可能有助于为 Skylake 提供不同的微优化版本对阵哈斯韦尔。