|
Packit |
0848f5 |
! -*- Mode: Fortran; -*-
|
|
Packit |
0848f5 |
!
|
|
Packit |
0848f5 |
! (C) 2014 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
! See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
!
|
|
Packit |
0848f5 |
program main
|
|
Packit |
0848f5 |
use mpi_f08
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
implicit none
|
|
Packit |
0848f5 |
!include 'mpif.h'
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Fortran 2008 equivalent of src/mpi/romio/test/coll_test.c
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
integer FILESIZE
|
|
Packit |
0848f5 |
parameter (FILESIZE=32*32*32*4)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! A 32^3 array. For other array sizes, change FILESIZE above and
|
|
Packit |
0848f5 |
! array_of_gsizes below.
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Uses collective I/O. Writes a 3D block-distributed array to a file
|
|
Packit |
0848f5 |
! corresponding to the global array in row-major (C) order, reads it
|
|
Packit |
0848f5 |
! back, and checks that the data read is correct.
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! Note that the file access pattern is noncontiguous.
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
integer i, ndims, array_of_gsizes(3)
|
|
Packit |
0848f5 |
integer order, intsize, nprocs, j, array_of_distribs(3)
|
|
Packit |
0848f5 |
integer array_of_dargs(3), array_of_psizes(3)
|
|
Packit |
0848f5 |
integer readbuf(FILESIZE), writebuf(FILESIZE), bufcount
|
|
Packit |
0848f5 |
integer mynod, tmpbuf(FILESIZE), array_size, argc
|
|
Packit |
0848f5 |
integer ierr
|
|
Packit |
0848f5 |
character*256 str ! used to store the filename
|
|
Packit |
0848f5 |
integer errs, toterrs
|
|
Packit |
0848f5 |
integer(MPI_OFFSET_KIND) :: disp
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
type(MPI_Datatype) :: newtype
|
|
Packit |
0848f5 |
type(MPI_Status) :: status
|
|
Packit |
0848f5 |
type(MPI_Request) :: request
|
|
Packit |
0848f5 |
type(MPI_File) :: fh
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
errs = 0
|
|
Packit |
0848f5 |
str = "iotest.txt"
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_INIT(ierr)
|
|
Packit |
0848f5 |
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
|
|
Packit |
0848f5 |
call MPI_COMM_RANK(MPI_COMM_WORLD, mynod, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! create the distributed array filetype
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
ndims = 3
|
|
Packit |
0848f5 |
order = MPI_ORDER_FORTRAN
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
array_of_gsizes(1) = 32
|
|
Packit |
0848f5 |
array_of_gsizes(2) = 32
|
|
Packit |
0848f5 |
array_of_gsizes(3) = 32
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
array_of_distribs(1) = MPI_DISTRIBUTE_BLOCK
|
|
Packit |
0848f5 |
array_of_distribs(2) = MPI_DISTRIBUTE_BLOCK
|
|
Packit |
0848f5 |
array_of_distribs(3) = MPI_DISTRIBUTE_BLOCK
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
array_of_dargs(1) = MPI_DISTRIBUTE_DFLT_DARG
|
|
Packit |
0848f5 |
array_of_dargs(2) = MPI_DISTRIBUTE_DFLT_DARG
|
|
Packit |
0848f5 |
array_of_dargs(3) = MPI_DISTRIBUTE_DFLT_DARG
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
do i=1, ndims
|
|
Packit |
0848f5 |
array_of_psizes(i) = 0
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_DIMS_CREATE(nprocs, ndims, array_of_psizes, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_TYPE_CREATE_DARRAY(nprocs, mynod, ndims, &
|
|
Packit |
0848f5 |
array_of_gsizes, array_of_distribs, array_of_dargs, &
|
|
Packit |
0848f5 |
array_of_psizes, order, MPI_INTEGER, newtype, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_TYPE_COMMIT(newtype, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! initialize writebuf
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_TYPE_SIZE(newtype, bufcount, ierr)
|
|
Packit |
0848f5 |
call MPI_TYPE_SIZE(MPI_INTEGER, intsize, ierr)
|
|
Packit |
0848f5 |
bufcount = bufcount/intsize
|
|
Packit |
0848f5 |
do i=1, bufcount
|
|
Packit |
0848f5 |
writebuf(i) = 1
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
do i=1, FILESIZE
|
|
Packit |
0848f5 |
tmpbuf(i) = 0
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_IRECV(tmpbuf, 1, newtype, mynod, 10, MPI_COMM_WORLD, request, ierr)
|
|
Packit |
0848f5 |
call MPI_SEND(writebuf, bufcount, MPI_INTEGER, mynod, 10, MPI_COMM_WORLD, ierr)
|
|
Packit |
0848f5 |
call MPI_WAIT(request, status, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
j = 1
|
|
Packit |
0848f5 |
array_size = array_of_gsizes(1) * array_of_gsizes(2) * array_of_gsizes(3)
|
|
Packit |
0848f5 |
do i=1, array_size
|
|
Packit |
0848f5 |
if (tmpbuf(i) .ne. 0) then
|
|
Packit |
0848f5 |
writebuf(j) = i
|
|
Packit |
0848f5 |
j = j + 1
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! end of initialization
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! write the array to the file
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_FILE_OPEN(MPI_COMM_WORLD, str, MPI_MODE_CREATE+MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
disp = 0
|
|
Packit |
0848f5 |
call MPI_FILE_SET_VIEW(fh, disp, MPI_INTEGER, newtype, "native", MPI_INFO_NULL, ierr)
|
|
Packit |
0848f5 |
call MPI_FILE_IWRITE_ALL(fh, writebuf, bufcount, MPI_INTEGER, request, ierr)
|
|
Packit |
0848f5 |
call MPI_WAIT(request, status, ierr)
|
|
Packit |
0848f5 |
call MPI_FILE_CLOSE(fh, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
!now read it back
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_FILE_OPEN(MPI_COMM_WORLD, str, MPI_MODE_CREATE+MPI_MODE_RDWR, MPI_INFO_NULL, fh, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_FILE_SET_VIEW(fh, disp, MPI_INTEGER, newtype, "native", MPI_INFO_NULL, ierr)
|
|
Packit |
0848f5 |
call MPI_FILE_IREAD_ALL(fh, readbuf, bufcount, MPI_INTEGER, request, ierr)
|
|
Packit |
0848f5 |
call MPI_WAIT(request, status, ierr)
|
|
Packit |
0848f5 |
call MPI_FILE_CLOSE(fh, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
! check the data read
|
|
Packit |
0848f5 |
do i=1, bufcount
|
|
Packit |
0848f5 |
if (readbuf(i) .ne. writebuf(i)) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
print *, 'Node ', mynod, ' readbuf ', readbuf(i), &
|
|
Packit |
0848f5 |
' writebuf ', writebuf(i), ' i', i
|
|
Packit |
0848f5 |
end if
|
|
Packit |
0848f5 |
end do
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_TYPE_FREE(newtype, ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (mynod .eq. 0) then
|
|
Packit |
0848f5 |
call MPI_FILE_DELETE(str, MPI_INFO_NULL, ierr)
|
|
Packit |
0848f5 |
if (ierr .ne. MPI_SUCCESS) then
|
|
Packit |
0848f5 |
errs = errs + 1
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_Allreduce( errs, toterrs, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr )
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (mynod .eq. 0) then
|
|
Packit |
0848f5 |
if( toterrs .gt. 0 ) then
|
|
Packit |
0848f5 |
print *, 'Found ', toterrs, ' errors'
|
|
Packit |
0848f5 |
else
|
|
Packit |
0848f5 |
print *, ' No Errors'
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
call MPI_FINALIZE(ierr)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
stop
|
|
Packit |
0848f5 |
end
|