12
12
* Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
13
13
* Copyright (c) 2015-2019 Research Organization for Information Science
14
14
* and Technology (RIST). All rights reserved.
15
- * Copyright (c) 2024 Triad National Security, LLC. All rights
15
+ * Copyright (c) 2024-2025 Triad National Security, LLC. All rights
16
16
* reserved.
17
17
* $COPYRIGHT$
18
18
*
@@ -27,42 +27,42 @@ PROTOTYPE VOID alltoallw(BUFFER x1, COUNT_ARRAY sendcounts,
27
27
DISP_ARRAY rdispls, DATATYPE_ARRAY recvtypes,
28
28
COMM comm)
29
29
{
30
- MPI_Comm c_comm = PMPI_Comm_f2c(*comm);
31
- MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
32
30
int size, c_ierr;
31
+ MPI_Comm c_comm = PMPI_Comm_f2c(*comm);
33
32
char *sendbuf = OMPI_CFI_BASE_ADDR(x1), *recvbuf = OMPI_CFI_BASE_ADDR(x2);
33
+ MPI_Datatype *c_sendtypes = NULL, *c_recvtypes;
34
+ @COUNT_TYPE@ *tmp_sendcounts = NULL;
35
+ @DISP_TYPE@ *tmp_sdispls = NULL;
36
+ @COUNT_TYPE@ *tmp_recvcounts = NULL;
37
+ @DISP_TYPE@ *tmp_rdispls = NULL;
34
38
35
- OMPI_ARRAY_NAME_DECL(sendcounts);
36
- OMPI_ARRAY_NAME_DECL(sdispls);
37
- OMPI_ARRAY_NAME_DECL(recvcounts);
38
- OMPI_ARRAY_NAME_DECL(rdispls);
39
+ size = OMPI_COMM_IS_INTER(c_comm)?ompi_comm_remote_size(c_comm):ompi_comm_size(c_comm);
39
40
40
- OMPI_CFI_CHECK_CONTIGUOUS(x1, c_ierr);
41
- if (MPI_SUCCESS != c_ierr) {
42
- if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
43
- OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME)
44
- return;
41
+ if (OMPI_COMM_IS_INTER(c_comm) || !OMPI_IS_FORTRAN_IN_PLACE(sendbuf)) {
42
+ OMPI_CFI_CHECK_CONTIGUOUS(x1, c_ierr);
43
+ if (MPI_SUCCESS != c_ierr) {
44
+ if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
45
+ OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME)
46
+ return;
47
+ }
48
+ c_sendtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
49
+ for (int i=0; i<size; i++) {
50
+ c_sendtypes[i] = PMPI_Type_f2c(sendtypes[i]);
51
+ }
52
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(sendcounts, tmp_sendcounts, size);
53
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(sdispls, tmp_sdispls, size);
54
+ } else {
55
+ sendbuf = MPI_IN_PLACE;
45
56
}
57
+
46
58
OMPI_CFI_CHECK_CONTIGUOUS(x2, c_ierr);
47
59
if (MPI_SUCCESS != c_ierr) {
48
60
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
49
61
OMPI_ERRHANDLER_INVOKE(c_comm, c_ierr, FUNC_NAME)
50
62
return;
51
63
}
52
- size = OMPI_COMM_IS_INTER(c_comm)?ompi_comm_remote_size(c_comm):ompi_comm_size(c_comm);
53
-
54
- if (!OMPI_IS_FORTRAN_IN_PLACE(sendbuf)) {
55
- c_sendtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
56
- OMPI_ARRAY_FINT_2_INT(sendcounts, size);
57
- OMPI_ARRAY_FINT_2_INT(sdispls, size);
58
- for (int i=0; i<size; i++) {
59
- c_sendtypes[i] = PMPI_Type_f2c(sendtypes[i]);
60
- }
61
- }
62
64
63
65
c_recvtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
64
- OMPI_ARRAY_FINT_2_INT(recvcounts, size);
65
- OMPI_ARRAY_FINT_2_INT(rdispls, size);
66
66
for (int i=0; i<size; i++) {
67
67
c_recvtypes[i] = PMPI_Type_f2c(recvtypes[i]);
68
68
}
@@ -71,20 +71,24 @@ PROTOTYPE VOID alltoallw(BUFFER x1, COUNT_ARRAY sendcounts,
71
71
sendbuf = (char *) OMPI_F2C_BOTTOM(sendbuf);
72
72
recvbuf = (char *) OMPI_F2C_BOTTOM(recvbuf);
73
73
74
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(recvcounts, tmp_recvcounts, size);
75
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_SET(rdispls, tmp_rdispls, size);
76
+
74
77
c_ierr = @INNER_CALL@(sendbuf,
75
- OMPI_ARRAY_NAME_CONVERT(sendcounts) ,
76
- OMPI_ARRAY_NAME_CONVERT(sdispls) ,
78
+ tmp_sendcounts ,
79
+ tmp_sdispls ,
77
80
c_sendtypes,
78
81
recvbuf,
79
- OMPI_ARRAY_NAME_CONVERT(recvcounts) ,
80
- OMPI_ARRAY_NAME_CONVERT(rdispls) ,
82
+ tmp_recvcounts ,
83
+ tmp_rdispls ,
81
84
c_recvtypes, c_comm);
82
85
if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr);
83
86
84
- OMPI_ARRAY_FINT_2_INT_CLEANUP(sendcounts);
85
- OMPI_ARRAY_FINT_2_INT_CLEANUP(sdispls);
86
- OMPI_ARRAY_FINT_2_INT_CLEANUP(recvcounts);
87
- OMPI_ARRAY_FINT_2_INT_CLEANUP(rdispls);
87
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(sendcounts, tmp_sendcounts);
88
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(sdispls, tmp_sdispls);
89
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(recvcounts, tmp_recvcounts);
90
+ OMPI_FORTRAN_BIGCOUNT_ARRAY_CLEANUP(rdispls, tmp_rdispls);
91
+
88
92
if (NULL != c_sendtypes) {
89
93
free(c_sendtypes);
90
94
}
0 commit comments