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