运行 和 mpi运行 时 OpenMP 线程未激活

OpenMP threads not activating when run with mpirun

在尝试 运行 混合 MPI/OpenMP 应用程序时,我意识到 OpenMP 线程数始终为 1,即使我导出 OMP_NUM_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;
    }
}

我使用 g++:

编译代码
g++ -fopenmp main.cpp

OMP_NUM_THREADS 仍然设置为 36。当我 运行 代码只有:

time ./a.out

我得到了大约 6 秒的 运行 时间,并且 htop 显示了使用本地节点的所有 36 个内核的命令,正如预期的那样。当我 运行 它与 mpirun:

time mpirun -np 1 ./a.out

我得到的 运行 时间为 3 分 20 秒,htop 显示该命令仅在一个核心上使用。我也试过使用 mpirun -np 1 -x OMP_NUM_THREADS=36 ./a.out 但结果是一样的。

我正在使用 GCC 9.2.0 和 OpenMPI 4.1.0a1。由于这是开发人员版本,我也尝试使用 OpenMPI 4.0.3 得到相同的结果。

知道我错过了什么吗?

Open MPI 的默认行为是

  • 如果有两个或更少的 MPI 任务,则在核心上绑定一个 MPI 任务
  • 否则将 MPI 任务绑定到套接字

所以你真的应该

mpirun --bind-to none -np 1 ./a.out

因此您的 MPI 任务可以访问主机的所有内核。