|
Packit |
0848f5 |
C -*- Mode: Fortran; -*-
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C (C) 2003 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 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 |
program main
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer inbuf(2), outbuf(2)
|
|
Packit |
0848f5 |
integer ans, rank, size, comm
|
|
Packit |
0848f5 |
integer errs, ierr
|
|
Packit |
0848f5 |
integer sumop
|
|
Packit |
0848f5 |
external uop
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
errs = 0
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call mtest_init( ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C A simple test of exscan
|
|
Packit |
0848f5 |
comm = MPI_COMM_WORLD
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
inbuf(1) = rank
|
|
Packit |
0848f5 |
inbuf(2) = -rank
|
|
Packit |
0848f5 |
call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, MPI_SUM, comm,
|
|
Packit |
0848f5 |
& ierr )
|
|
Packit |
0848f5 |
C this process has the sum of i from 0 to rank-1, which is
|
|
Packit |
0848f5 |
C (rank)(rank-1)/2 and -i
|
|
Packit |
0848f5 |
ans = (rank * (rank - 1))/2
|
|
Packit |
0848f5 |
if (rank .gt. 0) then
|
|
Packit |
0848f5 |
if (outbuf(1) .ne. ans) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' Expected ', ans, ' got ', outbuf(1)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
if (outbuf(2) .ne. -ans) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' Expected ', -ans, ' got ', outbuf(1)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C Try a user-defined operation
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_op_create( uop, .true., sumop, ierr )
|
|
Packit |
0848f5 |
inbuf(1) = rank
|
|
Packit |
0848f5 |
inbuf(2) = -rank
|
|
Packit |
0848f5 |
call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm,
|
|
Packit |
0848f5 |
& ierr )
|
|
Packit |
0848f5 |
C this process has the sum of i from 0 to rank-1, which is
|
|
Packit |
0848f5 |
C (rank)(rank-1)/2 and -i
|
|
Packit |
0848f5 |
ans = (rank * (rank - 1))/2
|
|
Packit |
0848f5 |
if (rank .gt. 0) then
|
|
Packit |
0848f5 |
if (outbuf(1) .ne. ans) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' sumop: Expected ', ans, ' got ', outbuf(1)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
if (outbuf(2) .ne. -ans) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' sumop: Expected ', -ans, ' got ', outbuf(1)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
call mpi_op_free( sumop, ierr )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C Try a user-defined operation (and don't claim it is commutative)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_op_create( uop, .false., sumop, ierr )
|
|
Packit |
0848f5 |
inbuf(1) = rank
|
|
Packit |
0848f5 |
inbuf(2) = -rank
|
|
Packit |
0848f5 |
call mpi_exscan( inbuf, outbuf, 2, MPI_INTEGER, sumop, comm,
|
|
Packit |
0848f5 |
& ierr )
|
|
Packit |
0848f5 |
C this process has the sum of i from 0 to rank-1, which is
|
|
Packit |
0848f5 |
C (rank)(rank-1)/2 and -i
|
|
Packit |
0848f5 |
ans = (rank * (rank - 1))/2
|
|
Packit |
0848f5 |
if (rank .gt. 0) then
|
|
Packit |
0848f5 |
if (outbuf(1) .ne. ans) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' sumop2: Expected ', ans, ' got ', outbuf(1)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
if (outbuf(2) .ne. -ans) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' sumop2: Expected ', -ans, ' got ',outbuf(1)
|
|
Packit |
0848f5 |
endif
|
|
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 |
end
|