|
Packit |
0848f5 |
C -*- Mode: Fortran; -*-
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C (C) 2012 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
C See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C This program is based on the allpair.f test from the MPICH-1 test
|
|
Packit |
0848f5 |
C (test/pt2pt/allpair.f), which in turn was inspired by a bug report from
|
|
Packit |
0848f5 |
C fsset@corelli.lerc.nasa.gov (Scott Townsend)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
program allpair
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer ierr, errs, comm
|
|
Packit |
0848f5 |
logical mtestGetIntraComm
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
errs = 0
|
|
Packit |
0848f5 |
verbose = .false.
|
|
Packit |
0848f5 |
C verbose = .true.
|
|
Packit |
0848f5 |
call MTest_Init( ierr )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
do while ( mtestGetIntraComm( comm, 2, .false. ) )
|
|
Packit |
0848f5 |
call test_pair_send( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_ssend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_rsend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_isend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_irsend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_issend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_psend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_prsend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_pssend( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_sendrecv( comm, errs )
|
|
Packit |
0848f5 |
call test_pair_sendrecvrepl( comm, errs )
|
|
Packit |
0848f5 |
call mtestFreeComm( comm )
|
|
Packit |
0848f5 |
enddo
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MTest_Finalize( errs )
|
|
Packit |
0848f5 |
call MPI_Finalize(ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_send( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Send and recv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 1123
|
|
Packit |
0848f5 |
count = TEST_SIZE / 5
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Send(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'send and recv', errs )
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm, status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'send and recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Send(recv_buf, count, MPI_REAL, prev, tag, comm, ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_rsend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, i
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE), requests(1)
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Rsend and recv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 1456
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag,
|
|
Packit |
0848f5 |
. comm, status, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Rsend(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Probe(MPI_ANY_SOURCE, tag, comm, status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (status(MPI_SOURCE) .ne. next) then
|
|
Packit |
0848f5 |
print *, 'Rsend: Incorrect source, expected', next,
|
|
Packit |
0848f5 |
. ', got', status(MPI_SOURCE)
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (status(MPI_TAG) .ne. tag) then
|
|
Packit |
0848f5 |
print *, 'Rsend: Incorrect tag, expected', tag,
|
|
Packit |
0848f5 |
. ', got', status(MPI_TAG)
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Get_count(status, MPI_REAL, i, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (i .ne. count) then
|
|
Packit |
0848f5 |
print *, 'Rsend: Incorrect count, expected', count,
|
|
Packit |
0848f5 |
. ', got', i
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'rsend and recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(1), ierr)
|
|
Packit |
0848f5 |
call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, prev, tag,
|
|
Packit |
0848f5 |
. comm, ierr )
|
|
Packit |
0848f5 |
call MPI_Wait( requests(1), status, ierr )
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'rsend and recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Send(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_ssend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, i
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
logical flag
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Ssend and recv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 1789
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Iprobe(MPI_ANY_SOURCE, tag,
|
|
Packit |
0848f5 |
. comm, flag, status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (flag) then
|
|
Packit |
0848f5 |
print *, 'Ssend: Iprobe succeeded! source',
|
|
Packit |
0848f5 |
. status(MPI_SOURCE),
|
|
Packit |
0848f5 |
. ', tag', status(MPI_TAG)
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Ssend(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do while (.not. flag)
|
|
Packit |
0848f5 |
call MPI_Iprobe(MPI_ANY_SOURCE, tag,
|
|
Packit |
0848f5 |
. comm, flag, status, ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (status(MPI_SOURCE) .ne. next) then
|
|
Packit |
0848f5 |
print *, 'Ssend: Incorrect source, expected', next,
|
|
Packit |
0848f5 |
. ', got', status(MPI_SOURCE)
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (status(MPI_TAG) .ne. tag) then
|
|
Packit |
0848f5 |
print *, 'Ssend: Incorrect tag, expected', tag,
|
|
Packit |
0848f5 |
. ', got', status(MPI_TAG)
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Get_count(status, MPI_REAL, i, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (i .ne. count) then
|
|
Packit |
0848f5 |
print *, 'Ssend: Incorrect count, expected', count,
|
|
Packit |
0848f5 |
. ', got', i
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, status,
|
|
Packit |
0848f5 |
. TEST_SIZE, 'ssend and recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'ssend and recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Ssend(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_isend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE), requests(2)
|
|
Packit |
0848f5 |
integer statuses(MPI_STATUS_SIZE,2)
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' isend and irecv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 2123
|
|
Packit |
0848f5 |
count = TEST_SIZE / 5
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Isend(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Waitall(2, requests, statuses, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests, 2, 'isend and irecv' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, statuses(1,1),
|
|
Packit |
0848f5 |
. TEST_SIZE, 'isend and irecv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'isend and irecv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Isend(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Wait(requests(1), status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests(1), 1, 'isend and irecv' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_irsend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, index, i
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
integer dupcom
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE), requests(2)
|
|
Packit |
0848f5 |
integer statuses(MPI_STATUS_SIZE,2)
|
|
Packit |
0848f5 |
logical flag
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Irsend and irecv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_dup( comm, dupcom, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 2456
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, next, 0,
|
|
Packit |
0848f5 |
. MPI_BOTTOM, 0, MPI_INTEGER, next, 0,
|
|
Packit |
0848f5 |
. dupcom, status, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irsend(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
index = -1
|
|
Packit |
0848f5 |
do while (index .ne. 1)
|
|
Packit |
0848f5 |
call MPI_Waitany(2, requests, index, statuses, ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests(1), 1, 'irsend and irecv' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, statuses,
|
|
Packit |
0848f5 |
. TEST_SIZE, 'irsend and irecv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Sendrecv( MPI_BOTTOM, 0, MPI_INTEGER, prev, 0,
|
|
Packit |
0848f5 |
. MPI_BOTTOM, 0, MPI_INTEGER, prev, 0,
|
|
Packit |
0848f5 |
. dupcom, status, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
flag = .FALSE.
|
|
Packit |
0848f5 |
do while (.not. flag)
|
|
Packit |
0848f5 |
call MPI_Test(requests(1), flag, status, ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests, 1, 'irsend and irecv (test)' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'irsend and irecv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irsend(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Waitall(1, requests, statuses, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests, 1, 'irsend and irecv' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_free( dupcom, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_issend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, index
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE), requests(2)
|
|
Packit |
0848f5 |
integer statuses(MPI_STATUS_SIZE,2)
|
|
Packit |
0848f5 |
logical flag
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' issend and irecv (testall)'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 2789
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Irecv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Issend(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
flag = .FALSE.
|
|
Packit |
0848f5 |
do while (.not. flag)
|
|
Packit |
0848f5 |
call MPI_Testall(2, requests, flag, statuses, ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests, 2, 'issend and irecv (testall)' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, statuses(1,1),
|
|
Packit |
0848f5 |
. TEST_SIZE, 'issend and recv (testall)', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'issend and recv', errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Issend(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
flag = .FALSE.
|
|
Packit |
0848f5 |
do while (.not. flag)
|
|
Packit |
0848f5 |
call MPI_Testany(1, requests(1), index, flag,
|
|
Packit |
0848f5 |
. statuses(1,1), ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call rq_check( requests, 1, 'issend and recv (testany)' )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_psend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, i
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
integer statuses(MPI_STATUS_SIZE,2), requests(2)
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Persistent send and recv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 3123
|
|
Packit |
0848f5 |
count = TEST_SIZE / 5
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Send_init(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Startall(2, requests, ierr)
|
|
Packit |
0848f5 |
call MPI_Waitall(2, requests, statuses, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, statuses(1,2),
|
|
Packit |
0848f5 |
. TEST_SIZE, 'persistent send/recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Send_init(send_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
call MPI_Start(requests(2), ierr)
|
|
Packit |
0848f5 |
call MPI_Wait(requests(2), status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
* 'persistent send/recv', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do i = 1,count
|
|
Packit |
0848f5 |
send_buf(i) = recv_buf(i)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Start(requests(1), ierr)
|
|
Packit |
0848f5 |
call MPI_Wait(requests(1), status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(1), ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call dummyRef( send_buf, count, ierr )
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_prsend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, index, i
|
|
Packit |
0848f5 |
integer outcount, indices(2)
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer statuses(MPI_STATUS_SIZE,2), requests(2)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
logical flag
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Persistent Rsend and recv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 3456
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Rsend_init(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv( MPI_BOTTOM, 0, MPI_INTEGER, next, tag,
|
|
Packit |
0848f5 |
. comm, status, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Startall(2, requests, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
index = -1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do while (index .ne. 2)
|
|
Packit |
0848f5 |
call MPI_Waitsome(2, requests, outcount,
|
|
Packit |
0848f5 |
. indices, statuses, ierr)
|
|
Packit |
0848f5 |
do i = 1,outcount
|
|
Packit |
0848f5 |
if (indices(i) .eq. 2) then
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count,
|
|
Packit |
0848f5 |
. statuses(1,i), TEST_SIZE, 'waitsome', errs )
|
|
Packit |
0848f5 |
index = 2
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(1), ierr)
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Rsend_init(send_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Start(requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Send( MPI_BOTTOM, 0, MPI_INTEGER, prev, tag,
|
|
Packit |
0848f5 |
. comm, ierr )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
flag = .FALSE.
|
|
Packit |
0848f5 |
do while (.not. flag)
|
|
Packit |
0848f5 |
call MPI_Test(requests(2), flag, status, ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'test', errs )
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do i = 1,count
|
|
Packit |
0848f5 |
send_buf(i) = recv_buf(i)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Start(requests(1), ierr)
|
|
Packit |
0848f5 |
call MPI_Wait(requests(1), status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(1), ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call dummyRef( send_buf, count, ierr )
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_pssend( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, index, i
|
|
Packit |
0848f5 |
integer outcount, indices(2)
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer statuses(MPI_STATUS_SIZE,2), requests(2)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
logical flag
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Persistent Ssend and recv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 3789
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Recv_init(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Ssend_init(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Startall(2, requests, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
index = -1
|
|
Packit |
0848f5 |
do while (index .ne. 1)
|
|
Packit |
0848f5 |
call MPI_Testsome(2, requests, outcount,
|
|
Packit |
0848f5 |
. indices, statuses, ierr)
|
|
Packit |
0848f5 |
do i = 1,outcount
|
|
Packit |
0848f5 |
if (indices(i) .eq. 1) then
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count,
|
|
Packit |
0848f5 |
. statuses(1,i), TEST_SIZE, 'testsome', errs )
|
|
Packit |
0848f5 |
index = 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Ssend_init(send_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Start(requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
flag = .FALSE.
|
|
Packit |
0848f5 |
do while (.not. flag)
|
|
Packit |
0848f5 |
call MPI_Testany(1, requests(1), index, flag,
|
|
Packit |
0848f5 |
. statuses(1,1), ierr)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, statuses(1,1),
|
|
Packit |
0848f5 |
. TEST_SIZE, 'testany', errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
do i = 1,count
|
|
Packit |
0848f5 |
send_buf(i) = recv_buf(i)
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Start(requests(2), ierr)
|
|
Packit |
0848f5 |
call MPI_Wait(requests(2), status, ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(2), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call dummyRef( send_buf, count, ierr )
|
|
Packit |
0848f5 |
call MPI_Request_free(requests(1), ierr)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_sendrecv( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Sendrecv'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 4123
|
|
Packit |
0848f5 |
count = TEST_SIZE / 5
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call init_test_data(send_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Sendrecv(send_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. recv_buf, count, MPI_REAL, next, tag,
|
|
Packit |
0848f5 |
. comm, status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'sendrecv', errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'recv/send', errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Send(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine test_pair_sendrecvrepl( comm, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer comm, errs
|
|
Packit |
0848f5 |
integer rank, size, ierr, next, prev, tag, count, i
|
|
Packit |
0848f5 |
integer TEST_SIZE
|
|
Packit |
0848f5 |
parameter (TEST_SIZE=2000)
|
|
Packit |
0848f5 |
integer status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
real send_buf(TEST_SIZE), recv_buf(TEST_SIZE)
|
|
Packit |
0848f5 |
logical verbose
|
|
Packit |
0848f5 |
common /flags/ verbose
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
if (verbose) then
|
|
Packit |
0848f5 |
print *, ' Sendrecv replace'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call mpi_comm_rank( comm, rank, ierr )
|
|
Packit |
0848f5 |
call mpi_comm_size( comm, size, ierr )
|
|
Packit |
0848f5 |
next = rank + 1
|
|
Packit |
0848f5 |
if (next .ge. size) next = 0
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
prev = rank - 1
|
|
Packit |
0848f5 |
if (prev .lt. 0) prev = size - 1
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
tag = 4456
|
|
Packit |
0848f5 |
count = TEST_SIZE / 3
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (rank .eq. 0) then
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call init_test_data(recv_buf, TEST_SIZE)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do 11 i = count+1,TEST_SIZE
|
|
Packit |
0848f5 |
recv_buf(i) = 0.0
|
|
Packit |
0848f5 |
11 continue
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
call MPI_Sendrecv_replace(recv_buf, count, MPI_REAL,
|
|
Packit |
0848f5 |
. next, tag, next, tag,
|
|
Packit |
0848f5 |
. comm, status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call msg_check( recv_buf, next, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'sendrecvreplace', errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
else if (prev .eq. 0) then
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call clear_test_data(recv_buf,TEST_SIZE)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Recv(recv_buf, TEST_SIZE, MPI_REAL,
|
|
Packit |
0848f5 |
. MPI_ANY_SOURCE, MPI_ANY_TAG, comm,
|
|
Packit |
0848f5 |
. status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call msg_check( recv_buf, prev, tag, count, status, TEST_SIZE,
|
|
Packit |
0848f5 |
. 'recv/send for replace', errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Send(recv_buf, count, MPI_REAL, prev, tag,
|
|
Packit |
0848f5 |
. comm, ierr)
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c Check for correct source, tag, count, and data in test message.
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
subroutine msg_check( recv_buf, source, tag, count, status, n,
|
|
Packit |
0848f5 |
* name, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer n, errs
|
|
Packit |
0848f5 |
real recv_buf(n)
|
|
Packit |
0848f5 |
integer source, tag, count, rank, status(MPI_STATUS_SIZE)
|
|
Packit |
0848f5 |
character*(*) name
|
|
Packit |
0848f5 |
logical foundError
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
integer ierr, recv_src, recv_tag, recv_count
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
foundError = .false.
|
|
Packit |
0848f5 |
recv_src = status(MPI_SOURCE)
|
|
Packit |
0848f5 |
recv_tag = status(MPI_TAG)
|
|
Packit |
0848f5 |
call MPI_Comm_rank( MPI_COMM_WORLD, rank, ierr )
|
|
Packit |
0848f5 |
call MPI_Get_count(status, MPI_REAL, recv_count, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (recv_src .ne. source) then
|
|
Packit |
0848f5 |
print *, '[', rank, '] Unexpected source:', recv_src,
|
|
Packit |
0848f5 |
* ' in ', name
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
foundError = .true.
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (recv_tag .ne. tag) then
|
|
Packit |
0848f5 |
print *, '[', rank, '] Unexpected tag:', recv_tag, ' in ', name
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
foundError = .true.
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (recv_count .ne. count) then
|
|
Packit |
0848f5 |
print *, '[', rank, '] Unexpected count:', recv_count,
|
|
Packit |
0848f5 |
* ' in ', name
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
foundError = .true.
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call verify_test_data(recv_buf, count, n, name, errs )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c Check that requests have been set to null
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
subroutine rq_check( requests, n, msg )
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer n, requests(n)
|
|
Packit |
0848f5 |
character*(*) msg
|
|
Packit |
0848f5 |
integer i
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
do 10 i=1, n
|
|
Packit |
0848f5 |
if (requests(i) .ne. MPI_REQUEST_NULL) then
|
|
Packit |
0848f5 |
print *, 'Nonnull request in ', msg
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
10 continue
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c Initialize test data buffer with integral sequence.
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
subroutine init_test_data(buf,n)
|
|
Packit |
0848f5 |
integer n
|
|
Packit |
0848f5 |
real buf(n)
|
|
Packit |
0848f5 |
integer i
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
do 10 i = 1, n
|
|
Packit |
0848f5 |
buf(i) = REAL(i)
|
|
Packit |
0848f5 |
10 continue
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c Clear test data buffer
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
subroutine clear_test_data(buf, n)
|
|
Packit |
0848f5 |
integer n
|
|
Packit |
0848f5 |
real buf(n)
|
|
Packit |
0848f5 |
integer i
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
do 10 i = 1, n
|
|
Packit |
0848f5 |
buf(i) = 0.
|
|
Packit |
0848f5 |
10 continue
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c Verify test data buffer
|
|
Packit |
0848f5 |
c
|
|
Packit |
0848f5 |
c------------------------------------------------------------------------------
|
|
Packit |
0848f5 |
subroutine verify_test_data( buf, count, n, name, errs )
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
include 'mpif.h'
|
|
Packit |
0848f5 |
integer n, errs
|
|
Packit |
0848f5 |
real buf(n)
|
|
Packit |
0848f5 |
character *(*) name
|
|
Packit |
0848f5 |
integer count, ierr, i
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do 10 i = 1, count
|
|
Packit |
0848f5 |
if (buf(i) .ne. REAL(i)) then
|
|
Packit |
0848f5 |
print 100, buf(i), i, count, name
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
10 continue
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
do 20 i = count + 1, n
|
|
Packit |
0848f5 |
if (buf(i) .ne. 0.) then
|
|
Packit |
0848f5 |
print 100, buf(i), i, n, name
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
20 continue
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
100 format('Invalid data', f6.1, ' at ', i4, ' of ', i4, ' in ', a)
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
end
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
C This routine is used to prevent the compiler from deallocating the
|
|
Packit |
0848f5 |
C array "a", which may happen in some of the tests (see the text in
|
|
Packit |
0848f5 |
C the MPI standard about why this may be a problem in valid Fortran
|
|
Packit |
0848f5 |
C codes). Without this, for example, tests fail with the Cray ftn
|
|
Packit |
0848f5 |
C compiler.
|
|
Packit |
0848f5 |
C
|
|
Packit |
0848f5 |
subroutine dummyRef( a, n, ie )
|
|
Packit |
0848f5 |
integer n, ie
|
|
Packit |
0848f5 |
real a(n)
|
|
Packit |
0848f5 |
C This condition will never be true, but the compile won't know that
|
|
Packit |
0848f5 |
if (ie .eq. -1) then
|
|
Packit |
0848f5 |
print *, a(n)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
return
|
|
Packit |
0848f5 |
end
|