|
Packit |
0848f5 |
! This file created from test/mpi/f77/rma/aintf.f with f77tof90
|
|
Packit |
0848f5 |
! -*- Mode: Fortran; -*-
|
|
Packit |
0848f5 |
!
|
|
Packit |
0848f5 |
!
|
|
Packit |
0848f5 |
! (C) 2014 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
! See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
!
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! This program tests MPI_Aint_add/diff in MPI-3.1.
|
|
Packit |
0848f5 |
! The two functions are often used in RMA code.
|
|
Packit |
0848f5 |
! See https://svn.mpi-forum.org/trac/mpi-forum-web/ticket/349
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
program main
|
|
Packit |
0848f5 |
use mpi
|
|
Packit |
0848f5 |
integer :: rank, nproc
|
|
Packit |
0848f5 |
integer :: ierr, errs
|
|
Packit |
0848f5 |
integer :: array(0:1023)
|
|
Packit |
0848f5 |
integer :: val, target_rank;
|
|
Packit |
0848f5 |
integer(kind=MPI_ADDRESS_KIND) :: bases(0:1), disp, offset
|
|
Packit |
0848f5 |
integer(kind=MPI_ADDRESS_KIND) :: winsize
|
|
Packit |
0848f5 |
integer :: win
|
|
Packit |
0848f5 |
integer :: intsize
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
errs = 0
|
|
Packit |
0848f5 |
call mtest_init(ierr);
|
|
Packit |
0848f5 |
call MPI_Comm_rank(MPI_COMM_WORLD, rank, ierr)
|
|
Packit |
0848f5 |
call MPI_Comm_size(MPI_COMM_WORLD, nproc, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (rank == 0 .and. nproc /= 2) then
|
|
Packit |
0848f5 |
print *, 'Must run with 2 ranks'
|
|
Packit |
0848f5 |
call MPI_Abort(MPI_COMM_WORLD, 1, ierr)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Get the base address in the middle of the array
|
|
Packit |
0848f5 |
if (rank == 0) then
|
|
Packit |
0848f5 |
target_rank = 1
|
|
Packit |
0848f5 |
array(0) = 1234
|
|
Packit |
0848f5 |
call MPI_Get_address(array(512), bases(0), ierr)
|
|
Packit |
0848f5 |
else if (rank == 1) then
|
|
Packit |
0848f5 |
target_rank = 0
|
|
Packit |
0848f5 |
array(1023) = 1234
|
|
Packit |
0848f5 |
call MPI_Get_address(array(512), bases(1), ierr)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Exchange bases
|
|
Packit |
0848f5 |
call MPI_Type_size(MPI_INTEGER, intsize, ierr);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Allgather(MPI_IN_PLACE, 0, MPI_DATATYPE_NULL, bases, &
|
|
Packit |
0848f5 |
& 1, MPI_AINT, MPI_COMM_WORLD, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Win_create_dynamic(MPI_INFO_NULL, &
|
|
Packit |
0848f5 |
& MPI_COMM_WORLD, win, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
winsize = intsize*1024
|
|
Packit |
0848f5 |
call MPI_Win_attach(win, array, winsize, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Do MPI_Aint addressing arithmetic
|
|
Packit |
0848f5 |
if (rank == 0) then
|
|
Packit |
0848f5 |
disp = intsize*511
|
|
Packit |
0848f5 |
offset = MPI_Aint_add(bases(1), disp)
|
|
Packit |
0848f5 |
else if (rank == 1) then
|
|
Packit |
0848f5 |
disp = intsize*512
|
|
Packit |
0848f5 |
offset = MPI_Aint_diff(bases(0), disp)
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Get value and verify it
|
|
Packit |
0848f5 |
call MPI_Win_fence(MPI_MODE_NOPRECEDE, win, ierr)
|
|
Packit |
0848f5 |
call MPI_Get(val, 1, MPI_INTEGER, target_rank, &
|
|
Packit |
0848f5 |
& offset, 1, MPI_INTEGER, win, ierr)
|
|
Packit |
0848f5 |
call MPI_Win_fence(MPI_MODE_NOSUCCEED, win, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (val /= 1234) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, rank, ' -- Got', val, 'expected 1234'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Win_detach(win, array, ierr)
|
|
Packit |
0848f5 |
call MPI_Win_free(win, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MTest_Finalize(errs)
|
|
Packit |
0848f5 |
call MPI_Finalize(ierr);
|
|
Packit |
0848f5 |
end
|