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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
C
C Copyright (C) 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 passed to user_op()'
return
endif
do i=1, count
cout(i) = cin(i) + cout(i)
enddo
end
C
program main
implicit none
include 'mpif.h'
integer inbuf(2), outbuf(2)
integer ans, rank, size, comm
integer errs, ierr
integer sumop
external uop
errs = 0
call mtest_init( ierr )
C
C A simple test of exscan
comm = MPI_COMM_WORLD
call mpi_comm_rank( comm, rank, ierr )
call mpi_comm_size( comm, size, ierr )
inbuf(1) = rank
inbuf(2) = -rank
call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, MPI_SUM, comm,
& ierr )
C this process has the sum of i from 0 to rank-1, which is
C (rank)(rank-1)/2 and -i
ans = (rank * (rank - 1))/2
if (rank .gt. 0) then
if (outbuf(1) .ne. ans) then
errs = errs + 1
print *, rank, ' Expected ', ans, ' got ', outbuf(1)
endif
if (outbuf(2) .ne. -ans) then
errs = errs + 1
print *, rank, ' Expected ', -ans, ' got ', outbuf(1)
endif
endif
C
C Try a user-defined operation
C
call mpi_op_create( uop, .true., sumop, ierr )
inbuf(1) = rank
inbuf(2) = -rank
call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm,
& ierr )
C this process has the sum of i from 0 to rank-1, which is
C (rank)(rank-1)/2 and -i
ans = (rank * (rank - 1))/2
if (rank .gt. 0) then
if (outbuf(1) .ne. ans) then
errs = errs + 1
print *, rank, ' sumop: Expected ', ans, ' got ', outbuf(1)
endif
if (outbuf(2) .ne. -ans) then
errs = errs + 1
print *, rank, ' sumop: Expected ', -ans, ' got ', outbuf(1)
endif
endif
call mpi_op_free( sumop, ierr )
C
C Try a user-defined operation (and don't claim it is commutative)
C
call mpi_op_create( uop, .false., sumop, ierr )
inbuf(1) = rank
inbuf(2) = -rank
call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm,
& ierr )
C this process has the sum of i from 0 to rank-1, which is
C (rank)(rank-1)/2 and -i
ans = (rank * (rank - 1))/2
if (rank .gt. 0) then
if (outbuf(1) .ne. ans) then
errs = errs + 1
print *, rank, ' sumop2: Expected ', ans, ' got ', outbuf(1)
endif
if (outbuf(2) .ne. -ans) then
errs = errs + 1
print *, rank, ' sumop2: Expected ', -ans, ' got ',outbuf(1)
endif
endif
call mpi_op_free( sumop, ierr )
call mtest_finalize( errs )
end
|