У меня проблема с циклом, содержащим строку широковещания 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
Он явно останавливается в «середине» цикла. Есть ли у вас какие-либо идеи относительно того, что вызывает эту ошибку или как ее избежать?
Спасибо большое!