! This file created from f77/coll/redscatf.f with f77tof90
! -*- Mode: Fortran; -*-
!
! (C) 2011 by Argonne National Laboratory.
! See COPYRIGHT in top-level directory.
!
subroutine uop( cin, cout, count, datatype )
use mpi
integer cin(*), cout(*)
integer count, datatype
integer i
if (datatype .ne. MPI_INTEGER) then
write(6,*) 'Invalid datatype ',datatype,' passed to user_op()'
return
endif
do i=1, count
cout(i) = cin(i) + cout(i)
enddo
end
!
! Test of reduce scatter.
!
! Each processor contributes its rank + the index to the reduction,
! then receives the ith sum
!
! Can be called with any number of processors.
!
program main
use mpi
integer errs, ierr, toterr
integer maxsize
parameter (maxsize=1024)
integer sendbuf(maxsize), recvbuf, recvcounts(maxsize)
integer size, rank, i, sumval
integer comm, sumop
external uop
errs = 0
call mtest_init( ierr )
comm = MPI_COMM_WORLD
call mpi_comm_size( comm, size, ierr )
call mpi_comm_rank( comm, rank, ierr )
if (size .gt. maxsize) then
endif
do i=1, size
sendbuf(i) = rank + i - 1
recvcounts(i) = 1
enddo
call mpi_reduce_scatter( sendbuf, recvbuf, recvcounts, &
& MPI_INTEGER, MPI_SUM, comm, ierr )
sumval = size * rank + ((size - 1) * size)/2
! recvbuf should be size * (rank + i)
if (recvbuf .ne. sumval) then
errs = errs + 1
print *, "Did not get expected value for reduce scatter"
print *, rank, " Got ", recvbuf, " expected ", sumval
endif
call mpi_op_create( uop, .true., sumop, ierr )
call mpi_reduce_scatter( sendbuf, recvbuf, recvcounts, &
& MPI_INTEGER, sumop, comm, ierr )
sumval = size * rank + ((size - 1) * size)/2
! recvbuf should be size * (rank + i)
if (recvbuf .ne. sumval) then
errs = errs + 1
print *, "sumop: Did not get expected value for reduce scatter"
print *, rank, " Got ", recvbuf, " expected ", sumval
endif
call mpi_op_free( sumop, ierr )
call mtest_finalize( errs )
end