Skip to content

Commit

Permalink
Add missing MPI_Status conversion subroutines
Browse files Browse the repository at this point in the history
Only in C bindings:
 - MPI_Status_c2f08()
 - MPI_Status_f082c()

In all bindings but mpif.h
 - MPI_Status_f082f()
 - MPI_Status_f2f08()

and the PMPI_* related subroutines

As initially inteded by the MPI forum, the Fortran to/from Fortran 2008
conversion subtoutines are *not* implemented in the mpif.h bindings.
See the discussion at mpi-forum/mpi-issues#298

Refs. open-mpi#1475

Signed-off-by: Gilles Gouaillardet <[email protected]>
  • Loading branch information
ggouaillardet committed Jul 22, 2020
1 parent e93161f commit 6bc34ec
Show file tree
Hide file tree
Showing 32 changed files with 882 additions and 35 deletions.
31 changes: 17 additions & 14 deletions config/ompi_setup_mpi_fortran.m4
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,10 @@ AC_DEFUN([OMPI_SETUP_MPI_FORTRAN],[
[OMPI_TRY_FORTRAN_BINDINGS=$OMPI_FORTRAN_MPIFH_BINDINGS
AC_MSG_RESULT([no])])

OMPI_FORTRAN_CHECK_BIND_C_TYPE(
[OMPI_FORTRAN_HAVE_BIND_C_TYPE=1],
[OMPI_FORTRAN_HAVE_BIND_C_TYPE=0])

#---------------------------------
# Fortran use mpi_f08 MPI bindings
#---------------------------------
Expand Down Expand Up @@ -422,14 +426,11 @@ AC_DEFUN([OMPI_SETUP_MPI_FORTRAN],[
[OMPI_FORTRAN_HAVE_BIND_C_SUB=0
OMPI_BUILD_FORTRAN_BINDINGS=$OMPI_FORTRAN_USEMPI_BINDINGS])])

OMPI_FORTRAN_HAVE_BIND_C_TYPE=0
AS_IF([test $OMPI_TRY_FORTRAN_BINDINGS -ge $OMPI_FORTRAN_USEMPIF08_BINDINGS && \
test $OMPI_BUILD_FORTRAN_BINDINGS -ge $OMPI_FORTRAN_USEMPIF08_BINDINGS],
[ # If we don't have TYPE, BIND(C), we won't build mpi_f08 at all
OMPI_FORTRAN_CHECK_BIND_C_TYPE(
[OMPI_FORTRAN_HAVE_BIND_C_TYPE=1],
[OMPI_FORTRAN_HAVE_BIND_C_TYPE=0
OMPI_BUILD_FORTRAN_BINDINGS=$OMPI_FORTRAN_USEMPI_BINDINGS])])
AS_IF([test $OMPI_FORTRAN_HAVE_BIND_C_TYPE -ne 1],
[OMPI_BUILD_FORTRAN_BINDINGS=$OMPI_FORTRAN_USEMPI_BINDINGS])])

# Per discussion on the devel list starting here:
# https://www.open-mpi.org/community/lists/devel/2014/01/13799.php
Expand Down Expand Up @@ -701,6 +702,17 @@ end type test_mpi_handle],
AM_CONDITIONAL(OMPI_BUILD_FORTRAN_USEMPI_IGNORE_TKR_BINDINGS,
[test $OMPI_BUILD_FORTRAN_BINDINGS -ge $OMPI_FORTRAN_USEMPI_BINDINGS && \
test $OMPI_FORTRAN_HAVE_IGNORE_TKR -eq 1])
# True if we support TYPE, BIND(C)
AC_DEFINE_UNQUOTED(OMPI_FORTRAN_HAVE_BIND_C_TYPE,
[$OMPI_FORTRAN_HAVE_BIND_C_TYPE],
[For ompi_info: Whether the compiler supports TYPE, BIND(C) or not])
AC_SUBST(OMPI_FORTRAN_HAVE_BIND_C_TYPE)

# For mpif-status.h, configure-fortran-output.h, mpi-f08-types.F90 (and ompi_info)
AC_SUBST([OMPI_FORTRAN_HAVE_PRIVATE])
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_HAVE_PRIVATE],
[$OMPI_FORTRAN_HAVE_PRIVATE],
[For mpif-status.h, mpi-f08-types.f90 and ompi_info: whether the compiler supports the "private" keyword or not (used in MPI_Status)])

