啟動參數以測試多個處理器群組支援的驅動程式
Windows 7 和 Windows Server 2008 R2 提供超過 64 個處理器的電腦支援。 引進 處理器群組可以支援這項支援。 為了進行測試,您可以藉由限制群組大小,將具有多個邏輯處理器的任何電腦設定為擁有多個處理器群組。 這表示您可以在具有 64 個或更少邏輯處理器的電腦上測試多個處理器群組相容性的驅動程式和元件。
注意 Windows 7 引進的 處理器群組概念可讓現有的 API 和 DIS 繼續在具有超過 64 個邏輯處理器的電腦上運作。 一般而言,群組的處理器會以相似性遮罩來表示,其長度為 64 位。 任何具有超過 64 個邏輯處理器的電腦,都必須有一個以上的群組。 建立進程時,會將進程指派給特定群組。 根據預設,進程執行緒可以在相同群組的所有邏輯處理器上執行,雖然可以明確變更執行緒親和性。 呼叫任何採用親和性遮罩或處理器編號作為引數的 API 或 DDI,但不會呼叫群組編號,僅限於影響或報告呼叫執行緒群組中的這些處理器。 同樣地,傳回相似性遮罩或處理器編號的 API 或 DIS 也是如此,例如 GetSystemInfo。
從 Windows 7 開始,應用程式或驅動程式可以使用擴充舊版 API 的函式。 這些新的群組感知函式接受群組編號引數,以明確限定處理器編號或親和性遮罩,因此可以操作呼叫執行緒群組外部的處理器。 當涉及舊版 API 或 DIS 時,電腦內在不同群組中執行的驅動程式和元件之間的互動,可能會造成 Bug。 您可以在 Windows 7 和 Windows Server 2008 R2 上使用舊版非群組感知 API。 不過,驅動程式需求更嚴格。 若要在具有一個以上處理器群組的電腦上安裝驅動程式的功能正確性,您必須取代接受處理器編號或遮罩做為參數的任何 DDI,而不需要隨附處理器群組,或傳回處理器編號或遮罩,而不需要隨附處理器群組。 這些舊版非群組感知 DIS 可以在具有多個進程群組的電腦上執行不定期執行,因為推斷的群組可能與呼叫執行緒所預期的群組不同。 因此,使用這些舊版 DIS 且以 Windows Server 2008 R2 為目標的驅動程式必須更新為使用新擴充版本的介面。 不論處理器數目為何,未呼叫任何使用處理器親和性遮罩或處理器編號之函式的驅動程式都會正確運作。 呼叫新 DIS 的驅動程式可以在舊版 Windows 上執行,方法是包括 procgrp.h 標頭、呼叫 WdmlibProcgrpInitialize,以及針對 處理器群組相容性程式庫 連結 (procgrp.lib) 。
如需有關新群組感知 API 和 DIS 的詳細資訊,請下載 支援超過 64 個邏輯處理器的系統白皮書:開發人員指導方針。
若要協助識別驅動程式和元件中潛在的處理器群組相關問題,您可以使用 BCDEdit /set 選項。 兩個 BCD 開機組態設定 groupsize 和 maxgroup可以設定具有多個邏輯處理器的任何電腦,以支援多個處理器群組。 groupaware選項會修改特定 DIS 的行為,並操作群組環境以供測試之用。
藉由變更群組大小來建立多個處理器群組
groupsize選項會指定群組中的邏輯處理器數目上限。 根據預設,不會設定 groupsize 選項,而且任何具有 64 個或更少邏輯處理器的電腦都有一個群組,也就是群組 0。
注意 實體處理器或處理器套件可以有一或多個核心,或處理器單位,每個處理器都可以包含一或多個邏輯處理器。 作業系統會將邏輯處理器視為一個邏輯運算引擎。
若要建立多個處理器群組,請在提升許可權的 [命令提示字元] 視窗中執行BCDEdit /set,並為小於邏輯處理器總數的群組指定新的maxsize值。 請注意,群組大小設定是用於測試,您不應該使用此設定來設定出貨系統。 maxsize值可以設定為介於 1 到 64 之間的任何 2 冪。 此命令使用下列語法:
bcdedit.exe /set groupsize maxsize
例如,下列命令會將群組中的處理器數目上限設定為 2。
bcdedit.exe /set groupsize 2
如果非 NUMA 電腦有 8 個邏輯處理器,請將 群組大小 設定為 2 會建立 4 個處理器群組,每個處理器各有 2 個邏輯處理器。
群組 0:1 個 NUMA 節點,包含 2 個邏輯處理器的 1 個套件
群組 1:1 個 NUMA 節點,包含 2 個邏輯處理器的 1 個套件
群組 2:1 個 NUMA 節點,包含 2 個邏輯處理器的 1 個套件
群組 3:1 個 NUMA 節點,包含 2 個邏輯處理器的 1 個套件
根據設計,非 NUMA 電腦會被視為有一個 NUMA 節點。 因為 NUMA 節點無法跨越群組,所以系統會在您重新開機電腦之後,為每個群組建立一個節點。
如果 groupsize 設定為小於實體處理器套件中邏輯處理器數目的值, (通訊端) ,則系統會在重新開機時重新定義封裝的概念,讓封裝不會跨越群組。 這表示處理器拓撲 API 會報告比實際存在的套件更多。 這也表示 Windows (套件層級) 處理器授許可權制可能會防止某些處理器套件在設定 群組時 啟動。
如果處理器套件內已定義多個 NUMA 節點,且系統會將這些節點指派給不同的群組,處理器套件就可以跨越群組。
Windows 會限制支援的群組數目。 這個數位可能會隨著新版本的 Windows 或 Service Pack 版本而變更。 驅動程式或元件不應該相依于 Windows 支援的群組數目,因為是常數。 群組數目的限制可能會限制在將小型值用於 群組化 開機選項時,允許啟動的邏輯處理器數目。
若要移除您用於測試的 群組化 設定,並返回每個群組 64 個邏輯處理器的預設設定,請使用下列 BCDEdit 命令。
bcdedit.exe /deletevalue groupsize
此命令相當於將 群組設定 為 64。
最大化處理器群組的數目
maxgroup選項是在具有多個邏輯處理器和 NUMA 節點的電腦上建立處理器群組的另一種方式。 maxgroup開機選項不會影響非 NUMA 電腦。
若要最大化群組數目,請在提升許可權的命令提示字元視窗中執行 BCDEdit /set 命令。 此命令使用下列語法:
bcdedit.exe /set maxgroup on
例如,假設有 2 個 NUMA 節點的電腦、每個節點 1 個處理器套件,以及每個套件 4 個處理器核心,總共有 8 個邏輯處理器。
預設群組組態為:
群組 0:8 個邏輯處理器、2 個套件、2 個 NUMA 節點
如果您在命令上輸入 bcdedt.exe /set maxgroup ,後面接著重新開機,此命令會產生下列群組組態:
群組 0:4 個邏輯處理器、1 個套件、1 個 NUMA 節點
群組 1:4 個邏輯處理器、1 個套件、1 個 NUMA 節點
請注意,NUMA 節點會以最大化群組數目的方式指派給群組。
若要變更回預設設定,請使用下列 BCDEdit 命令。
bcdedit.exe /set maxgroup off
藉由設定群組感知開機選項來測試Multiple-Group相容性
Windows 7 和 Windows Server 2008 R2 引進了新的 BCD 選項, (groupaware) ,強制驅動程式和元件知道多個處理器群組環境中的多個群組。 groupaware選項會變更一組設備磁碟機函式的行為,以協助在驅動程式和元件中公開跨群組不相容。 您可以使用 groupaware 開機選項以及 groupsize 和 maxgroup 選項,在電腦有 64 個或更少的使用中邏輯處理器時,測試與多個群組的驅動程式相容性。
設定 groupaware 開機選項時,作業系統可確保進程是在群組 0 以外的群組中啟動。 這會增加驅動程式與元件之間跨群組互動的機會。 此選項也會修改非群組感知、 KeSetTargetProcessorDpc、 KeSetSystemAffinityThreadEx和 KeRevertToUserAffinityThreadEx的舊版函式行為,使其一律在包含作用中邏輯處理器的最高編號群組上運作。 呼叫這些舊版函式的驅動程式應該變更為呼叫其群組感知對應專案, (KeSetTargetProcessorDpcEx、 KeSetSystemGroupAffinityThread和 KeRevertToUserGroupAffinityThread) ,
若要測試相容性,請使用下列 BCDEdit /set 命令。
bcdedit.exe /set groupaware on
舊版非群組感知函式 | Windows 7 群組感知取代 |
---|---|
KeSetTargetProcessorDpc |
KeSetTargetProcessorDpcEx |
KeSetSystemAffinityThreadEx |
KeSetSystemGroupAffinityThread |
KeRevertToUserAffinityThreadEx |
KeRevertToUserGroupAffinityThread |
若要將電腦重設為預設設定,請使用下列 BCDEdit 命令。
bcdedit.exe /set groupaware off