使用mpirun运行时未激活OpenMP线程

使用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

在尝试运行混合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(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