6

コアごとに 2 つの MPI プロセスを割り当てるにはどうすればよいですか?

たとえば、mpirun -np 4 ./application2 つの物理コアを使用して 4 つの MPI プロセス (コアあたり 2 つのプロセス) を実行する必要があります。Open MPI 1.6 を使用しています。しmpirun -np 4 -nc 2 ./applicationましたが、実行できませんでした。

文句を言うmpirun was unable to launch the specified application as it could not find an executable:

4

5 に答える 5

11

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はの値と同じです。processorapicidprocessor

于 2012-08-01T14:56:01.203 に答える
3

複数のマシンがあるかどうか、およびプロセスをどのように分散させたいかの正確な詳細はわかりませんが、読むことを検討します:

mpirun の man ページ

マニュアルには、プロセスをノード、ソケット、CPU コアなどのさまざまなものにバインドする方法があることが示されています。

CPU コアの 2 倍の数のプロセスを実行するだけで、これが達成されることに注意することが重要です。これは、負荷を共有するためにコアに均等に分散する傾向があるためです。

次のようなことを試してみますが、マニュアルはややあいまいであり、デュアルコアを使用している限り、意図したとおりに動作するかどうかは 100% 確信が持てません。

mpirun -np 4 -npersocket 4 ./application
于 2012-07-31T21:50:29.250 に答える
2

PBS などを使用している場合は、次のような投稿をお勧めします。

qsub -l select=128:ncpus=40:mpiprocs=16 -v NPROC=2048./pbs_script.csh

現在のサブミッションでは、40 個のコアを持つ 128 個の計算ノードを選択し、そのうち 16 個を使用しています。私の場合、ノードごとに 20 個の物理コアがあります。

この提出では、ノードの 40 個のコアすべてをブロックし、誰もこれらのリソースを使用できません。他の人が同じノードを使用してあなたの仕事と競合するのを避けることができます。

于 2015-06-01T14:31:43.457 に答える
2

Open MPI 4.0 を使用して、次の 2 つのコマンドを実行します。

mpirun --oversubscribe -c 8 ./a.out

mpirun -map-by hwthread:OVERSUBSCRIBE -c 8 ./a.out

私のために働いた(私は4つのコアと8つの論理コアを備えたRyzen 5プロセッサを持っています)。

実数の操作を含む do ループでテストしました。-c 4すべての論理スレッドが使用されますが、オプション を使用する場合 (オーバーサブスクライブなし) と比較して計算に 2 倍の時間がかかるため、高速化の利点はないようです。

于 2019-03-07T11:06:25.007 に答える