program main integer nproc, my_rank, ierr call init(nproc,my_rank) if (my_rank.EQ.0) then call master(nproc) else call slave(my_rank) endif call MPI_Finalize(ierr) stop end c subroutine init(nproc,my_rank) include "mpif.h" integer nproc,my_rank,ierr character*30 nodename integer nchar call MPI_init(ierr) call MPI_Comm_rank(MPI_COMM_WORLD,my_rank,ierr) call MPI_Comm_size(MPI_COMM_WORLD,nproc,ierr) call MPI_Get_processor_name(nodename,nchar,ierr) write(*,*) 'my_rank=',my_rank,'processor=',nodename return end c subroutine master(nproc) include "mpif.h" integer nproc,ierr,idest,itag,status(MPI_STATUS_SIZE) real*8 a, b, c nproc1=nproc-1 do i=1,nproc1 a=dfloat(i) b=dfloat(i*i) idest=i itag=10 call MPI_Send(a,1,MPI_DOUBLE_PRECISION,idest,itag, & MPI_COMM_WORLD,ierr) itag=20 call MPI_Send(b,1,MPI_DOUBLE_PRECISION,idest,itag, & MPI_COMM_WORLD,ierr) enddo do i=1,nproc-1 isrc=i itag=110 call MPI_RECV(a,1,MPI_DOUBLE_PRECISION,isrc, & itag,MPI_COMM_WORLD,status,ierr) itag=120 call MPI_RECV(b,1,MPI_DOUBLE_PRECISION,isrc, & itag,MPI_COMM_WORLD,status,ierr) itag=130 call MPI_RECV(c,1,MPI_DOUBLE_PRECISION,isrc, & itag,MPI_COMM_WORLD,status,ierr) write(*,*) 'slave #',isrc,'a=',a,'b=',b,'c=',c enddo return end c subroutine slave(my_rank) include "mpif.h" integer status(MPI_STATUS_SIZE) real*8 a, b, c itag=10 isrc=0 call MPI_RECV(a,1,MPI_DOUBLE_PRECISION,isrc, & itag,MPI_COMM_WORLD,status,ierr) itag=20 call MPI_RECV(b,1,MPI_DOUBLE_PRECISION,isrc, & itag,MPI_COMM_WORLD,status,ierr) c=a+b itag=110 idest=0 call MPI_Send(a,1,MPI_DOUBLE_PRECISION,idest,itag, & MPI_COMM_WORLD,ierr) itag=120 call MPI_Send(b,1,MPI_DOUBLE_PRECISION,idest,itag, & MPI_COMM_WORLD,ierr) itag=130 call MPI_Send(c,1,MPI_DOUBLE_PRECISION,idest,itag, & MPI_COMM_WORLD,ierr) return end