orterun
(Open MPI SPMD / MPMDランチャー。mpirun/mpiexec
これは単なるシンボリックリンクです)プロセスバインディングはある程度サポートされていますが、コアごとに2つのプロセスをバインドできるほどの柔軟性はありません。試してみることができますが-bycore -bind-to-core
、すべてのコアにすでに1つのプロセスが割り当てられているとエラーになります。
ただし、回避策があります。ランクファイルを使用して、各ランクをバインドするスロットを明示的に指定できます。次に例を示します。コアごとに2つのプロセスを持つデュアルコアCPUで4つのプロセスを実行するには、次のようにします。
mpiexec -np 4 -H localhost -rf rankfile ./application
ここrankfile
で、は次の内容のテキストファイルです。
rank 0=localhost slot=0:0
rank 1=localhost slot=0:0
rank 2=localhost slot=0:1
rank 3=localhost slot=0:1
これにより、ランク0と1がプロセッサ0のコア0に配置され、ランク2と3がプロセッサ0のコア1に配置されます。醜いですが機能します。
$ mpiexec -np 4 -H localhost -rf rankfile -tag-output cat /proc/self/status | grep Cpus_allowed_list
[1,0]<stdout>:Cpus_allowed_list: 0
[1,1]<stdout>:Cpus_allowed_list: 0
[1,2]<stdout>:Cpus_allowed_list: 1
[1,3]<stdout>:Cpus_allowed_list: 1
編集:あなたの他の質問から、あなたが実際にハイパースレッドCPUで実行していることが明らかになります。次に、論理プロセッサの物理的な番号付けを理解する必要があります(少し混乱しますが、物理的な番号付けはでprocessor:
報告されているの値に対応します/proc/cpuinfo
)。hwloc
それを取得する最も簡単な方法は、ライブラリをインストールすることです。これは、次のhwloc-ls
ように使用できるツールを提供します。
$ hwloc-ls --of console
...
NUMANode L#0 (P#0 48GB) + Socket L#0 + L3 L#0 (12MB)
L2 L#0 (256KB) + L1 L#0 (32KB) + Core L#0
PU L#0 (P#0) <-- Physical ID 0
PU L#1 (P#12) <-- Physical ID 12
...
物理IDはP#
、括弧内の後にリストされています。8コアの場合、最初のコア(コア0)の2番目のハイパースレッドはID8
を持っている可能性が高いため、ランクファイルは次のようになります。
rank 0=localhost slot=p0
rank 1=localhost slot=p8
rank 2=localhost slot=p1
rank 3=localhost slot=p9
(接頭辞に注意してくださいp
-省略しないでください)
持っていないhwloc
か、インストールできない場合は/proc/cpuinfo
、自分で解析する必要があります。ハイパースレッドの値はphysical id
と同じですが、とcore id
は異なります。物理IDはの値と同じです。processor
apicid
processor