# -------------------
# use mpi_f08 final setup
Expand Down Expand Up @@ -749,22 +761,13 @@ end type test_mpi_handle],
AC_DEFINE_UNQUOTED(OMPI_FORTRAN_HAVE_BIND_C_SUB,
[$OMPI_FORTRAN_HAVE_BIND_C_SUB],
[For ompi_info: Whether the compiler supports SUBROUTINE ... BIND(C) or not])
AC_DEFINE_UNQUOTED(OMPI_FORTRAN_HAVE_BIND_C_TYPE,
[$OMPI_FORTRAN_HAVE_BIND_C_TYPE],
[For ompi_info: Whether the compiler supports TYPE, BIND(C) or not])
AC_DEFINE_UNQUOTED(OMPI_FORTRAN_HAVE_BIND_C_TYPE_NAME,
[$OMPI_FORTRAN_HAVE_BIND_C_TYPE_NAME],
[For ompi_info: Whether the compiler supports TYPE, BIND(C, NAME="name") or not])
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_HAVE_OPTIONAL_ARGS],
[$OMPI_FORTRAN_HAVE_OPTIONAL_ARGS],
[For ompi_info: whether the Fortran compiler supports optional arguments or not])

# For configure-fortran-output.h, mpi-f08-types.F90 (and ompi_info)
AC_SUBST([OMPI_FORTRAN_HAVE_PRIVATE])
AC_DEFINE_UNQUOTED([OMPI_FORTRAN_HAVE_PRIVATE],
[$OMPI_FORTRAN_HAVE_PRIVATE],
[For mpi-f08-types.f90 and ompi_info: whether the compiler supports the "private" keyword or not (used in MPI_Status)])

# For configure-fortran-output.h, mpi-f08-interfaces-callbacks.F90
# (and ompi_info)
AC_SUBST([OMPI_FORTRAN_HAVE_ABSTRACT])
Expand Down
18 changes: 16 additions & 2 deletions ompi/include/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
# All rights reserved.
# Copyright (c) 2006-2015 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2009-2011 Oak Ridge National Labs. All rights reserved.
# Copyright (c) 2014-2015 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2014-2020 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
# $COPYRIGHT$
#
Expand Down Expand Up @@ -54,6 +54,7 @@ nodist_include_HEADERS = \
mpif.h \
mpif-ext.h \
mpif-sizeof.h \
mpif-status.h \
mpif-c-constants-decl.h \
mpi_portable_platform.h

Expand Down Expand Up @@ -92,6 +93,18 @@ mpif-sizeof.h:
--complex4=$(OMPI_HAVE_FORTRAN_COMPLEX4) \
--complex32=$(OMPI_HAVE_FORTRAN_COMPLEX32)

#
# mpif-status.h is generated based on some results from configure tests.
#

status_pl=$(top_srcdir)/ompi/mpi/fortran/base/gen-mpi-status.pl
mpif-status.h: $(top_builddir)/config.status
mpif-status.h: $(sizeof_pl)
mpif-status.h:
$(OMPI_V_GEN) $(status_pl) \
--mpi_status=$(OMPI_FORTRAN_HAVE_BIND_C_TYPE) \
--private=$(OMPI_FORTRAN_HAVE_PRIVATE)

#
# mpif-c-constants-decl.h, among other files, is generated based on some
# results from configure tests.
Expand Down Expand Up @@ -124,6 +137,7 @@ CLEANFILES = mpif-sizeof.f90
distclean-local:
rm -f mpi-ext.h mpif-ext.h mpi_portable_platform.h \
mpif-sizeof.h \
mpif-status.h \
mpif-c-constants-decl.h mpif-c-constants.h mpif-f08-types.h

