Make the Alltoall/Ialltoallw F08 interfaces a little less sucky.
Use proper array types for the sendtypes and recevtypes params in the definition of these subroutines (since they're prototyped to be array parameters in the module). See the comment in the code for a more complete explanation. Note that after talking to Craig Rasumussen, he says that this is fairly common practice in the Fortran community (i.e., pass a scalar that is part of an array to effectively pass an offset into that array, since Fortran passes by reference). So this might be a hack, but it's a commonly-accepted hack. Reviewed by Craig Rasmussen. cmr=v1.7.3:subject=Fix [I]Alltoallw mpi_f08 wrapper functions This commit was SVN r29298.
Этот коммит содержится в:
родитель
713af6a7a9
Коммит
0acebc0a1f
@ -1,6 +1,6 @@
|
|||||||
! -*- f90 -*-
|
! -*- f90 -*-
|
||||||
!
|
!
|
||||||
! Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
! Copyright (c) 2009-2013 Cisco Systems, Inc. All rights reserved.
|
||||||
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
||||||
! All rights reserved.
|
! All rights reserved.
|
||||||
! $COPYRIGHT$
|
! $COPYRIGHT$
|
||||||
@ -14,14 +14,24 @@ subroutine MPI_Alltoallw_f08(sendbuf,sendcounts,sdispls,sendtypes,&
|
|||||||
implicit none
|
implicit none
|
||||||
OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf, recvbuf
|
OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf, recvbuf
|
||||||
INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
|
INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
|
||||||
TYPE(MPI_Datatype), INTENT(IN) :: sendtypes
|
TYPE(MPI_Datatype), INTENT(IN) :: sendtypes(*)
|
||||||
TYPE(MPI_Datatype), INTENT(IN) :: recvtypes
|
TYPE(MPI_Datatype), INTENT(IN) :: recvtypes(*)
|
||||||
TYPE(MPI_Comm), INTENT(IN) :: comm
|
TYPE(MPI_Comm), INTENT(IN) :: comm
|
||||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||||
integer :: c_ierror
|
integer :: c_ierror
|
||||||
|
|
||||||
call ompi_alltoallw_f(sendbuf,sendcounts,sdispls,sendtypes%MPI_VAL,&
|
! Note that we pass a scalar here for both the sendtypes and
|
||||||
recvbuf,recvcounts,rdispls,recvtypes%MPI_VAL,comm%MPI_VAL,c_ierror)
|
! recvtypes arguments, even though the real Alltoallw function
|
||||||
|
! expects an array of integers. This is a hack: we know that
|
||||||
|
! [send|recv]types(1)%MPI_VAL will pass the address of the first
|
||||||
|
! integer in the array of Type(MPI_Datatype) derived types. And
|
||||||
|
! since Type(MPI_Datatype) are exactly memory-equivalent to a
|
||||||
|
! single INTEGER, passing the address of the first one is the same
|
||||||
|
! as passing the address to an array of integers. To be clear: the
|
||||||
|
! back-end ompi_alltoallw_f is expecting a pointer to an array of
|
||||||
|
! integers. So it all works out (but is a hack :-\ ).
|
||||||
|
call ompi_alltoallw_f(sendbuf,sendcounts,sdispls,sendtypes(1)%MPI_VAL,&
|
||||||
|
recvbuf,recvcounts,rdispls,recvtypes(1)%MPI_VAL,comm%MPI_VAL,c_ierror)
|
||||||
if (present(ierror)) ierror = c_ierror
|
if (present(ierror)) ierror = c_ierror
|
||||||
|
|
||||||
end subroutine MPI_Alltoallw_f08
|
end subroutine MPI_Alltoallw_f08
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
! -*- f90 -*-
|
! -*- f90 -*-
|
||||||
!
|
!
|
||||||
! Copyright (c) 2009-2012 Cisco Systems, Inc. All rights reserved.
|
! Copyright (c) 2009-2013 Cisco Systems, Inc. All rights reserved.
|
||||||
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
|
||||||
! All rights reserved.
|
! All rights reserved.
|
||||||
! $COPYRIGHT$
|
! $COPYRIGHT$
|
||||||
@ -14,15 +14,25 @@ subroutine MPI_Ialltoallw_f08(sendbuf,sendcounts,sdispls,sendtypes,&
|
|||||||
implicit none
|
implicit none
|
||||||
OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf, recvbuf
|
OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf, recvbuf
|
||||||
INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
|
INTEGER, INTENT(IN) :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
|
||||||
TYPE(MPI_Datatype), INTENT(IN) :: sendtypes
|
TYPE(MPI_Datatype), INTENT(IN) :: sendtypes(*)
|
||||||
TYPE(MPI_Datatype), INTENT(IN) :: recvtypes
|
TYPE(MPI_Datatype), INTENT(IN) :: recvtypes(*)
|
||||||
TYPE(MPI_Comm), INTENT(IN) :: comm
|
TYPE(MPI_Comm), INTENT(IN) :: comm
|
||||||
TYPE(MPI_Request), INTENT(OUT) :: request
|
TYPE(MPI_Request), INTENT(OUT) :: request
|
||||||
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
|
||||||
integer :: c_ierror
|
integer :: c_ierror
|
||||||
|
|
||||||
call ompi_ialltoallw_f(sendbuf,sendcounts,sdispls,sendtypes%MPI_VAL,&
|
! Note that we pass a scalar here for both the sendtypes and
|
||||||
recvbuf,recvcounts,rdispls,recvtypes%MPI_VAL,comm%MPI_VAL,request%MPI_VAL,c_ierror)
|
! recvtypes arguments, even though the real Alltoallw function
|
||||||
|
! expects an array of integers. This is a hack: we know that
|
||||||
|
! [send|recv]types(1)%MPI_VAL will pass the address of the first
|
||||||
|
! integer in the array of Type(MPI_Datatype) derived types. And
|
||||||
|
! since Type(MPI_Datatype) are exactly memory-equivalent to a
|
||||||
|
! single INTEGER, passing the address of the first one is the same
|
||||||
|
! as passing the address to an array of integers. To be clear: the
|
||||||
|
! back-end ompi_alltoallw_f is expecting a pointer to an array of
|
||||||
|
! integers. So it all works out (but is a hack :-\ ).
|
||||||
|
call ompi_ialltoallw_f(sendbuf,sendcounts,sdispls,sendtypes(1)%MPI_VAL,&
|
||||||
|
recvbuf,recvcounts,rdispls,recvtypes(1)%MPI_VAL,comm%MPI_VAL,request%MPI_VAL,c_ierror)
|
||||||
if (present(ierror)) ierror = c_ierror
|
if (present(ierror)) ierror = c_ierror
|
||||||
|
|
||||||
end subroutine MPI_Ialltoallw_f08
|
end subroutine MPI_Ialltoallw_f08
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user