2017-04-26 34 views
1

我有一个支持8核+ HT(16线程)的i7-5960X CPU。这是一个试图使用OpenMP和OpenMPI的程序。它称为如下:在openmpi openmpi中的奇怪任务行为

# 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()返回 “2” 总是和3和上面它返回“16 ”。

问题是:为什么以及如何强制它为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进程一样多的打印行。我看到你只是展示其中的一个。它可能与CPU绑定和超线程有关。您可以使用mpirun'--bind-to'选项手动控制进程如何绑定到CPU内核。 –

+0

感谢您的回复。日志只从#0级mpi线程开始。这里没有任何约束力。我是否真的需要他们为“-np 2”,而“-np 3”它本身是否工作? – krege

回答

0

1.10.x版本中存在一些错误。 Openmpi-2.x.x解决了这个问题。