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