mpi_gather

各プロセスの変数の値を一つの配列に集める

OPT=-r8 -O2 -heap-arrays 1024
FCC=ifort
F90=$(FCC) $(OPT)
F90P=mpiifort $(OPT)
FLIB=
.SUFFIXES : .cc .f90 .o
#all: trace_lorenz96 generate96data
all: mg mg2
mg : mg.o
    $(F90P) $^ -o $@ $(FLIB)
mg2 : mg2.o
    $(F90P) $^ -o $@ $(FLIB)
.f90.o:
    $(F90P) -c $(MOD) $<
.cc.o:
    $(CXX) -c $(MOD) $<
clean :
    rm -f *.o *.mod
program mg
! Description:
!
! Author: am
!
! Host: aofd30
! Directory: /work2/am/12.Work11/31.PF_Sample/13.mpi_renshu
!
! Revision history:
!  2011-04-16 15:57
!    Initial Version
!  use
!  implicit none
  include 'mpif.h'
  integer irecv(3)
  write(*,'(a)')'Program mg starts.'
!  write(*,*)''
  call mpi_init(ierr)
  call mpi_comm_size(mpi_comm_world,nprocs,ierr)
  call mpi_comm_rank(mpi_comm_world,myrank,ierr)
  isend= myrank + 1
  write(*,'(a,2i5)')'myrank,isend= ',myrank,isend
  call mpi_gather(isend,1,mpi_integer,irecv,1,mpi_integer,0, &
 & mpi_comm_world,ierr)
  if(myrank == 0) print *,'irecv = ',irecv
  call mpi_finalize(ierr)
  write(*,'(a,i5)')'Done program mg. myrank= ',myrank
  write(*,*)
end program mg

$ make

make: Warning: File `mg.f90' has modification time 4.2e+02 s in the future

mpiifort -r8 -O2 -heap-arrays 1024 -c mg.f90

mpiifort -r8 -O2 -heap-arrays 1024 mg.o -o mg

$ mpirun -np 3 mg

WARNING: Unable to read mpd.hosts or list of hosts isn't provided. MPI job will be run on the current machine only.

Program mg starts.

Program mg starts.

Program mg starts.

myrank,isend= 0 1

myrank,isend= 2 3

irecv = 1 2 3

myrank,isend= 1 2

Done program mg. myrank= 0

Done program mg. myrank= 2

Done program mg. myrank= 1

program mg2
! Description:
!
! Author: am
!
! Host: aofd30
! Directory: /work2/am/12.Work11/31.PF_Sample/13.mpi_renshu
!
! Revision history:
!  2011-04-16 16:03
!    Initial Version
!  use
!  implicit none
  include 'mpif.h'
  integer,parameter :: ndim=2,npr=3
  integer isend(ndim)
  integer irecv(ndim*npr)
  write(*,'(a)')'Program mg2 starts.'
!  write(*,*)''
  call mpi_init(ierr)
  call mpi_comm_size(mpi_comm_world,nprocs,ierr)
  call mpi_comm_rank(mpi_comm_world,myrank,ierr)
  do i=1,ndim
    isend(i)= myrank*ndim + i
  enddo !i
  do i=1,ndim
    write(*,'(a,2i5)')'myrank,isend(i)= ',myrank,isend(i)
  enddo !i
!  call mpi_gather(isend,1,mpi_integer,irecv,1,mpi_integer,0, &
! & mpi_comm_world,ierr)
  call mpi_gather(isend,ndim,mpi_integer,irecv,ndim,mpi_integer,0, &
 & mpi_comm_world,ierr)
  if(myrank == 0) then
    print *,'RESULT'
    print *,'i, irecv'
    do i=1,ndim*npr
      print *,i, irecv(i)
    enddo !i
    print *
  endif
  call mpi_finalize(ierr)
!  write(*,'(a)')'Done program mg2.'
!  write(*,*)
end program mg2

$ make

make: Warning: File `mg2.f90' has modification time 4.1e+02 s in the future

mpiifort -r8 -O2 -heap-arrays 1024 -c mg2.f90

mpiifort -r8 -O2 -heap-arrays 1024 mg2.o -o mg2

$ mpirun -np 3 mg2

WARNING: Unable to read mpd.hosts or list of hosts isn't provided. MPI job will be run on the current machine only.

Program mg2 starts.

Program mg2 starts.

Program mg2 starts.

myrank,isend(i)= 0 1

myrank,isend(i)= 0 2

myrank,isend(i)= 2 5

myrank,isend(i)= 2 6

myrank,isend(i)= 1 3

myrank,isend(i)= 1 4

RESULT

i, irecv

1 1

2 2

3 3

4 4

5 5

6 6