Skip to content

Commit 22e2b20

Browse files
committed
fortran/use-mpi-f08: add CFI support for isendrecv
and isendrecv_replace Signed-off-by: Howard Pritchard <[email protected]>
1 parent 37b9207 commit 22e2b20

File tree

7 files changed

+175
-8
lines changed

7 files changed

+175
-8
lines changed

ompi/mpi/fortran/use-mpi-f08/bindings/mpi-f-interfaces-bind.h.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ end subroutine ompi_isend_f
273273

274274
subroutine ompi_isendrecv_f(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf, &
275275
recvcount,recvtype,source,recvtag,comm,request,ierror) &
276-
BIND(C, name="ompi_isendrecv_f")
276+
BIND(C, name="ompi_isendrecv_@OMPI_F08_BINDINGS_EXTENSION@")
277277
implicit none
278278
OMPI_F08_IGNORE_TKR_TYPE, INTENT(IN) :: sendbuf
279279
OMPI_F08_IGNORE_TKR_TYPE :: recvbuf
@@ -287,7 +287,7 @@ end subroutine ompi_isendrecv_f
287287

288288
subroutine ompi_isendrecv_replace_f(buf,count,datatype,dest,sendtag,source, &
289289
recvtag,comm,request,ierror) &
290-
BIND(C, name="ompi_isendrecv_replace_f")
290+
BIND(C, name="ompi_isendrecv_replace_@OMPI_F08_BINDINGS_EXTENSION@")
291291
implicit none
292292
OMPI_F08_IGNORE_TKR_TYPE :: buf
293293
INTEGER, INTENT(IN) :: count, dest, sendtag, source, recvtag

ompi/mpi/fortran/use-mpi-f08/mod/mpi-f08-interfaces.h.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ end subroutine MPI_Isend_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
155155
end interface MPI_Isend
156156

