2011-12-19 76 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