Ограничить количество трансляций в кластере? - PullRequest
0 голосов
/ 04 мая 2018

У меня проблема с циклом, содержащим строку широковещания mpi. После 1000-й итерации широковещательная линия останавливает или останавливает выполнение (предположительно, ожидая передачи).

См. Следующий код:

#include <stdio.h>
#include <string.h>
#include "mpi.h"

int main(int argc, char* argv[]){
    int  aa = 0, size = 10000;
    int  my_rank; /* rank of process */
    int  smessage = 9, rmessage = 9;        /* storage for message */

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

    if(my_rank !=0) {
        for(aa=1;aa<size;aa++) {
            MPI_Bcast(&rmessage, 1, MPI_INT, 0, MPI_COMM_WORLD);
            printf("rec message(i=%d)=%d\n", aa, rmessage);
        }
    }
    else {
        for(aa=1;aa<size;aa++) {
            smessage=aa;
            printf("send message(i=%d)=%d\n", aa, smessage);
            MPI_Bcast(&smessage, 1, MPI_INT, 0, MPI_COMM_WORLD);
        }
    }
    MPI_Finalize();
    return 0;
}

когда я запускаю его с

mpicc -openmp -fopenmp example_code.c -o example_prog
mpirun -n 3 example_prog

Я получаю ожидаемый результат (с некоторыми перестановками)

sent message(i=1)=1
rec message(i=1)=1
rec message(i=1)=1
...
sent message(i=9999)=9999
rec message(i=9999)=9999
rec message(i=9999)=9999

Однако, когда я отправляю его в мой университетский кластер, используя sbatch SLURM и скрипт, содержащий

mpirun -n 3 --loadbalance --cpus-per-proc 24 ./example_prog

(я использую OpenMPI 1.6.5) Я получаю программу, либо зависшую в середине цикла, либо автоматически завершаемую обработчиком задания. Выход

sent message(i=1)=1
rec message(i=1)=1
rec message(i=1)=1
...

rec message(i=9999)=999
rec message(i=9999)=999
sent message(i=9999)=1000

Он явно останавливается в «середине» цикла. Есть ли у вас какие-либо идеи относительно того, что вызывает эту ошибку или как ее избежать?

Спасибо большое!

...