Dear all,
I'm trying to use MPI_ACCUMULATE with a user-defined datatype.
Basically, I want to be able to accumulate a subset of a
three-dimensional array, but since the data is non-contiguous in memory,
it requires defining a new type with MPI_TYPE_VECTOR and MPI_TYPE_HVECTOR.
I wrote a simple program to GET and ACCUMULATE a subset of a 2D array,
and it fails when it tries to ACCUMULATE. When I try to run the
following with two processes
#####################################################################3
program test_prog
implicit none
include 'mpif.h'
integer :: ierr, nprocs, rank
integer :: MPI_new
integer :: temp, win
integer(kind=MPI_ADDRESS_KIND) :: lb, size, sizeofreal
real :: array(10,10)
real :: data(2,2)
pointer (ptr, temp)
array = 2.
data = 1.
! Startup MPI
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierr)
! Create new type
call MPI_TYPE_VECTOR( 2, 2, 10, MPI_REAL8, MPI_new, ierr )
call MPI_TYPE_COMMIT( MPI_new, ierr )
! Create window
ptr = loc(array)
call MPI_TYPE_GET_EXTENT( MPI_REAL8, lb, sizeofreal, ierr )
size = 10*10*10*sizeofreal
call MPI_ALLOC_MEM( size, MPI_INFO_NULL, ptr, ierr)
call MPI_WIN_CREATE( array, size, sizeofreal, MPI_INFO_NULL, &
& MPI_COMM_WORLD, win, ierr )
call MPI_WIN_FENCE( 0, win, ierr )
! Get data
if ( rank == 1 ) then
call MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr )
call MPI_GET( data, 4, MPI_REAL8, 0, 0, 1, MPI_new, &
& win, ierr )
call MPI_WIN_UNLOCK( 0, win, ierr )
print *, data
end if
! Accumulate data
if ( rank == 1 ) then
call MPI_WIN_LOCK( MPI_LOCK_SHARED, 0, 0, win, ierr )
call MPI_ACCUMULATE( data, 4, MPI_REAL8, 0, 0, 1, MPI_new, &
& MPI_SUM, win, ierr )
call MPI_WIN_UNLOCK( 0, win, ierr )
end if
! print data
call MPI_BARRIER( MPI_COMM_WORLD, ierr )
if ( rank == 0 ) print *, array(1:5,1,1)
! Finalize
call MPI_WIN_FREE( win, ierr )
call MPI_FINALIZE( ierr )
end program test_prog
#####################################################################3
I get the following error:
[yra128:27896] *** An error occurred in MPI_Accumlate
[yra128:27896] *** on win
[yra128:27896] *** MPI_ERR_ARG: invalid argument of some other kind
[yra128:27896] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort)
Looking at the source code for OpenMPI, this should happen if the
primitive datatypes are different, but using the same user-defined
datatype in an MPI_GET succeeds.
I'm running on the Yellowrail cluster at LANL on OpenMPI 1.3.3
(InfiniBand if I'm not mistaken) using the Intel 10.0.023 Fortran
compiler. I believe this is unlikely to be a make/build issue since the
HPC folks here set everything up. I know the ability to perform
MPI_ACCUMULATE with a user-defined type was not in versions < 1.3, but
it should work for 1.3.3.
Any help or insights would be greatly appreciated.
Best regards,
Paul Romano
PS I'm compiling with -r8 to make sure my reals are REAL8s
|