複数のプロセッサ

複数のプロセッサが搭載されたコンピューターは、通常、non-uniform memory access (NUMA) と対称型マルチプロセッシング (SMP) の2つのアーキテクチャのいずれかで設計されています。

NUMA コンピューターでは、各プロセッサは他の部分よりもメモリの一部に近いため、メモリの一部の部分に対するメモリアクセスが他の部分よりも速くなります。 NUMA モデルでは、システムは、使用されているメモリに近いプロセッサ上のスレッドのスケジュールを試行します。 NUMA の詳細については、「 Numa Support」を参照してください。

SMP コンピューターでは、2つ以上の同一のプロセッサまたはコアが、1つの共有メインメモリに接続します。 SMP モデルでは、任意のスレッドを任意のプロセッサに割り当てることができます。 そのため、SMP コンピューター上のスレッドのスケジュール設定は、1つのプロセッサを搭載したコンピューター上のスレッドのスケジュール設定に似ています。 ただし、スケジューラにはプロセッサのプールがあるため、スレッドが同時に実行されるようにスケジュールすることができます。 スケジュールは、スレッドの優先度によって決定されますが、このトピックで説明するように、スレッドアフィニティとスレッドに最適なプロセッサを設定することによって影響を受けることがあります。

スレッドアフィニティ

スレッドアフィニティ は、特定のプロセッサのサブセット上でスレッドを強制的に実行します。 スレッド関係を設定することは、通常は避ける必要があります。これは、スレッド間でスレッドを効果的にスケジュールするために、スケジューラの機能が妨げられる可能性があるためです。 これにより、並列処理によって生成されるパフォーマンスの向上が低下する可能性があります。 スレッドアフィニティの適切な使用方法は、各プロセッサをテストすることです。

システムは、プロセッサ関係マスクと呼ばれるビットマスクとの関係を表します。 Affinity mask は、システム内のプロセッサの最大数のサイズです。ビットはプロセッサのサブセットを識別するように設定されています。 最初に、システムはマスク内のプロセッサのサブセットを決定します。

GetProcessAffinityMask関数を呼び出すことにより、プロセスのすべてのスレッドの現在のスレッドアフィニティを取得できます。 プロセスのすべてのスレッドに対してスレッドアフィニティを指定するには、 SetProcessAffinityMask 関数を使用します。 スレッドアフィニティを1つのスレッドに設定するには、 SetThreadAffinityMask 関数を使用します。 スレッドアフィニティは、プロセスアフィニティのサブセットである必要があります。

64を超えるプロセッサを搭載したシステムでは、affinity mask は最初に1つのプロセッサグループのプロセッサを表します。 ただし、スレッドアフィニティを別のグループのプロセッサに設定すると、プロセスの関係マスクが変更されます。 詳細については、「 プロセッサグループ」を参照してください。

スレッドに最適なプロセッサ

スレッドの理想的なプロセッサ を指定すると、スケジューラは、可能な場合は、指定されたプロセッサでスレッドを実行します。 スレッドに対して優先プロセッサを指定するには、 SetThreadIdealProcessor 関数を使用します。 これによって、理想的なプロセッサが選択されることは保証されませんが、スケジューラに役立つヒントが提供されます。 64を超えるプロセッサを搭載したシステムでは、 SetThreadIdealProcessorEx 関数を使用して、特定のプロセッサグループで優先プロセッサを指定できます。

NUMA のサポート

プロセッサ グループ