2017-04-26 1 views
1

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がこれを修正しました。

+0

MPIプロセスと同じ数の印刷行が表示されます。私はあなたがそれらの1つだけを見せているのを見る。 CPUバインディングとハイパースレッディングに関係しています。 mpirun '--bind-to'オプションを使用して、プロセスがCPUコアにどのようにバインドされているかを手動で制御できます。 –

+0

返信ありがとうございます。ログは、ランク#0 mpiスレッドからのみ発生します。どんな束縛もここでは行われなかった。私は本当に "-np 2"のためにそれらを必要としましたが、 "-np 3"はそれ自身で動作しますか? – krege

答えて

0

1.10.xバージョンで何らかのエラーが発生しました。 Openmpi-2.x.xはこれを修正します。