I'm trying to parallelize a Fortran code with rather complicated derived
types full of pointer arrays. When I build the MPI type for sending, all
the static components are sent, but the pointer arrays are not (and retain
initial values). I imagine this has to do with memory addresses when
creating the MPI struct, but I have no idea how to fix it.
I've included a simple code illustrating my issue below. Any suggestions?
Thanks,
Jeremy
program mpi_struct_example
use mpi
implicit none
! declarations
type :: small
real, pointer :: array(:)
end type small
type(small) :: lala
integer :: stat, counts(1), types(1), ierr, iam, n=0, MPI_SMALL
integer (kind=MPI_ADDRESS_KIND) :: displs(1)
! initialize MPI and get my rank
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, iam, ierr )
n = 20
allocate( lala%array(n) )
lala%array = 2.0
! build block counts, displacements, and oldtypes
counts = (/n/)
displs = (/0/)
types = (/MPI_REAL/)
! make and commit new type
call MPI_TYPE_CREATE_STRUCT( 1, counts, displs, types, MPI_SMALL, ierr
)
call MPI_TYPE_COMMIT( MPI_SMALL, ierr )
if (iam .eq. 0) then
! reset the value of the array
lala%array = 1.0
call MPI_SEND( lala, 1, MPI_SMALL, 1, 1, MPI_COMM_WORLD,
ierr) ! this doesn't work
!call MPI_SEND( lala%array, n, MPI_REAL, 1, 1, MPI_COMM_WORLD,
ierr) ! this does work
write (*,*) "iam ",iam," and lala%array(1) = ", lala%array(1)
else
call MPI_RECV( lala, 1, MPI_SMALL, 0, 1, MPI_COMM_WORLD, stat,
ierr ) ! this doesn't work
!call MPI_RECV( lala%array, n, MPI_REAL, 0, 1, MPI_COMM_WORLD,
stat, ierr ) ! this does work
write (*,*) "iam ",iam," and lala%array(1) = ", lala%array(1),
" ( should be 1.0)"
end if
call MPI_FINALIZE(ierr)
end program mpi_struct_example
|