|
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 |
C
|
|
Packit |
0848f5 |
C Test user-defined operations. This tests a simple commutative operation
|
|
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 |
print *, '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 |
|
|
Packit |
0848f5 |
program main
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
external uop
|
|
Packit |
0848f5 |
integer ierr, errs
|
|
Packit |
0848f5 |
integer count, sumop, vin(65000), vout(65000), i, size
|
|
Packit |
0848f5 |
integer comm
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
errs = 0
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call mtest_init(ierr)
|
|
Packit |
0848f5 |
call mpi_op_create( uop, .true., sumop, ierr )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
comm = MPI_COMM_WORLD
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
count = 1
|
|
Packit |
0848f5 |
do while (count .lt. 65000)
|
|
Packit |
0848f5 |
do i=1, count
|
|
Packit |
0848f5 |
vin(i) = i
|
|
Packit |
0848f5 |
vout(i) = -1
|
|
Packit |
0848f5 |
enddo
|
|
Packit |
0848f5 |
call mpi_allreduce( vin, vout, count, MPI_INTEGER, sumop,
|
|
Packit |
0848f5 |
* comm, ierr )
|
|
Packit |
0848f5 |
C Check that all results are correct
|
|
Packit |
0848f5 |
do i=1, count
|
|
Packit |
0848f5 |
if (vout(i) .ne. i * size) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
if (errs .lt. 10) print *, "vout(",i,") = ", vout(i)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
enddo
|
|
Packit |
0848f5 |
count = count + count
|
|
Packit |
0848f5 |
enddo
|
|
Packit |
0848f5 |
|
|
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
|