我有一个包含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
但是,当我使用SLURM的sbatch和包含
的脚本将其发送到我的大学集群时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
它明显停在循环的“中间”。您是否对导致此错误的原因或如何避免此错误有任何想法?
非常感谢你!