使用mpirun运行时未激活OpenMP线程
在尝试运行混合MPI/OpenMP应用程序时,我意识到OpenMP线程数始终为1,即使我导出了使用mpirun运行时未激活OpenMP线程,mpi,openmp,Mpi,Openmp,在尝试运行混合MPI/OpenMP应用程序时,我意识到OpenMP线程数始终为1,即使我导出了OMP\u NUM\u THREAS=36。我构建了一个小C++例子,展示了这个问题: #include <vector> #include "math.h" int main () { int n=4000000, m=1000; double x=0,y=0; double s=0; std::vector< double > shifts
OMP\u NUM\u THREAS=36
。我构建了一个小C++例子,展示了这个问题:
#include <vector>
#include "math.h"
int main ()
{
int n=4000000, m=1000;
double x=0,y=0;
double s=0;
std::vector< double > shifts(n,0);
#pragma omp parallel for reduction(+:x,y)
for (int j=0; j<n; j++) {
double r=0.0;
for (int i=0; i < m; i++){
double rand_g1 = cos(i/double(m));
double rand_g2 = sin(i/double(m));
x += rand_g1;
y += rand_g2;
r += sqrt(rand_g1*rand_g1 + rand_g2*rand_g2);
}
shifts[j] = r / m;
}
}
OMP\u NUM\u THREADS
仍设置为36。当我使用以下命令运行代码时:
time ./a.out
我得到了大约6秒的运行时间,htop
显示了使用本地节点所有36个核心的命令,正如预期的那样。当我使用mpirun
运行它时:
time mpirun -np 1 ./a.out
我得到了3m20s的运行时间,并且htop
显示该命令仅在一个内核上使用。我也尝试过使用mpirun-np1-xomp\u NUM\u THREADS=36./a.out
,但结果是一样的
我使用的是GCC 9.2.0和OpenMPI 4.1.0a1。因为这是一个开发人员版本,所以我也尝试了OpenMPI4.0.3,得到了相同的结果
知道我遗漏了什么吗?OpenMPI的默认行为是
- 如果有两个或更少的MPI任务,则在core上绑定MPI任务
- 否则,将MPI任务绑定到套接字
mpirun --bind-to none -np 1 ./a.out
因此,您的MPI任务可以访问主机的所有核心。谢谢!这就解决了问题。我没有提到这一点,但几个月前,混合MPI/OpenMP在没有该标志的情况下运行良好(我认为使用3.x版)。是否默认将MPI任务绑定到4.x中的一个新功能的核心?IIRC,3.x在绑定方面具有相同的行为。也许这可以添加一些进一步的见解:
mpirun --bind-to none -np 1 ./a.out