可以避免死锁的情形 CALL MPI_COMM_RANK(comm, rank, ierr) IF (rank.EQ.0) THEN CALL MPI_SEND(sendbuf, count, MPI_REAL, 1, tag, comm, ierr) CALL MPI_RECV(recvbuf, count, MPI_REAL, 1, tag, comm, status, ierr) ELSE (rank .EQ. 1) CALL MPI_RECV(recvbuf, count, MPI_REAL, 0, tag, comm, status, ierr) CALL MPI_SEND(sendbuf, count, MPI_REAL, 0, tag, comm, ierr) END IF 讲解:
C的完成只需要A完成,而A的完成只要有对应的D存在,则不需要系统提供缓冲区也可以进行,这里恰恰满足这样的条件,因此A总能够完成,因此D也一定能完成。当A和D完成后,B的完成只需要相应的C,不需要缓冲区也能完成,因此B和C也一定能完成,所以说这样的通信形式是安全的。显然A和C,D和B同时互换,从原理上说和这种情况是一样的,因此也是安全的。 |
||||