ドライバーの複数プロセッサ グループのサポートをテストするためのブート パラメーター

Windows 7 および Windows Server 2008 R2 は、64 プロセッサを超えるコンピューターをサポートします。 このサポートは、プロセッサ グループの導入によって可能になります。 テスト目的で、グループ サイズを制限することで、複数の論理プロセッサを備えたコンピュータを複数のプロセッサ グループを持つように構成できます。 つまり、64 個以下の論理プロセッサを搭載したコンピューター上で、ドライバーとコンポーネントの複数のプロセッサ グループの互換性をテストできます。

Windows 7 で導入されたプロセッサ グループの概念により、既存の API と DDI は 64 個を超える論理プロセッサを搭載したコンピュータ上で引き続き動作できます。 通常、グループのプロセッサは、64 ビット長のアフィニティ マスクによって表されます。 64 個を超える論理プロセッサを備えたコンピュータには、必然的に複数のグループが存在します。 プロセスが作成されると、そのプロセスは特定のグループに割り当てられます。 デフォルトでは、プロセスのスレッドは同じグループのすべての論理プロセッサ上で実行できますが、スレッド アフィニティは明示的に変更できます。 アフィニティ マスクまたはプロセッサ番号を引数として受け取りますが、グループ番号は受け取らない API または DDI への呼び出しは、呼び出しスレッドのグループ内のプロセッサに影響を与えたり、それらのプロセッサに報告したりすることに限定されます。 GetSystemInfo など、アフィニティ マスクまたはプロセッサ番号を返す API または DDI にも同じことが当てはまります。

Windows 7 以降、アプリケーションまたはドライバーは従来の API を拡張する関数を利用できるようになりました。 これらの新しいグループ対応関数は、グループ番号引数を受け入れてプロセッサ番号またはアフィニティ マスクを明確に修飾するため、呼び出しスレッドのグループ外のプロセッサを操作できます。 従来の API または DDI が関与している場合、コンピューター内の異なるグループで実行されているドライバーとコンポーネント間の相互作用により、バグが発生する可能性があります。 Windows 7 および Windows Server 2008 R2 では、従来のグループ非対応 API を使用できます。 ただし、ドライバーの要件はさらに厳しくなります。 複数のプロセッサ グループを持つコンピュータ上のドライバの機能を正確にするには、プロセッサ グループを伴わずにプロセッサ番号またはマスクをパラメータとして受け入れるか、プロセッサ グループを伴わずにプロセッサ番号またはマスクを返す DDI を置き換える必要があります。 これらの従来の非グループ認識 DDI は、推論されたグループが呼び出しスレッドが意図したものと異なる可能性があるため、複数のプロセス グループを持つコンピューター上で不安定に動作する可能性があります。 したがって、これらのレガシー DDI を使用し、Windows Server 2008 R2 を対象とするドライバーは、インターフェイスの新しい拡張バージョンを使用するように更新する必要があります。 プロセッサー アフィニティ マスクまたはプロセッサー番号を使用する関数を呼び出さないドライバーは、プロセッサーの数に関係なく、正しく動作します。 新しい DDI を呼び出すドライバーは、procgrp.h ヘッダーを組み込み、WdmlibProcgrpInitialize を呼び出し、プロセッサ グループ互換性ライブラリ (procgrp.lib) にリンクすることで、以前のバージョンの Windows で実行できます。

新しいグループ対応 API と DDI の詳細については、ホワイト ペーパー「64 個を超える論理プロセッサを備えたシステムのサポート」をダウンロードしてください。開発者向けのガイドライン

ドライバーおよびコンポーネントの潜在的なプロセッサー グループ関連の問題を特定するには、BCDEdit /set オプションを使用できます。 2 つの BCD ブート構成設定、groupsizemaxgroup を使用すると、複数の論理プロセッサーを備えたコンピューターを構成して、複数のプロセッサー グループをサポートできます。 groupawareオプションは、特定の DDI の動作を変更し、テスト目的でグループ環境を操作します。

グループ サイズを変更して複数のプロセッサ グループを作成する

groupsize オプションは、グループ内の論理プロセッサの最大数を指定します。 デフォルトでは、groupsize オプションは設定されておらず、64 個以下の論理プロセッサを搭載したコンピューターには 1 つのグループ (グループ 0) があります。

物理プロセッサーまたはプロセッサー・パッケージには 1 つ以上のコアまたはプロセッサー・ユニットを含めることができ、それぞれに 1 つまたは複数の論理プロセッサーを含めることができます。 オペレーティング システムは、論理プロセッサを 1 つの論理コンピューティング エンジンとみなします。

複数のプロセッサ グループを作成するには、管理者特権のコマンド プロンプト ウィンドウで BCDEdit /set を実行し、論理プロセッサの合計数よりも小さい新しい maxsize 値を groupsize に指定します。 グループ サイズの設定はテスト用であり、この設定を使用して配送システムを構成しないでください。 maxsize 値は、1 ~ 64 の任意の 2 のべき乗に設定できます。 このコマンドは次の構文を使用します。

bcdedit.exe /set groupsize maxsize

たとえば、次のコマンドは、グループ内のプロセッサの最大数を 2 に設定します。

bcdedit.exe /set groupsize 2

非 NUMA コンピュータに 8 つの論理プロセッサがある場合、groupsizeを 2 に設定すると、それぞれ 2 つの論理プロセッサを持つ 4 つのプロセッサ グループが作成されます。