mpi_portable_platform.h: $(top_srcdir)/opal/include/opal/opal_portable_platform.h
Expand Down
9 changes: 9 additions & 0 deletions ompi/include/mpi.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -411,6 +411,7 @@ typedef struct ompi_op_t *MPI_Op;
typedef struct ompi_request_t *MPI_Request;
typedef struct ompi_message_t *MPI_Message;
typedef struct ompi_status_public_t MPI_Status;
typedef struct ompi_f08_status_public_t MPI_F08_status;
typedef struct ompi_win_t *MPI_Win;
typedef struct mca_base_var_enum_t *MPI_T_enum;
typedef struct ompi_mpit_cvar_handle_t *MPI_T_cvar_handle;
Expand Down Expand Up @@ -1779,7 +1780,11 @@ OMPI_DECLSPEC int MPI_Ssend(const void *buf, int count, MPI_Datatype datatype,
OMPI_DECLSPEC int MPI_Start(MPI_Request *request);
OMPI_DECLSPEC int MPI_Startall(int count, MPI_Request array_of_requests[]);
OMPI_DECLSPEC int MPI_Status_c2f(const MPI_Status *c_status, MPI_Fint *f_status);
OMPI_DECLSPEC int MPI_Status_c2f08(const MPI_Status *c_status, MPI_F08_status *f08_status);
OMPI_DECLSPEC int MPI_Status_f082c(const MPI_F08_status *f08_status, MPI_Status *c_status);
OMPI_DECLSPEC int MPI_Status_f082f(const MPI_F08_status *f08_status, MPI_Fint *f_status);
OMPI_DECLSPEC int MPI_Status_f2c(const MPI_Fint *f_status, MPI_Status *c_status);
OMPI_DECLSPEC int MPI_Status_f2f08(const MPI_Fint *f_status, MPI_F08_status *f08_status);
OMPI_DECLSPEC int MPI_Status_set_cancelled(MPI_Status *status, int flag);
OMPI_DECLSPEC int MPI_Status_set_elements(MPI_Status *status, MPI_Datatype datatype,
int count);
Expand Down Expand Up @@ -2440,7 +2445,11 @@ OMPI_DECLSPEC int PMPI_Ssend(const void *buf, int count, MPI_Datatype datatype,
OMPI_DECLSPEC int PMPI_Start(MPI_Request *request);
OMPI_DECLSPEC int PMPI_Startall(int count, MPI_Request array_of_requests[]);
OMPI_DECLSPEC int PMPI_Status_c2f(const MPI_Status *c_status, MPI_Fint *f_status);
OMPI_DECLSPEC int PMPI_Status_c2f08(const MPI_Status *c_status, MPI_F08_status *f08_status);
OMPI_DECLSPEC int PMPI_Status_f082f(const MPI_F08_status *f08_status, MPI_Fint *f_status);
OMPI_DECLSPEC int PMPI_Status_f082c(const MPI_F08_status *f08_status, MPI_Status *c_status);
OMPI_DECLSPEC int PMPI_Status_f2c(const MPI_Fint *f_status, MPI_Status *c_status);
OMPI_DECLSPEC int PMPI_Status_f2f08(const MPI_Fint *f_status, MPI_F08_status *f08_status);
OMPI_DECLSPEC int PMPI_Status_set_cancelled(MPI_Status *status, int flag);
OMPI_DECLSPEC int PMPI_Status_set_elements(MPI_Status *status, MPI_Datatype datatype,
int count);
Expand Down
8 changes: 6 additions & 2 deletions ompi/mpi/c/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
# Copyright (c) 2012-2013 Inria. All rights reserved.
# Copyright (c) 2013-2018 Los Alamos National Security, LLC. All rights
# reserved.
# Copyright (c) 2015-2018 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2015-2020 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
Expand Down Expand Up @@ -339,7 +339,11 @@ libmpi_c_mpi_la_SOURCES = \
start.c \
startall.c \
status_c2f.c \
status_c2f08.c \
status_f082c.c \
status_f082f.c \
status_f2c.c \
status_f2f08.c \
status_set_cancelled.c \
status_set_elements.c \
status_set_elements_x.c \
Expand Down
4 changes: 4 additions & 0 deletions ompi/mpi/c/profile/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,10 @@ nodist_libmpi_c_pmpi_la_SOURCES = \
pstart.c \
pstartall.c \
pstatus_c2f.c \
pstatus_c2f08.c \
pstatus_f082c.c \
pstatus_f082f.c \
pstatus_f2f08.c \
pstatus_f2c.c \
pstatus_set_cancelled.c \
pstatus_set_elements.c \
Expand Down
86 changes: 86 additions & 0 deletions ompi/mpi/c/status_c2f08.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2013 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2015-2020 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"
#include <stdio.h>

#include "ompi/mpi/c/bindings.h"
#include "ompi/runtime/params.h"
#include "ompi/communicator/communicator.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/mpi/fortran/base/fint_2_int.h"
#include "ompi/mpi/fortran/base/constants.h"
#include "ompi/memchecker.h"

#if OMPI_BUILD_MPI_PROFILING
#if OPAL_HAVE_WEAK_SYMBOLS
#pragma weak MPI_Status_c2f08 = PMPI_Status_c2f08
#endif
#define MPI_Status_c2f08 PMPI_Status_c2f08
#endif

static const char FUNC_NAME[] = "MPI_Status_c2f08";


int MPI_Status_c2f08(const MPI_Status *c_status, MPI_F08_status *f08_status)
{
const int *c_ints;
MEMCHECKER(
if(c_status != MPI_STATUSES_IGNORE) {
/*
* Before checking the complete status, we need to reset the definedness
* of the MPI_ERROR-field (single-completion calls wait/test).
*/
opal_memchecker_base_mem_defined((void*)&c_status->MPI_ERROR, sizeof(int));
memchecker_status(c_status);
}
);

OPAL_CR_NOOP_PROGRESS();

if (MPI_PARAM_CHECK) {
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);

/* MPI-2:4.12.5 says that if you pass in
MPI_STATUS[ES]_IGNORE, it's erroneous */

if (NULL == c_status || MPI_STATUS_IGNORE == c_status ||
MPI_STATUSES_IGNORE == c_status || NULL == f08_status) {
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD,
MPI_ERR_IN_STATUS, FUNC_NAME);
}
}

/* ***NOTE*** See huge comment in status_c2f.c (yes, I know
there's a size_t member in the C MPI_Status -- go
read that comment for an explanation why copying
everything as a bunch of int's is ok). */
f08_status->MPI_SOURCE = OMPI_INT_2_FINT(c_status->MPI_SOURCE);
f08_status->MPI_TAG = OMPI_INT_2_FINT(c_status->MPI_TAG);
f08_status->MPI_ERROR = OMPI_INT_2_FINT(c_status->MPI_ERROR);
c_ints = (const int *)c_status + 3;
for(int i = 0; i < (int)(sizeof(MPI_Status) / sizeof(int) - 3); i++ )
f08_status->internal[i] = OMPI_INT_2_FINT(c_ints[i]);

return MPI_SUCCESS;
}
84 changes: 84 additions & 0 deletions ompi/mpi/c/status_f082c.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
/*
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2010-2012 Cisco Systems, Inc. All rights reserved.
* Copyright (c) 2013 Los Alamos National Security, LLC. All rights
* reserved.
* Copyright (c) 2015-2020 Research Organization for Information Science
* and Technology (RIST). All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "ompi_config.h"

#include "ompi/mpi/c/bindings.h"
#include "ompi/runtime/params.h"
#include "ompi/communicator/communicator.h"
#include "ompi/errhandler/errhandler.h"
#include "ompi/mpi/fortran/base/fint_2_int.h"
#include "ompi/mpi/fortran/base/constants.h"

#if OMPI_BUILD_MPI_PROFILING
#if OPAL_HAVE_WEAK_SYMBOLS
#pragma weak MPI_Status_f082c = PMPI_Status_f082c
#endif
#define MPI_Status_f082c PMPI_Status_f082c
#endif

static const char FUNC_NAME[] = "MPI_Status_f082c";


int MPI_Status_f082c(const MPI_F08_status *f08_status, MPI_Status *c_status)
{
int *c_ints;
OPAL_CR_NOOP_PROGRESS();

if (MPI_PARAM_CHECK) {
OMPI_ERR_INIT_FINALIZE(FUNC_NAME);

/* MPI-2:4.12.5 says that if you pass in
MPI_STATUS[ES]_IGNORE, it's erroneous */

