openmpi下openmp中的奇怪任务行为

Strange task behavior in openmp under openmpi

我有一个 i7-5960X CPU 支架,8 核 + HT(16 线程)。这是一个尝试同时使用 OpenMP 和 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() returns "2" 始终和对于 3 及以上线程 returns "16".

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

1.10.x 版本中有些错误。 Openmpi-2.x.x 修复此问题。

默认绑定是 - NUMA domain(例如套接字)如果 > 2 - core 否则

所以如果你mpirun -np 2 ...,每个 MPI 任务将只有一个核心 但是如果你 mpirun -np 3 ...,每个 MPI 任务都绑定到一个套接字。

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

$ 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

Cpus_allowed_list: 0-3

您可以 mpirun -bind-to socket 甚至 mpirun -bind-to none 来更改默认绑定选项。