157157
interface MPI_Isendrecv
158-
subroutine MPI_Isendrecv_f08(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf, &
158+
subroutine MPI_Isendrecv_f08@OMPI_F08_BINDINGS_TS_SUFFIX@(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf, &
159159
recvcount,recvtype,source,recvtag,comm,request,ierror)
160160
use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
161161
implicit none
@@ -167,11 +167,11 @@ subroutine MPI_Isendrecv_f08(sendbuf,sendcount,sendtype,dest,sendtag,recvbuf, &
167167
TYPE(MPI_Comm), INTENT(IN) :: comm
168168
TYPE(MPI_Request), INTENT(OUT) :: request
169169
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
170-
end subroutine MPI_Isendrecv_f08
170+
end subroutine MPI_Isendrecv_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
171171
end interface MPI_Isendrecv
172172

173173
interface MPI_Isendrecv_replace
174-
subroutine MPI_Isendrecv_replace_f08(buf,count,datatype,dest,sendtag,source,recvtag, &
174+
subroutine MPI_Isendrecv_replace_f08@OMPI_F08_BINDINGS_TS_SUFFIX@(buf,count,datatype,dest,sendtag,source,recvtag, &
175175
comm,request,ierror)
176176
use :: mpi_f08_types, only : MPI_Datatype, MPI_Comm, MPI_Request
177177
implicit none
@@ -182,7 +182,7 @@ subroutine MPI_Isendrecv_replace_f08(buf,count,datatype,dest,sendtag,source,recv
182182
TYPE(MPI_Comm), INTENT(IN) :: comm
183183
TYPE(MPI_Request), INTENT(OUT) :: request
184184
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
185-
end subroutine MPI_Isendrecv_replace_f08
185+
end subroutine MPI_Isendrecv_replace_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
186186
end interface MPI_Isendrecv_replace
187187

188188
interface MPI_Issend

ompi/mpi/fortran/use-mpi-f08/mod/mpi-f08-rename.h.in

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@
3535
#define MPI_Isend_f08 PMPI_Isend_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
3636
#define MPI_Isend_f08ts PMPI_Isend_f08ts
3737
#define MPI_Isendrecv PMPI_Isendrecv
38-
#define MPI_Isendrecv_f08 PMPI_Isendrecv_f08
38+
#define MPI_Isendrecv_f08 PMPI_Isendrecv_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
39+
#define MPI_Isendrecv_f08ts PMPI_Isendrecv_f08ts
3940
#define MPI_Isendrecv_replace PMPI_Isendrecv_replace
40-
#define MPI_Isendrecv_replace_f08 PMPI_Isendrecv_replace_f08
41+
#define MPI_Isendrecv_replace_f08 PMPI_Isendrecv_replace_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
42+
#define MPI_Isendrecv_replace_f08ts PMPI_Isendrecv_replace_f08ts
4143
#define MPI_Issend PMPI_Issend
4244
#define MPI_Issend_f08 PMPI_Issend_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
4345
#define MPI_Issend_f08ts PMPI_Issend_f08ts
@@ -916,6 +918,8 @@
916918
#define MPI_Irecv_f08 MPI_Irecv_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
917919
#define MPI_Irsend_f08 MPI_Irsend_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
918920
#define MPI_Isend_f08 MPI_Isend_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
921+
#define MPI_Isendrecv_f08 MPI_Isendrecv_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
922+
#define MPI_Isendrecv_replace_f08 MPI_Isendrecv_replace_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
919923
#define MPI_Issend_f08 MPI_Issend_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
920924
#define MPI_Recv_f08 MPI_Recv_f08@OMPI_F08_BINDINGS_TS_SUFFIX@
921925
#define MPI_Recv_init_f08 MPI_Recv_init_f08@OMPI_F08_BINDINGS_TS_SUFFIX@

ompi/mpi/fortran/use-mpi-f08/ts/Makefile.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ libusempif08_ts_la_SOURCES = \
115115
iscatter_ts.c \
116116
iscatterv_ts.c \
117117
isend_ts.c \
118+
isendrecv_ts.c \
119+
isendrecv_replace_ts.c \
118120
issend_ts.c \
119121
mrecv_ts.c \
120122
neighbor_allgather_ts.c \

ompi/mpi/fortran/use-mpi-f08/ts/bindings.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@ void ompi_isend_ts(CFI_cdesc_t *x, MPI_Fint *count, MPI_Fint *datatype,
4343
MPI_Fint *dest, MPI_Fint *tag, MPI_Fint *comm,
4444
MPI_Fint *request, MPI_Fint *ierr);
4545

46+
void ompi_isendrecv_ts(CFI_cdesc_t* x1, MPI_Fint *sendcount, MPI_Fint *sendtype,
47+
MPI_Fint *dest, MPI_Fint *sendtag, CFI_cdesc_t* x2,
48+
MPI_Fint *recvcount, MPI_Fint *recvtype,
49+
MPI_Fint *source, MPI_Fint *recvtag, MPI_Fint *comm,
50+
MPI_Fint *request, MPI_Fint *ierr);
51+
52+
void ompi_isendrecv_replace_ts(CFI_cdesc_t* x, MPI_Fint *count, MPI_Fint *datatype,
53+
MPI_Fint *dest, MPI_Fint *sendtag,
54+
MPI_Fint *source, MPI_Fint *recvtag,
55+
MPI_Fint *comm, MPI_Fint *request, MPI_Fint *ierr);
56+
4657
void ompi_issend_ts(CFI_cdesc_t* x, MPI_Fint *count, MPI_Fint *datatype,
4758
MPI_Fint *dest, MPI_Fint *tag, MPI_Fint *comm,
4859
MPI_Fint *request, MPI_Fint *ierr);
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
3+
* University Research and Technology
4+
* Corporation. All rights reserved.
5+
* Copyright (c) 2004-2005 The University of Tennessee and The University
6+
* of Tennessee Research Foundation. All rights
7+
* reserved.
8+
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
9+
* University of Stuttgart. All rights reserved.
10+
* Copyright (c) 2004-2005 The Regents of the University of California.
11+
* All rights reserved.
12+
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
13+
* Copyright (c) 2015-2019 Research Organization for Information Science
14+
* and Technology (RIST). All rights reserved.
15+
* $COPYRIGHT$
16+
*
17+
* Additional copyrights may follow
18+
*
19+
* $HEADER$
20+
*/
21+
22+
#include "ompi_config.h"
23+
24+
#include "ompi/communicator/communicator.h"
25+
#include "ompi/errhandler/errhandler.h"
26+
#include "ompi/mpi/fortran/use-mpi-f08/ts/bindings.h"
27+
#include "ompi/mpi/fortran/base/constants.h"
28+
29+
static const char FUNC_NAME[] = "MPI_Isendrecv_replace";
30+
31+
void ompi_isendrecv_replace_ts(CFI_cdesc_t* x, MPI_Fint *count, MPI_Fint *datatype,
32+
MPI_Fint *dest, MPI_Fint *sendtag,
33+
MPI_Fint *source, MPI_Fint *recvtag,
34+
MPI_Fint *comm, MPI_Fint *request, MPI_Fint *ierr)
35+
{
36+
int c_ierr;
37+
MPI_Request c_req;
38+
MPI_Datatype c_datatype, c_type = PMPI_Type_f2c(*datatype);
39+
MPI_Comm c_comm = PMPI_Comm_f2c (*comm);
40+
41+
MPI_Status c_status;
42+
void *buf = x->base_addr;
43+
int c_count = OMPI_FINT_2_INT(*count);
44+
45+
OMPI_CFI_2_C(x, c_count, c_type, c_datatype, c_ierr);
46+
if (MPI_SUCCESS != c_ierr) {
47+
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
48+
OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME);
49+
return;
50+
}
51+
52+
c_ierr = PMPI_Isendrecv_replace(OMPI_F2C_BOTTOM(buf),
53+
OMPI_FINT_2_INT(*count),
54+
c_datatype,
55+
OMPI_FINT_2_INT(*dest),
56+
OMPI_FINT_2_INT(*sendtag),
57+
OMPI_FINT_2_INT(*source),
58+
OMPI_FINT_2_INT(*recvtag),
59+
c_comm, &c_req);
60+
if (c_datatype != c_type) {
61+
ompi_datatype_destroy(&c_datatype);
62+
}
63+
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
64+
65+
if (MPI_SUCCESS == c_ierr) {
66+
*request = PMPI_Request_c2f(c_req);
67+
}
68+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
/*
2+
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
3+
* University Research and Technology
4+
* Corporation. All rights reserved.
5+
* Copyright (c) 2004-2005 The University of Tennessee and The University
6+
* of Tennessee Research Foundation. All rights
7+
* reserved.
8+
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
9+
* University of Stuttgart. All rights reserved.
10+
* Copyright (c) 2004-2005 The Regents of the University of California.
11+
* All rights reserved.
12+
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
13+
* Copyright (c) 2015-2019 Research Organization for Information Science
14+
* and Technology (RIST). All rights reserved.
15+
* $COPYRIGHT$
16+
*
17+
* Additional copyrights may follow
18+
*
19+
* $HEADER$
20+
*/
21+
22+
#include "ompi_config.h"
23+
24+
#include "ompi/communicator/communicator.h"
25+
#include "ompi/errhandler/errhandler.h"
26+
#include "ompi/mpi/fortran/use-mpi-f08/ts/bindings.h"
27+
#include "ompi/mpi/fortran/base/constants.h"
28+
29+
static const char FUNC_NAME[] = "MPI_Isendrecv";
30+
31+
void ompi_isendrecv_ts(CFI_cdesc_t* x1, MPI_Fint *sendcount, MPI_Fint *sendtype,
32+
MPI_Fint *dest, MPI_Fint *sendtag, CFI_cdesc_t* x2,
33+
MPI_Fint *recvcount, MPI_Fint *recvtype,
34+
MPI_Fint *source, MPI_Fint *recvtag, MPI_Fint *comm,
35+
MPI_Fint *request, MPI_Fint *ierr)
36+
{
37+
int c_ierr;
38+
MPI_Comm c_comm = PMPI_Comm_f2c (*comm);
39+
MPI_Request c_req;
40+
MPI_Datatype c_senddatatype, c_sendtype = PMPI_Type_f2c(*sendtype);
41+
MPI_Datatype c_recvdatatype, c_recvtype = PMPI_Type_f2c(*recvtype);
42+
void *sendbuf = x1->base_addr;
43+
int c_sendcount = OMPI_FINT_2_INT(*sendcount);
44+
void *recvbuf = x2->base_addr;
45+
int c_recvcount = OMPI_FINT_2_INT(*recvcount);
46+
47+
OMPI_CFI_2_C(x1, c_sendcount, c_sendtype, c_senddatatype, c_ierr);
48+
if (MPI_SUCCESS != c_ierr) {
49+
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
50+
OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME);
51+
return;
52+
}
53+
OMPI_CFI_2_C(x2, c_recvcount, c_recvtype, c_recvdatatype, c_ierr);
54+
if (MPI_SUCCESS != c_ierr) {
55+
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
56+
if (c_senddatatype != c_sendtype) {
57+
ompi_datatype_destroy(&c_senddatatype);
58+
}
59+
OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME);
60+
return;
61+
}
62+
63+
c_ierr = PMPI_Isendrecv(OMPI_F2C_BOTTOM(sendbuf), c_sendcount,
64+
c_senddatatype,
65+
OMPI_FINT_2_INT(*dest),
66+
OMPI_FINT_2_INT(*sendtag),
67+
OMPI_F2C_BOTTOM(recvbuf), c_recvcount,
68+
c_recvdatatype, OMPI_FINT_2_INT(*source),
69+
OMPI_FINT_2_INT(*recvtag),
70+
c_comm, &c_req);
71+
if (c_senddatatype != c_sendtype) {
72+
ompi_datatype_destroy(&c_senddatatype);
73+
}
74+
if (c_recvdatatype != c_recvtype) {
75+
ompi_datatype_destroy(&c_recvdatatype);
76+
}
77+
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
78+
79+
if (MPI_SUCCESS == c_ierr) {
80+
*request = PMPI_Request_c2f(c_req);
81+
}
82+
}

0 commit comments

Comments
 (0)