1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
!
! Copyright (C) by Argonne National Laboratory
! See COPYRIGHT in top-level directory
!
! This file created from test/mpi/f77/coll/redscatf.f with f77tof90
subroutine uop( cin, cout, count, datatype )
use mpi_f08
integer cin(*), cout(*)
integer count
TYPE(MPI_Datatype) 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_f08
integer errs, ierr, toterr
integer maxsize
parameter (maxsize=1024)
integer sendbuf(maxsize), recvbuf, recvcounts(maxsize)
integer size, rank, i, sumval
TYPE(MPI_Comm) comm
TYPE(MPI_Op) 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
|