スレッド/プロセス アフィニティを適用して、特定のスレッド/プロセスをさまざまな OS の CPU/コアにバインドする方法があることを知っています。CPU ソケット アフィニティを強制する方法があるかどうか疑問に思っています。つまり、スレッド/プロセスを、マルチプロセッサ チップを収容できる CPU ソケットにバインドするように強制します。
チップあたりのマルチプロセッサが日々増加しているという事実により、問題が生じます。
スレッド/プロセス アフィニティを適用して、特定のスレッド/プロセスをさまざまな OS の CPU/コアにバインドする方法があることを知っています。CPU ソケット アフィニティを強制する方法があるかどうか疑問に思っています。つまり、スレッド/プロセスを、マルチプロセッサ チップを収容できる CPU ソケットにバインドするように強制します。
チップあたりのマルチプロセッサが日々増加しているという事実により、問題が生じます。
私があなたの質問を正しく理解している場合、あなたがする必要があるのは、プロセスまたはスレッドのアフィニティをCPU上に存在するコアのセットになるように設定することだけです。
オペレーティングシステムに応じて、この情報を推測する方法があります。たとえば、Linuxでは/proc/cpuinfo
、特定のプロセッサに属するコアを確認できます。
これを行う唯一の方法は、どのスレッド ID がどのソケット (または NUMA ノード) にマップされているかを調べることです。この情報を取得したら、通常のスレッド バインディング メソッドを使用してそれを適用できます。
Linux を使用している場合は、numactl.hライブラリを使用して、どのハードウェア スレッドがどの NUMA ノードに属しているかを調べることができます。NUMA ノードは常にソケットと 1 対 1 であるとは限りませんが、現在までの Core 2 以降のすべての Xeon とすべての Opteron システムに当てはまります。
Windows では、GetNumaNodeProcessorMaskを使用して、ノード上にあるハードウェア スレッドを特定できます。
それらが 1 対 1 でマッピングされない場合 (両方のソケットが同じ NUMA ノードにある Core 2 Xeon など) は、パフォーマンスの観点からはおそらく問題にならないでしょう。各プロセッサの共有キャッシュを細かく管理します。