Я новичок в MPI, и у меня возникли проблемы с реализацией mpirun на кластере узлов Mac OS X, работающих под управлением Snow Leopard. У меня проблема MPI_Barrier()
. У меня есть простая функция, показанная ниже, которая отлично работает. Однако, когда я добавляю команду MPI_Barrier()
в конце условия, родительский узел останавливается. Один из процессоров проходит мимо команды барьера, в то время как другой остается застрявшим. Я надеялся, что кто-нибудь может дать мне быстрый обходной путь или, возможно, предложить какой-то способ, которым моя сетевая среда не позволяет команде работать должным образом.
int main (int argc, char **argv)
{
int me, np, q, sendto;
double t0, t1;
MPI_Status status;
MPI_Init(&argc, &argv);
t0 = MPI_Wtime();
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Commm_rank(MPI_COMM_WORLD,&me);
if (np%2 == 1) return 0;
if (me%2 == 1) {sendto = me - 1;}
else {sendto = me + 1;}
if (me%2 == 0) {
MPI_Send(&me, 1, MPI_INT, sendto, me, MPI_COMM_WORLD);
MPIRecv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD, &status);
} else {
MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD,&status);
MPI_Send(&me,1,MPI_INT,sendto,me,MPI_COMM_WORLD);
}
printf("Send %d to proc %d, received %d from proc %d\n",me,sendto,q,sendto);
t1 = MPI_Wtime();
printf("Timing is %g",t1-10);
MPI_Finalize();
return 0;
}