2011-12-19 26 views
5

我正在为我的业余操作系统开发CPU检测和一般环境检测代码。是否曾经有过多次需要调用CPUID的情况?这就是说,如果系统有多个内核,操作系统是否需要在每个内核上调用CPUID? NUMA相同。多核上的CPUID/NUMA

这两个AMDIntel CPUID手册目前尚不清楚。有一篇关于osdev wiki的文章,提到调用CPUID为Detecting CPU Topology,但我的阅读不清楚CPUID需要被调用的时间和次数。

+0

我认为CPUID可能异常行为的一种情况是AMD Fusion,它在同一芯片上同时包含CPU和GPU。您需要查看文档以获取更多信息。除此之外,我不明白为什么任何内部CPU内核会显示与另一个内核不同的CPUID。 – Polynomial 2011-12-19 22:20:19

+0

除了给定的答案,多次调用CPUID的另一个原因是在使用rdtsc指令进行性能测量时。你通常在它之前使用cpuid,因为cpuid是一个'序列化'指令,并且防止流水线操作,但是cpuid也有一个不好的习惯,它需要花费更长的时间来执行前几次调用(根据rdtsc上的旧intel手册),所以这是典型的在启动时调用它几次,以确保其速度加快,然后在所有rdtsc调用之前使用它。 – 2012-09-02 18:51:37

回答

3

由于已经差不多一周了,没有人能够回答这个问题(可能是因为假期),我仍然会试着回答这个问题。

我认为答案是肯定的。您可能需要在每个核心上调用CPUID。其中一个原因是,目前并非所有(甚至是x86)系统都是同类的。例如,我读过超频论坛(我找不到链接),可以在某些双路服务器主板上混合使用两个不同的处理器型号。这个人有一个带两个不同速度处理器的双插座1366系统。 (和不同的型号#)

因此,在这种情况下,调用CPUID将取决于线程所在的处理器 - 因此您需要在每个处理器上调用一次以获取所有信息。

在我的一个服务器主板的手册中,它也说明您可以混合使用不同型号的处理器(有一定的限制)。当然,可以混合使用相同处理器型号的两个不同的steppings


仅仅因为这个原因(异构拓扑),已经是有理由需要调用CPUID每个内核。

+0

对不起,很长一段时间的回应,但是我相信这是正确的。骰子上的每个CPU需要提取并存储CPUID信息。 – nixeagle 2012-03-22 21:37:57

+0

那么如果你用不同的指令集在每个CPU的每个内核上成功调用CPUID,会发生什么?即一个CPU具有SSSE3,另一个SSSE4.2。然后,您使用这些信息决定输入一段使用SSE4.2指令的代码。在执行这段代码的过程中,操作系统交换了你的线程,接下来计划它在CPU上只支持SSSE3。然后代码崩溃,执行一个SSE4.1指令。所以,即使在多个内核上调用CPUID也是不够的,在这样做之后,甚至必须设置线程相关性。它是否正确? – Apriori 2014-03-28 17:58:33

+0

@Apriori这听起来极不可能。我知道单个Intel或AMD x86配置可以让你安装不同代CPU的不同指令集。但是,如果你想过分小心,是的,你可以做到这一点。尽管如此,我认为它是过度的。 – Mysticial 2014-03-28 18:02:12