我有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解决此问题。
答案 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
来更改默认的绑定选项。