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修复了这个问题。
您应该看到与MPI进程一样多的打印行。我看到你只是展示其中的一个。它可能与CPU绑定和超线程有关。您可以使用mpirun'--bind-to'选项手动控制进程如何绑定到CPU内核。 –
感谢您的回复。日志只从#0级mpi线程开始。这里没有任何约束力。我是否真的需要他们为“-np 2”,而“-np 3”它本身是否工作? – krege