グループ0: 2 つの論理プロセッサの 1 つのパッケージを含む 1 つの NUMA ノード

グループ1: 2 つの論理プロセッサの 1 つのパッケージを含む 1 つの NUMA ノード

グループ2: 2 つの論理プロセッサの 1 つのパッケージを含む 1 つの NUMA ノード

グループ3: 2 つの論理プロセッサの 1 つのパッケージを含む 1 つの NUMA ノード

設計上、非 NUMA コンピューターには 1 つの NUMA ノードがあるとみなされます。 NUMA ノードは複数のグループにまたがることができないため、コンピューターの再起動後にシステムによってグループごとにノードが作成されます。

groupsize が物理プロセッサ パッケージ (ソケット) 内の論理プロセッサの数より小さい値に設定されている場合、システムは再起動時にパッケージの概念を再定義し、パッケージがグループにまたがらないようにします。 これは、実際に存在するパッケージよりも多くのパッケージがプロセッサ トポロジ API によって報告されることを意味します。 これは、Windows (パッケージ レベル) プロセッサ ライセンスの制限によってgroupsizeが設定されている場合に一部のプロセッサ パッケージが起動できない可能性があることも意味します。

プロセッサー・パッケージ内に複数の NUMA ノードが定義されており、システムがこれらのノードを異なるグループに割り当てる場合、プロセッサー・パッケージはグループにまたがることができます。

Windows では、サポートされるグループの数が制限されています。 この数値は、Windows の新しいバージョンまたはサービス パックのリリースによって変更される可能性があります。 ドライバーまたはコンポーネントは、Windows が一定としてサポートするグループの数に依存しないでください。 Groupsizeブート オプションに小さな値が使用されている場合、グループ数の制限により、起動できる論理プロセッサの数が制限される可能性があります。

テストに使用したgroupsize設定を削除し、グループあたり 64 個の論理プロセッサのデフォルト設定に戻すには、次の BCDEdit コマンドを使用します。

bcdedit.exe /deletevalue groupsize

このコマンドは、groupsizeを 64 に設定するのと同じです。

プロセッサグループの数を最大化する

maxgroup オプションは、複数の論理プロセッサと NUMA ノードを備えたコンピュータ上にプロセッサ グループを作成するもう 1 つの方法です。 maxgroup ブート オプションは、NUMA 以外のコンピュータには影響しません。

グループの数を最大にするには、管理者特権のコマンド プロンプト ウィンドウで BCDEdit /set コマンドを実行します。 このコマンドは次の構文を使用します。

bcdedit.exe /set maxgroup on

たとえば、2 つの NUMA ノード、ノードごとに 1 つのプロセッサ パッケージ、パッケージごとに 4 つのプロセッサ コア、つまり合計 8 つの論理プロセッサを備えたコンピュータを考えてみます。

デフォルトのグループ構成は次のとおりです。

グループ0: 8 つの論理プロセッサ、2 つのパッケージ、2 つの NUMA ノード

bcdedt.exe /set maxgroup on コマンドを入力して再起動すると、コマンドにより次のグループ構成が生成されます。

グループ0: 4 つの論理プロセッサ、1 つのパッケージ、1 つの NUMA ノード

グループ1: 4 つの論理プロセッサ、1 つのパッケージ、1 つの NUMA ノード

NUMA ノードは、グループ数を最大化する方法でグループに割り当てられることに注意してください。

設定をデフォルトに戻すには、次の BCDEdit コマンドを使用します。

bcdedit.exe /set maxgroup off

グループ対応ブート オプションを設定して複数グループの互換性をテストする

Windows 7 および Windows Server 2008 R2 では、ドライバーとコンポーネントが複数のプロセッサ グループ環境で複数のグループを認識するようにする新しい BCD オプション (groupaware) が導入されました。 groupawareオプションは、一連のデバイス ドライバー関数の動作を変更して、ドライバーとコンポーネントのグループ間の非互換性を明らかにするのに役立ちます。 コンピュータにアクティブな論理プロセッサが 64 個以下の場合、グループ対応ブート オプションを groupsize および maxgroup オプションとともにgroupaware使用して、複数のグループとのドライバの互換性をテストできます。

groupawareブート オプションが設定されている場合、オペレーティング システムは、プロセスがグループ 0 以外のグループで開始されることを保証します。 これにより、ドライバーとコンポーネントの間でグループ間の相互作用が生じる可能性が高くなります。 このオプションは、グループを認識しない従来の関数、KeSetTargetProcessorDpc, KeSetSystemAffinityThreadEx, およびKeRevertToUserAffinityThreadExの動作も変更し、アクティブな論理プロセッサを含む最も大きい番号のグループで常に動作するようにします。 これらのレガシ関数のいずれかを呼び出すドライバーは、対応するグループ対応関数 (KeSetTargetProcessorDpcExKeSetSystemGroupAffinityThreadKeRevertToUserGroupAffinityThread) を呼び出すように変更する必要があります、

互換性をテストするには、次の BCDEdit /set コマンドを使用します。

bcdedit.exe /set groupaware on
従来のグループ非対応機能 Windows 7 のグループ認識置換

KeSetTargetProcessorDpc

KeSetTargetProcessorDpcEx

KeSetSystemAffinityThreadEx

KeSetSystemGroupAffinityThread

KeRevertToUserAffinityThreadEx

KeRevertToUserGroupAffinityThread

コンピューターをデフォルト設定にリセットするには、次の BCDEdit コマンドを使用します。

bcdedit.exe /set groupaware off