Yet Another eXchange Tool 0.11.3
Loading...
Searching...
No Matches
xt_redist_single_array_base.c
Go to the documentation of this file.
1
12/*
13 * Keywords:
14 * Maintainer: Jörg Behrens <behrens@dkrz.de>
15 * Moritz Hanke <hanke@dkrz.de>
16 * Thomas Jahns <jahns@dkrz.de>
17 * URL: https://dkrz-sw.gitlab-pages.dkrz.de/yaxt/
18 *
19 * Redistribution and use in source and binary forms, with or without
20 * modification, are permitted provided that the following conditions are
21 * met:
22 *
23 * Redistributions of source code must retain the above copyright notice,
24 * this list of conditions and the following disclaimer.
25 *
26 * Redistributions in binary form must reproduce the above copyright
27 * notice, this list of conditions and the following disclaimer in the
28 * documentation and/or other materials provided with the distribution.
29 *
30 * Neither the name of the DKRZ GmbH nor the names of its contributors
31 * may be used to endorse or promote products derived from this software
32 * without specific prior written permission.
33 *
34 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
35 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
36 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
37 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
38 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
39 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
40 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
41 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
42 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
43 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
44 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
45 */
46#ifdef HAVE_CONFIG_H
47#include <config.h>
48#endif
49
50#include <stdlib.h>
51#include <stdio.h>
52#include <assert.h>
53#include <mpi.h>
54
55#include "xt/xt_mpi.h"
56#include "xt_mpi_internal.h"
58#include "xt_redist_internal.h"
59#include "xt/xt_xmap.h"
60#include "xt/xt_idxlist.h"
61#include "xt/xt_request.h"
62#include "core/ppm_xfuncs.h"
63#include "core/core.h"
64#include "xt_exchanger.h"
65#include "xt_config_internal.h"
66
67
68
69static const char filename[] = "xt_redist_single_array_base.c";
70
71static Xt_redist
73
74static void
76
77static void
78redist_sab_s_exchange(Xt_redist redist, int num_arrays,
79 const void *const *src_data, void *const *dst_data);
80
81static void
82redist_sab_a_exchange(Xt_redist redist, int num_arrays,
83 const void *const *src_data, void *const *dst_data,
84 Xt_request *request);
85
86static void
87redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data);
88
89static void
90redist_sab_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data,
91 Xt_request *request);
92
93static int redist_sab_get_num_msg(Xt_redist redist,
94 enum xt_msg_direction direction);
95
96static MPI_Datatype
98 enum xt_msg_direction direction,
99 bool do_dup);
100
101static int
103 enum xt_msg_direction direction,
104 int *restrict *ranks);
105
106static MPI_Comm
108
109static const struct xt_redist_vtable redist_sab_vtable = {
110 .copy = redist_sab_copy,
111 .delete = redist_sab_delete,
112 .s_exchange = redist_sab_s_exchange,
113 .a_exchange = redist_sab_a_exchange,
114 .s_exchange1 = redist_sab_s_exchange1,
115 .a_exchange1 = redist_sab_a_exchange1,
116 .get_num_msg = redist_sab_get_num_msg,
117 .get_msg_MPI_Datatype = redist_sab_get_MPI_Datatype,
118 .get_msg_ranks = redist_sab_get_msg_ranks,
119 .get_MPI_Comm = redist_sab_get_MPI_Comm
120};
121
123
135
137 const struct Xt_redist_msg *send_msgs,
138 const struct Xt_redist_msg *recv_msgs,
139 MPI_Comm comm)
140{
141 return xt_redist_single_array_base_custom_new(nsend, nrecv, send_msgs,
142 recv_msgs, comm,
144}
145
147 int nsend, int nrecv,
148 const struct Xt_redist_msg *send_msgs,
149 const struct Xt_redist_msg *recv_msgs,
150 MPI_Comm comm, Xt_config config)
151{
152 // ensure that yaxt is initialized
153 assert(xt_initialized());
154
155 Xt_redist_sab redist = xmalloc(sizeof (*redist));
156
157 redist->comm = xt_mpi_comm_smart_dup(comm, &redist->tag_offset);
158 Xt_exchanger_new exchanger_new
159 = xt_config_get_exchange_new_by_comm(config, redist->comm);
160 redist->exchanger
161 = exchanger_new(nsend, nrecv, send_msgs, recv_msgs,
162 redist->comm, redist->tag_offset, config);
163
164 redist->vtable = &redist_sab_vtable;
165 redist->nmsg[SEND] = nsend;
166 redist->nmsg[RECV] = nrecv;
167 return (Xt_redist)redist;
168}
169
170static inline Xt_redist_sab
171xrsab(void *redist)
172{
173 return (Xt_redist_sab)redist;
174}
175
176static Xt_redist
178{
179 Xt_redist_sab redist_sab = xrsab(redist);
180 Xt_redist_sab redist_sab_new = xmalloc(sizeof *redist_sab_new);
181 redist_sab_new->vtable = redist_sab->vtable;
182 for (size_t i = 0; i < 2; ++i)
183 redist_sab_new->nmsg[i] = redist_sab->nmsg[i];
184 redist_sab_new->comm = xt_mpi_comm_smart_dup(redist_sab->comm,
185 &redist_sab_new->tag_offset);
186 redist_sab_new->exchanger
187 = xt_exchanger_copy(redist_sab->exchanger, redist_sab_new->comm,
188 redist_sab_new->tag_offset);
189 return (Xt_redist)redist_sab_new;
190}
191
192static void
194
195 Xt_redist_sab redist_sab = xrsab(redist);
196
197 xt_exchanger_delete(redist_sab->exchanger);
198
199 xt_mpi_comm_smart_dedup(&redist_sab->comm, redist_sab->tag_offset);
200
201 free(redist_sab);
202}
203
204static void
205redist_sab_s_exchange(Xt_redist redist, int num_arrays,
206 const void *const *src_data, void *const *dst_data)
207{
208 Xt_redist_sab redist_rep = xrsab(redist);
209 if (num_arrays == 1)
210 redist_sab_s_exchange1(redist, src_data[0], dst_data[0]);
211 else
212 Xt_abort(redist_rep->comm, "ERROR: multi-array s_exchange is not"
213 " implemented for this xt_redist type "
214 "(Xt_redist_single_array_base)", filename, __LINE__);
215}
216
217static void
218redist_sab_a_exchange(Xt_redist redist, int num_arrays,
219 const void *const *src_data, void *const *dst_data,
220 Xt_request *request)
221{
222 Xt_redist_sab redist_rep = xrsab(redist);
223 if (num_arrays == 1)
224 redist_sab_a_exchange1(redist, src_data[0], dst_data[0], request);
225 else
226 Xt_abort(redist_rep->comm, "ERROR: multi-array a_exchange is not"
227 " implemented for this xt_redist type "
228 "(Xt_redist_single_array_base)", filename, __LINE__);
229}
230
231static void
232redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data) {
233
234 Xt_redist_sab redist_sab = xrsab(redist);
235
236 xt_exchanger_s_exchange(redist_sab->exchanger, src_data, dst_data);
237}
238
239static void
240redist_sab_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data,
241 Xt_request *request) {
242
243 Xt_redist_sab redist_sab = xrsab(redist);
244
245 xt_exchanger_a_exchange(redist_sab->exchanger, src_data, dst_data, request);
246}
247
249 enum xt_msg_direction direction)
250{
251 return xrsab(redist)->nmsg[direction];
252}
253
254static MPI_Datatype
256 enum xt_msg_direction direction,
257 bool do_dup)
258{
259 return xt_exchanger_get_MPI_Datatype(xrsab(redist)->exchanger, rank,
260 direction, do_dup);
261}
262
263static int
265 enum xt_msg_direction direction,
266 int *restrict *ranks)
267{
268 return xt_exchanger_get_msg_ranks(xrsab(redist)->exchanger, direction, ranks);
269}
270
271static MPI_Comm
273
274 Xt_redist_sab redist_sab = xrsab(redist);
275
276 return redist_sab->comm;
277}
278
279/*
280 * Local Variables:
281 * c-basic-offset: 2
282 * coding: utf-8
283 * indent-tabs-mode: nil
284 * show-trailing-whitespace: t
285 * require-trailing-newline: t
286 * End:
287 */
int MPI_Comm
Definition core.h:64
add versions of standard API functions not returning on error
#define xmalloc(size)
Definition ppm_xfuncs.h:70
const struct xt_redist_vtable * vtable
static const char filename[]
Definition xt_config.c:76
Xt_exchanger_new xt_config_get_exchange_new_by_comm(Xt_config config, MPI_Comm comm)
Definition xt_config.c:158
struct Xt_config_ xt_default_config
Definition xt_config.c:204
struct Xt_config_ * Xt_config
Definition xt_config.h:58
implementation of configuration object
int xt_initialized(void)
struct Xt_redist_ * Xt_redist
Definition xt_core.h:86
void xt_exchanger_s_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data)
int xt_exchanger_get_msg_ranks(Xt_exchanger exchanger, enum xt_msg_direction direction, int *restrict *ranks)
void xt_exchanger_a_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data, Xt_request *request)
void xt_exchanger_delete(Xt_exchanger exchanger)
Xt_exchanger xt_exchanger_copy(Xt_exchanger exchanger, MPI_Comm new_comm, int new_tag_offset)
MPI_Datatype xt_exchanger_get_MPI_Datatype(Xt_exchanger exchanger, int rank, enum xt_msg_direction direction, bool do_dup)
exchanging of data based on information provided by redist's
struct Xt_exchanger_ * Xt_exchanger
Xt_exchanger(* Xt_exchanger_new)(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
index list declaration
MPI_Comm xt_mpi_comm_smart_dup(MPI_Comm comm, int *tag_offset)
Definition xt_mpi.c:333
void xt_mpi_comm_smart_dedup(MPI_Comm *comm, int tag_offset)
Definition xt_mpi.c:386
utility routines for MPI
redistribution of data, non-public declarations
xt_msg_direction
static int redist_sab_get_num_msg(Xt_redist redist, enum xt_msg_direction direction)
struct Xt_redist_sab_ * Xt_redist_sab
static void redist_sab_s_exchange(Xt_redist redist, int num_arrays, const void *const *src_data, void *const *dst_data)
static void redist_sab_a_exchange(Xt_redist redist, int num_arrays, const void *const *src_data, void *const *dst_data, Xt_request *request)
static Xt_redist redist_sab_copy(Xt_redist redist)
Xt_redist xt_redist_single_array_base_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
static const struct xt_redist_vtable redist_sab_vtable
static Xt_redist_sab xrsab(void *redist)
static void redist_sab_delete(Xt_redist redist)
static MPI_Comm redist_sab_get_MPI_Comm(Xt_redist redist)
static void redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data)
static MPI_Datatype redist_sab_get_MPI_Datatype(Xt_redist redist, int rank, enum xt_msg_direction direction, bool do_dup)
static void redist_sab_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data, Xt_request *request)
Xt_redist xt_redist_single_array_base_custom_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, Xt_config config)
static int redist_sab_get_msg_ranks(Xt_redist redist, enum xt_msg_direction direction, int *restrict *ranks)
struct Xt_request_ * Xt_request
Definition xt_request.h:51
exchange map declarations