MPI プロセスを (物理) コアのリストに正確にピン留めしたいと考えています。mpirun --help 出力の次の点を参照します。
-cpu-set|--cpu-set <arg0>
Comma-separated list of ranges specifying logical
cpus allocated to this job [default: none]
...
-rf|--rankfile <arg0>
Provide a rankfile file
私のプロセッサのトポロジは次のとおりです。
-------------------------------------------------------------
CPU type: Intel Core Bloomfield processor
*************************************************************
Hardware Thread Topology
*************************************************************
Sockets: 1
Cores per socket: 4
Threads per core: 2
-------------------------------------------------------------
HWThread Thread Core Socket
0 0 0 0
1 0 1 0
2 0 2 0
3 0 3 0
4 1 0 0
5 1 1 0
6 1 2 0
7 1 3 0
-------------------------------------------------------------
Socket 0: ( 0 4 1 5 2 6 3 7 )
-------------------------------------------------------------
ここで、mpirun -np 2 --cpu-set 0,1 --report-bindings ./solverを使用してプログラムを開始すると、プログラムは正常に開始されますが、指定した--cpu-set引数は考慮されません。一方、mpirun -np 2 --rankfile rankfile --report-bindings ./solverでプログラムを開始すると、次の出力が得られます。
[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],0] to slot_list 0
[neptun:14781] [[16333,0],0] odls:default:fork binding child [[16333,1],1] to slot_list 1
実際にtopで確認すると、mpirun が指定されたコアを実際に使用していることがわかります。しかし、この出力をどのように解釈すればよいでしょうか? ホスト ( neptun ) と指定されたスロット ( 0,1 ) を除いて、私には手がかりがありません。私が試した他のコマンドと同じ:
$mpirun --np 2 --bind-to-core --report-bindings ./solver
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],0] to cpus 0001
[neptun:15166] [[15694,0],0] odls:default:fork binding child [[15694,1],1] to cpus 0002
と
$mpirun --np 2 --bind-to-socket --report-bindings ./solver
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],0] to socket 0 cpus 000f
[neptun:15188] [[15652,0],0] odls:default:fork binding child [[15652,1],1] to socket 0 cpus 000f
--bind-to-core を使用すると、topコマンドは再びコア 0 と 1 が使用されていることを示しますが、出力cpus 0001と0002はなぜですか? --bind-to-socketはさらに混乱を引き起こします: 2x 000f ?
最後の段落を使用して、実験から生じた質問を要約します。 - --cpu-setコマンドが機能し
ないのはなぜですか? - --report-bindings
の出力結果をどのように解釈すればよいですか?
敬具