if (NULL == f08_status ||
#if OMPI_BUILD_FORTRAN_BINDINGS
/* This section is #if'ed out if we are not building the
fortran bindings because these macros check values
against constants that only exist if the fortran
bindings exist. */
OMPI_IS_FORTRAN_STATUS_IGNORE(f08_status) ||
OMPI_IS_FORTRAN_STATUSES_IGNORE(f08_status) ||
#endif
NULL == c_status) {
return OMPI_ERRHANDLER_INVOKE(MPI_COMM_WORLD,
MPI_ERR_IN_STATUS, FUNC_NAME);
}
}

/* ***NOTE*** See huge comment in status_c2f.c (yes, I know
there's a size_t member in the C MPI_Status -- go
read that comment for an explanation why copying
everything as a bunch of int's is ok).
We can't use OMPI_FINT_2_INT here because of some complications
with include files. :-( So just do the casting manually. */
c_status->MPI_SOURCE = (int)f08_status->MPI_SOURCE;
c_status->MPI_TAG = (int)f08_status->MPI_TAG;
c_status->MPI_ERROR = (int)f08_status->MPI_ERROR;
c_ints = (int *)c_status + 3;
for(int i=0; i < (int)(sizeof(MPI_Status) / sizeof(int) - 3); i++)
c_ints[i] = (int)f08_status->internal[i];

return MPI_SUCCESS;
}
Loading

0 comments on commit 6bc34ec

Please sign in to comment.