複数のプロセッサ
通常、複数のプロセッサを搭載したコンピューターは、非均一メモリ アクセス (NUMA) または対称マルチプロセス (SMP) の 2 つのアーキテクチャのいずれかに対応するように設計されています。
NUMA コンピューターでは、各プロセッサは他のプロセッサよりもメモリの一部に近く、他の部分よりもメモリの一部のメモリ アクセスが高速になります。 NUMA モデルでは、システムは、使用されているメモリに近いプロセッサでスレッドのスケジュールを設定しようとします。 NUMA の詳細については、「 NUMA サポート」を参照してください。
SMP コンピューターでは、2 つ以上の同一のプロセッサまたはコアが 1 つの共有メイン メモリに接続されます。 SMP モデルでは、任意のスレッドを任意のプロセッサに割り当てることができます。 したがって、SMP コンピューターでのスレッドのスケジュール設定は、1 つのプロセッサを搭載したコンピューターでのスレッドのスケジュール設定と似ています。 ただし、スケジューラにはプロセッサのプールがあるため、スレッドを同時に実行するようにスケジュールできます。 スケジュールはスレッドの優先度によって決まりますが、このトピックで説明するように、スレッド アフィニティとスレッドの理想的なプロセッサを設定すると影響を受ける可能性があります。
スレッド アフィニティ
スレッド アフィニティは、 プロセッサの特定のサブセットでスレッドを強制的に実行します。 スレッド アフィニティの設定は、プロセッサ間でスレッドを効果的にスケジュールするスケジューラの機能に干渉する可能性があるため、通常は避ける必要があります。 これにより、並列処理によって生成されるパフォーマンスの向上が低下する可能性があります。 スレッド アフィニティの適切な用途は、各プロセッサをテストすることです。
システムは、プロセッサ アフィニティ マスクと呼ばれるビットマスクとのアフィニティを表します。 affinity mask は、システム内のプロセッサの最大数のサイズであり、プロセッサのサブセットを識別するためにビットが設定されています。 最初に、システムはマスク内のプロセッサのサブセットを決定します。
GetProcessAffinityMask 関数を呼び出すことで、プロセスのすべてのスレッドの現在のスレッド アフィニティを取得できます。 SetProcessAffinityMask 関数を使用して、プロセスのすべてのスレッドのスレッド アフィニティを指定します。 1 つのスレッドのスレッド アフィニティを設定するには、 SetThreadAffinityMask 関数を使用します。 スレッド アフィニティは、プロセス アフィニティのサブセットである必要があります。
64 を超えるプロセッサを持つシステムでは、アフィニティ マスクは最初は 1 つのプロセッサ グループ内のプロセッサを表します。 ただし、スレッド アフィニティは、プロセスのアフィニティ マスクを変更する別のグループ内のプロセッサに設定できます。 詳細については、「 プロセッサ グループ」を参照してください。
スレッド理想プロセッサ
スレッドに適したプロセッサを指定すると、スケジューラは可能な限り、指定されたプロセッサでスレッドを実行します。 スレッドの優先プロセッサを指定するには、 SetThreadIdealProcessor 関数を使用します。 これは、理想的なプロセッサが選択されることを保証するものではありませんが、スケジューラに便利なヒントを提供します。 プロセッサが 64 を超えるシステムでは、 SetThreadIdealProcessorEx 関数を使用して、特定のプロセッサ グループ内の優先プロセッサを指定できます。
関連トピック