运行 和 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 任务可以访问主机的所有内核。
在尝试 运行 混合 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 任务可以访问主机的所有内核。