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
来更改默认绑定选项。
我有一个 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
来更改默认绑定选项。