It looks suspicious:
MPI_Isend(bufs1, icnt1, MPI_DOUBLE, iprev, 1, MPI_COMM_WORLD, &ireqs1); MPI_Isend(bufs2, icnt2, MPI_DOUBLE, inext, 1, MPI_COMM_WORLD, &ireqs2); MPI_Irecv(bufr1, N, MPI_DOUBLE, iprev, 1, MPI_COMM_WORLD, &ireqr1); MPI_Irecv(bufr2, N, MPI_DOUBLE, inext, 1, MPI_COMM_WORLD, &ireqr2); MPI_Wait(&ireqs1, &istatus); MPI_Wait(&ireqs2, &istatus); MPI_Wait(&ireqr1, &istatus); MPI_Wait(&ireqr2, &istatus);
I would expect something like:
MPI_Isend(bufs1, icnt1, MPI_DOUBLE, iprev, 1, MPI_COMM_WORLD, &ireqs1); MPI_Isend(bufs2, icnt2, MPI_DOUBLE, inext, 1, MPI_COMM_WORLD, &ireqs2); MPI_Wait(&ireqs1, &istatus); MPI_Wait(&ireqs2, &istatus); MPI_Irecv(bufr1, N, MPI_DOUBLE, iprev, 1, MPI_COMM_WORLD, &ireqr1); MPI_Irecv(bufr2, N, MPI_DOUBLE, inext, 1, MPI_COMM_WORLD, &ireqr2); MPI_Wait(&ireqs1, &istatus); MPI_Wait(&ireqs2, &istatus);
And perhaps the middle two wait () are not needed at all.