Потоки OpenMP не активируются при запуске с mpirun - PullRequest
0 голосов
/ 03 апреля 2020

При попытке запустить гибридное приложение 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 с тем же результатом.

Есть идеи, что мне не хватает?

1 Ответ

1 голос
/ 03 апреля 2020

Поведение Open MPI по умолчанию -

  • , связывать задачу MPI на ядре, если есть две или менее задачи MPI
  • , иначе привязывать задачу MPI к сокету

Так что вам действительно нужно

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

, чтобы ваша задача MPI могла получить доступ ко всем ядрам вашего хоста.

...