1
1
openmpi/ompi/mpi/fortran/use-mpi-f08/ialltoallw_f08.F90
Philipp Otte e98eae3da6 fortran/use-mpi-f08: Corrections to Fortran08 signatures of collectives
Corrected the signatures of the collectives used by the Fortran 2008
interface to state correct intent for inout arguments and use the
ASYNCHRONOUS attribute in non-blocking collective calls. Also corrected
the C-bindings in Fortran accordingly

Signed-off-by: Philipp Otte <philipp.j.otte@googlemail.com>
(cherry picked from commit e98d794e8b49ca0f6cfac6b36be2528d7ef7ab67)
2018-09-26 12:34:46 -07:00

42 строки
2.1 KiB
Fortran

! -*- f90 -*-
!
! Copyright (c) 2009-2013 Cisco Systems, Inc. All rights reserved.
! Copyright (c) 2009-2012 Los Alamos National Security, LLC.
! All rights reserved.
! Copyright (c) 2018 Research Organization for Information Science
! and Technology (RIST). All rights reserved.
! $COPYRIGHT$
#include "ompi/mpi/fortran/configure-fortran-output.h"
subroutine MPI_Ialltoallw_f08(sendbuf,sendcounts,sdispls,sendtypes,&
recvbuf,recvcounts,rdispls,recvtypes,comm,request,ierror)
use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
use :: ompi_mpifh_bindings, only : ompi_ialltoallw_f
implicit none
OMPI_FORTRAN_IGNORE_TKR_TYPE, INTENT(IN), ASYNCHRONOUS :: sendbuf
OMPI_FORTRAN_IGNORE_TKR_TYPE, ASYNCHRONOUS :: recvbuf
INTEGER, INTENT(IN), ASYNCHRONOUS :: sendcounts(*), sdispls(*), recvcounts(*), rdispls(*)
TYPE(MPI_Datatype), INTENT(IN), ASYNCHRONOUS :: sendtypes(*)
TYPE(MPI_Datatype), INTENT(IN), ASYNCHRONOUS :: recvtypes(*)
TYPE(MPI_Comm), INTENT(IN) :: comm
TYPE(MPI_Request), INTENT(OUT) :: request
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
integer :: c_ierror
! Note that we pass a scalar here for both the sendtypes and
! 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
end subroutine MPI_Ialltoallw_f08