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 25, 2020
1 parent a876ef6 commit 0fda51a
Show file tree
Hide file tree
Showing 36 changed files with 930 additions and 64 deletions.
6 changes: 4 additions & 2 deletions config/ompi_config_files.m4
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# -*- shell-script -*-
#
# Copyright (c) 2009-2020 Cisco Systems, Inc. All rights reserved
# Copyright (c) 2017-2018 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2017-2020 Research Organization for Information Science
# and Technology (RIST). All rights reserved.
# Copyright (c) 2018 Los Alamos National Security, LLC. All rights
# reserved.
# Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
Expand All @@ -29,6 +29,8 @@ AC_DEFUN([OMPI_CONFIG_FILES],[
ompi/mpi/fortran/base/Makefile
ompi/mpi/fortran/mpif-h/Makefile
ompi/mpi/fortran/mpif-h/profile/Makefile
ompi/mpi/fortran/use-mpi/Makefile
ompi/mpi/fortran/use-mpi/mpi-types.F90
ompi/mpi/fortran/use-mpi-tkr/Makefile
ompi/mpi/fortran/use-mpi-tkr/fortran_sizes.h
ompi/mpi/fortran/use-mpi-tkr/fortran_kinds.sh
Expand Down
33 changes: 19 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,19 @@ 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)
AM_CONDITIONAL(OMPI_FORTRAN_HAVE_BIND_C_TYPE,
[test $OMPI_FORTRAN_HAVE_BIND_C_TYPE -eq 1])

# 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 TYPE(MPI_Status))])

# -------------------
# use mpi_f08 final setup
Expand Down Expand Up @@ -749,22 +763,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
5 changes: 3 additions & 2 deletions ompi/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
# Copyright (c) 2013-2015 Los Alamos National Security, LLC. All rights
# reserved.
# Copyright (c) 2015-2019 Intel, Inc. 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 (c) 2016 IBM Corporation. All rights reserved.
# Copyright (c) 2018 FUJITSU LIMITED. All rights reserved.
# $COPYRIGHT$
Expand Down Expand Up @@ -88,6 +88,7 @@ SUBDIRS = \
. \
$(OMPI_MPIEXT_MPIFH_DIRS) \
mpi/fortran/mpif-h \
mpi/fortran/use-mpi \
$(OMPI_MPIEXT_USEMPI_DIR) \
$(OMPI_FORTRAN_USEMPI_DIR) \
mpi/fortran/mpiext-use-mpi \
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
8 changes: 6 additions & 2 deletions ompi/mpi/c/profile/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@
# Copyright (c) 2012-2013 Inria. All rights reserved.
# Copyright (c) 2013 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 @@ -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 0fda51a

Please sign in to comment.