2017-04-21 9 views
1

MPIコードの実行場所を制御しようとしています。行うには ので、いくつかの方法で、タスクセットdplacenumactlまたはよう--bind-にまたは-cpu-設定のmpirunのちょうどのオプションがあります。MPIプロセスをバインドしません。

機械は:2回12cores(ノードあたりそう24コア)

> numactl -H 
    available: 16 nodes (0-15) 
    node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 192 193 194 195 196 197 198 199 200 201 202 203 
    node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 204 205 206 207 208 209 210 211 212 213 214 215 
    node 2 cpus: 24 25 26 27 28 29 30 31 32 33 34 35 216 217 218 219 220 221 222 223 224 225 226 227 
    ... (I reduce the output) 
    node 15 cpus: 180 181 182 183 184 185 186 187 188 189 190 191 372 373 374 375 376 377 378 379 380 381 382 383 
    node distances: 
    node 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 
    0: 10 50 65 65 65 65 65 65 65 65 79 79 65 65 79 79 
    1: 50 10 65 65 65 65 65 65 65 65 79 79 65 65 79 79 
    2: 65 65 10 50 65 65 65 65 79 79 65 65 79 79 65 65 
    3: 65 65 50 10 65 65 65 65 79 79 65 65 79 79 65 65 
    4: 65 65 65 65 10 50 65 65 65 65 79 79 65 65 79 79 
    5: 65 65 65 65 50 10 65 65 65 65 79 79 65 65 79 79 
    6: 65 65 65 65 65 65 10 50 79 79 65 65 79 79 65 65 
    7: 65 65 65 65 65 65 50 10 79 79 65 65 79 79 65 65 
    8: 65 65 79 79 65 65 79 79 10 50 65 65 65 65 65 65 
    9: 65 65 79 79 65 65 79 79 50 10 65 65 65 65 65 65 
10: 79 79 65 65 79 79 65 65 65 65 10 50 65 65 65 65 
11: 79 79 65 65 79 79 65 65 65 65 50 10 65 65 65 65 
12: 65 65 79 79 65 65 79 79 65 65 65 65 10 50 65 65 
13: 65 65 79 79 65 65 79 79 65 65 65 65 50 10 65 65 
14: 79 79 65 65 79 79 65 65 65 65 65 65 65 65 10 50 
15: 79 79 65 65 79 79 65 65 65 65 65 65 65 65 50 10 

の16個のノードは、私のコードは、共有メモリを利用しない、私が使用したい、メモリを共有されていますそれは分散メモリの場合と同じです。しかし、プロセスは移動しすぎてデータから離れすぎているようですので、バインドしてパフォーマンスが向上しているかどうかを確認したいと思います。

私がこれまでに
を試してきた何

古典コールのmpirun -np 64 ./myexec param>の、今、私は最後のノードで実行をバインドしたい

をlogfile.log (...私は主な違いが表示されない)dplaceまたはnumactlで、15に12を言うことができます

のmpirun -np 64 dplace -c144-191,336-383 ./myexec param>のlogfile.log

mpirunの-np 64 numactl --physcpubind = 144-191,336-383 -l ./myexec PARAM> logfile.log

(両者の主な違いは、 '結合した' ことをnumactlの-lでありますメモリは違います)。

したがって、どちらもうまくいき、私が望むところでプロセスが制限されていますBUTそれぞれのプロセスを見てみると、いくつかは同じコアに割り当てられています!彼らはそれぞれコアの50%しか使用していません!これは、使用可能なコアの数がプロセスの数よりも多い場合でも発生します。これはまあまあです。

だから私は、--nooversubscribeのようないくつかののmpirunのoptinを追加しようとするが、それは何も変わりません...私はそれを理解していません。私はまたとバインドしないでください(mpirunとdplace/numactlとの間の競合を避けるために)-cpus-per-proc 1-cpus-1-rank 1 ...それを解決しません。

だから、私は唯一のmpirunオプションを使用してみました

mpirunの-cpu-セット144から191 -np 64 ./myexec param>のlogfile.log

が、-cpu-設定オプションではありません大規模に文書化されており、コアごとに1つのプロセスをバインドする方法は見つけられません。

質問:私が望むコアで、コアごとに1つのプロセスを持つことを手伝ってもらえますか?

答えて

2

numactlコマンドの物理CPUのリストから省略します。これらは2番目のハードウェアスレッドであり、許可されたCPUリスト上にそれらを持つことにより、OSは同じコアの異なるハードウェアスレッド上で2つのプロセスをスケジュールできます。

は一般的に、オープンMPIと、マッピングおよび結合は、2回の別々の操作であり、両方のコア拠点に終ら、以下のオプションが必要です:

--map-by core --bind-to core 

マッパーは、上の最初のコアからデフォルトで起動します最初のソケット。コア選択を制限するには、--cpu-set from-toを渡します。あなたのケースでは、完全なコマンドは次のようになります。

mpirun --cpu-set 144-191 --map-by core --bind-to core -np 64 ./myexec param > logfile.log 

ます。また、バインディングの素敵なグラフィカルな視覚化取得する--report-bindingsオプション渡すことができます(あなたのケースで読むには少し難しいでしょう...)

--nooversubscribeは、ノードに定義されているスロットより多くのプロセスをライブラリが配置しないようにするために使用されます。デフォルトでは、OSによって認識される論理CPUの数だけスロットが存在するため、このオプションを渡すと何も起こりません(64 < 384)。

+0

- スレッドごとに、各コアには2つのスレッドがあります(191を超えるコアはすべて「仮想」スレッドです)。私の場合は、私は64プロセス、12cores以上のCPUが必要なので、私は5.3 cpusが必要です。コミュニケーションコストを減らすために、私は4cpusだけを使うことを考えていましたので、48coresと残りの16cpを仮想マシンに入れました。出来ますか? その他の質問/アドバイス: - from htop私のプロセスは、バインドされているコアの2つのスレッド(たとえば168〜360)の間でジャンプすることがわかりますか?それは普通ですか? - メモリをローカルに強制するためにコマンドラインにnumactl -lを追加することはできますか?それともそれは少ないですか? –

+1

'--report-bindings'がアクティブなときに出力を見ると、' ../BB/../ .. 'のように表示されます。つまり、プロセスは両方のハードウェアスレッドにバインドされています。ハードウェアスレッドがキャッシュ階層全体を共有するので、それらの間の移行は本当に安価です。 '--bind-to hwthread'を使って単一のスレッドだけにバインドすることができますが、それは' --cpu-set'と組み合わせて使用​​するとマッパーを混乱させるかもしれません(少なくとも私のシステムではそうです) –

+0

メモリバインディングでは、Open MPIはCPUバインディングがアクティブになったときにメモリバインディングを実行します。しかし、あなたが確実で具体的にしたいのであれば、あなたのプログラムを 'numactl -m'でラップすることができます。たとえば' mpirun ... -n 12 numactl -m 10 ./myexec param:-n 12 numactl -m 11 ./myexec param:-n 12 numactl -m 12 ./myexec param'。これにより、12のプロセスからなる3つのグループが開始され、それぞれのメモリはノード10,11、および12にバインドされます。プロセスは依然として同じMPIジョブの一部であり、すなわち、「MPI_COMM_WORLD」を共有する。 NUMAノードが各プロセスが実行するノードと一致することを確認してください。 –

関連する問題