|
就是说如果上面的程序没有用sendrecv 的话可以写成下面的形式(1),形式结果也是“对”的,但是不安全的,容易造成死锁, 而形式(2)是安全的不会造成“死锁”,
注意比较两种形式的区别
在比较复杂的情况下很难注意到这些细节,所以,MPI 帮你搞一个他自己去优化通信的形式就是sendrecv
形式(1)
[Fortran] 纯文本查看 复制代码 program main
include 'mpif.h'
integer rank,ierr,status(mpi_status_size)
integer i,j
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,rank,ierr)
selectcase(rank)
case(0)
i=3
j=5
call mpi_send(i,1,mpi_integer,1,99,mpi_comm_world,ierr)
call mpi_recv(j,1,mpi_integer,1,99,mpi_comm_world,status,ierr)
write(*,*)'myid=',rank,i,j
case(1)
i=4
j=6
call mpi_send(i,1,mpi_integer,0,99,mpi_comm_world,ierr) ! 注意此处的顺序和形式(2)不同
call mpi_recv(j,1,mpi_integer,0,99,mpi_comm_world,status,ierr) !注意此处的顺序和形式(2)不同
write(*,*)'myid=',rank,i,j
endselect
write(*,1) rank,i,j
1 format(1x,'rank=',i3,'i=',i3,'j=',i3)
call mpi_finalize(ierr)
end
形式(2)
[Fortran] 纯文本查看 复制代码 program main
include 'mpif.h'
integer rank,ierr,status(mpi_status_size)
integer i,j
call mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,rank,ierr)
selectcase(rank)
case(0)
i=3
j=5
call mpi_send(i,1,mpi_integer,1,99,mpi_comm_world,ierr)
call mpi_recv(j,1,mpi_integer,1,99,mpi_comm_world,status,ierr)
write(*,*)'myid=',rank,i,j
case(1)
i=4
j=6
call mpi_recv(j,1,mpi_integer,0,99,mpi_comm_world,status,ierr)
call mpi_send(i,1,mpi_integer,0,99,mpi_comm_world,ierr)
write(*,*)'myid=',rank,i,j
endselect
write(*,1) rank,i,j
1 format(1x,'rank=',i3,'i=',i3,'j=',i3)
call mpi_finalize(ierr)
end
|
|