openmpi下openmp中的奇怪任务行为

时间:2017-04-26 06:39:47

标签: openmp openmpi

我有i7-5960X CPU,8核+ HT(16线程)。这是一个尝试使用OpenMP和OpenMPI的程序。它呼吁如下:

catch

其中NN1和NN2是变化的。在代码中我有这个:

# mpirun -np <NN1> -x OMP_NUM_THREADS=<NN2> <my_prog>

结果如下:

#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和2 mpi线程,omp_get_num_procs()返回&#34; 2&#34;总是和3及以上它返回&#34; 16&#34;。

问题是:为什么以及如何强制它为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解决此问题。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

默认绑定是  -如果> 2,则class Object[] extends Object implements Cloneable, Serializable { public final int length = /*value from array creation*/; public Object[] clone() { try { return (Object[]) super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e.getMessage()); } } } class User[] extends Object[] { public User[] clone() { return (User[]) super.clone(); } } (例如套接字)  -NUMA domain否则

因此,如果您core,则每个MPI任务将只有一个核心 但是如果您mpirun -np 2 ...,则每个MPI任务都绑定到一个套接字。

例如,在我的VM(1个插槽和4个内核)上

mpirun -np 3 ...

Cpus_allowed_list:0-3

您可以$ mpirun -np 2 grep Cpus_allowed_list /proc/self/status Cpus_allowed_list: 0 Cpus_allowed_list: 1 $ mpirun -np 3 grep Cpus_allowed_list /proc/self/status Cpus_allowed_list: 0-3 Cpus_allowed_list: 0-3 甚至是mpirun -bind-to socket来更改默认的绑定选项。