ring.f90
program ring
include "mpif.h"
integer :: ierror, rank, size, left, right, other, &
& sum, i, request
integer, dimension(MPI_STATUS_SIZE) :: send_status, &
& recv_status
call MPI_Init(ierror)
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierror)
call MPI_Comm_size(MPI_COMM_WORLD, size, ierror)
right = modulo(rank + 1, size)
left = modulo(rank - 1, size)
sum = 0
do i = 0, size-1
call MPI_Issend(rank, 1, MPI_INTEGER, right, 1, &
& MPI_COMM_WORLD, request, ierror)
call MPI_Recv(other, 1, MPI_INTEGER, left, 1, &
& MPI_COMM_WORLD, recv_status, ierror)
call MPI_Wait(request, send_status, ierror)
sum = sum + other
rank = other
enddo
write(*, '("PE",i1,": Sum = ",i4)') rank, sum
call MPI_Finalize(ierror)
end program ring
|