10

--physcpubind オプションを指定して numactl を使用していました。マニュアルには次のように書かれています。

--physcpubind=cpus, -C cpus
Only execute process on cpus. Etc...

3 つの NUMA ノードを備えた NUMA システムがあり、それぞれに 4 つのコアがあるとします。NUMA ノード 0 には、コア番号として 0、1、2、3 があります。NUMA ノード 1 には 4、5、6、7 があり、NUMA ノード 2 には 8、9、10、11 があります。私の質問は、次のようにプログラムを実行するとしましょう。

export OMP_NUM_THREADS=6
numactl --physcpubind=0,1,4,5,8,9 ./program

つまり、プログラムを 6 つのスレッドで実行し、CPU コア 0、1、4、5、8、9 で実行するように要求しています。たとえば、プログラム中のある時点でスレッド 0 ~ 5 に CPU コア 0、1、4、5、8、9 (setup1) が割り当てられているとします。プログラム実行中の他の時点で、たとえばスレッド 0 が CPU コア 9 などで実行されている可能性はありますか? つまり、CPU コア間でスレッドの移行は行われますか? それとも、スレッドは (setup1 のように) CPU コアに一意にバインドされますか? ありがとう。

4

1 に答える 1

8

numactlのphyscpubindオプションは、プロセスの起動時にプロセスの cpuset (許可された CPU のセット) を変更するsched_setaffinityシステム コールへのインターフェイスである必要があります。各スレッドには独自の cpuset がありますが、すべてのスレッドは親プロセスから cpuset 値を継承します。

そのため、スレッドは cpuset の任意の CPU で実行でき、cpuset の任意の CPU 間での移行が許可されます。

任意のスレッドは、sched_setaffinity またはpthread_setaffinity_np (単一スレッドのアフィニティー変更の Linux 固有のバリアント) を呼び出して、その cpuset を縮小または拡張することさえできます。

スレッドを CPU にバインドする場合は、すべてのスレッドで sched_setaffinity または pthread_setaffinity_np を直接使用するか、OMP ライブラリを介して OpenMP のアフィニティを設定する場合: OpenMP と CPU アフィニティ(例: コマンドを使用) (OpenMP 3.1+)

export OMP_PROC_BIND=true

OMP ライブラリは、omp ライブラリの初期化時にプロセスの cpuset からラウンドロビン方式で CPU を選択すると思います。

古いバージョンの libgomp (GCC で使用される OMP サポート ライブラリ) の場合、次のコマンドで許可された CPU のセットを渡すことができます。

export GOMP_CPU_AFFINITY=0-1,4-5,8-9

PS: スレッドの配置を確認するには、キーでtop「Last CPU used」フィールドを開始して有効f jにし、でスレッド表示をオンにしますH

于 2013-02-07T11:49:39.013 に答える