При попытке запустить гибридное приложение 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
, я получаю время выполнения 3m20s, и htop
показывает, что команда используется только на одном ядре. Я также пытался использовать mpirun -np 1 -x OMP_NUM_THREADS=36 ./a.out
, но результаты были такими же.
Я использую G CC 9.2.0 и OpenMPI 4.1.0a1. Поскольку это версия для разработчиков, я также пытался с OpenMPI 4.0.3 с тем же результатом.
Есть идеи, что мне не хватает?