i7-5960X CPUと8コア+ HT(16スレッド)のスタンドがあります。 OpenMPとOpenMPIの両方を使用しようとするプログラムがあります。それは次のように呼ばれた。openmpiでのopenmpでの奇妙なタスク動作
# mpirun -np <NN1> -x OMP_NUM_THREADS=<NN2> <my_prog>
ここで、NN1およびNN2は変化した。
#pragma omp parallel
nOMP=omp_get_num_threads();
int maxOMP=omp_get_max_threads();
int procOMP=omp_get_num_procs();
printf("OMP version running on %d threads. Max threads=%d, available procs=%d\n", nOMP, maxOMP, procOMP);
ここ結果である:
#1, NN1=2, NN2=2:
OMP version running on 2 threads. Max threads=2, available procs=2
#2, NN1=2, NN2=4:
OMP version running on 4 threads. Max threads=4, available procs=2
#3, NN1=3, NN2=4:
OMP version running on 4 threads. Max threads=4, available procs=16
だから1及び2のMPIスレッドOMP_GET_NUM_PROCSため()は常に3のために、それは「16を返す上に "2" を返すコードで私はこれを持っています"
質問は、1と2 mpiのスレッドに対して、なぜ、正しい値を返すように強制するのですか?
OpenMpiのバージョンは1.10.3、GCCのバージョンは4.8.5、Centos 7 x86_64です。 mpirunのないダイレクトコールも正しいです。
UPD1ここに関連する議論があります:http://forum.abinit.org/viewtopic.php?f=2&t=2782、とにかく答えはありません。
UPD2 openmpi-2.x.xがこれを修正しました。
MPIプロセスと同じ数の印刷行が表示されます。私はあなたがそれらの1つだけを見せているのを見る。 CPUバインディングとハイパースレッディングに関係しています。 mpirun '--bind-to'オプションを使用して、プロセスがCPUコアにどのようにバインドされているかを手動で制御できます。 –
返信ありがとうございます。ログは、ランク#0 mpiスレッドからのみ発生します。どんな束縛もここでは行われなかった。私は本当に "-np 2"のためにそれらを必要としましたが、 "-np 3"はそれ自身で動作しますか? – krege