Как запустить гибридный код MPI и OpenMp в кластере - PullRequest
0 голосов
/ 23 сентября 2018

Я работал над гибридным распараллеливанием кода умножения матриц для моего задания.Цель состоит в том, чтобы распределить строки в узлах для передачи сообщений, и внутри каждого узла применить OpenMp для дальнейшего разделения строк.Также мы пытаемся запустить наш кластер колледжа, каждый узел которого имеет 16 базовых архитектур и имеет 4 узла.Теперь, когда код запускается, он должен быть таким, чтобы было 4 узла, и каждый должен порождать 4 потока OpenMP.Но он не работает в 4 потоках, и во время отладки мы обнаружили, что каждый узел выполняет код только в 1 потоке.Мы нашли это, посмотрев на вывод использования ЦП командой top.Когда на одном узле я запускаю только код OpenMP, загрузка процессора кажется равной 400%, то есть каждый поток работает параллельно, а не одновременно.Переходя к среде mpi, я использую архитектуру Intel 64 и команду mpirun, которую я использовал для запуска кода:

**mpirun** -np 4 -machinefile ./machines hyb 

, где машины - это файл, который содержит сведения о процессорах в кластерах.Это так:

gics1 slots=1
gics2 slots=1 
gics3 slots=1
gics4 slots=1

В качестве примера кода я поместил другой код, и помощь в его запуске на кластере была бы признательна.

#include <mpi.h>
#include <omp.h>
#include <stdio.h>

int main() {
    MPI_Init(NULL, NULL);

    int world_rank, WORLD_SIZE;
    MPI_Comm_size(MPI_COMM_WORLD, &WORLD_SIZE);
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);

    omp_set_num_threads(4);
    #pragma omp parallel num_threads(4)
    {
    int i;
    int a;
    for(i = 0; i < 10000000000; i++) {
        a = (a + 1)    % 100;
    }
        printf("MPI Rank: %d OMP Rank: %d\n", world_rank, 
            omp_get_thread_num());
    }

    MPI_Finalize();
}

Соответствующий код OpenMp

#include <omp.h>
#include <stdio.h>

int main() {

    omp_set_num_threads(4);
    #pragma omp parallel num_threads(4)
    {
    int i;
    int a;
    for(i = 0; i < 1000000000; i++) {
        a = (a + 1) % 100;
    }
        printf("OMP Rank: %d\n", omp_get_thread_num());
    }

    // MPI_Finalize();
    return 0;
}

Код OpenMp работает на 400% загрузки ЦП, но не на гибридной.

...