C -*- Mode: Fortran; -*-
C
C (C) 2011 by Argonne National Laboratory.
C See COPYRIGHT in top-level directory.
C
subroutine uop( cin, cout, count, datatype )
implicit none
include 'mpif.h'
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
C
C Test of reduce scatter.
C
C Each processor contributes its rank + the index to the reduction,
C then receives the ith sum
C
C Can be called with any number of processors.
C
program main
implicit none
include 'mpif.h'
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
C 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
C 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 )
call mpi_finalize( ierr )
end