5

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 00010002はなぜですか? --bind-to-socketはさらに混乱を引き起こします: 2x 000f ?

最後の段落を使用して、実験から生じた質問を要約します。 - --cpu-setコマンドが機能し
ないのはなぜですか? - --report-bindings の出力結果をどのように解釈すればよいですか?

敬具

4

1 に答える 1