Yet Another eXchange Tool  0.9.0
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://doc.redmine.dkrz.de/yaxt/html/
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 static Xt_redist
69 
70 static void
72 
73 static void
74 redist_sab_s_exchange(Xt_redist redist, int num_arrays,
75  const void **src_data, void **dst_data);
76 
77 static void
78 redist_sab_a_exchange(Xt_redist redist, int num_arrays,
79  const void **src_data, void **dst_data,
80  Xt_request *request);
81 
82 static void
83 redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data);
84 
85 static void
86 redist_sab_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data,
87  Xt_request *request);
88 
89 static int redist_sab_get_num_msg(Xt_redist redist,
90  enum xt_msg_direction direction);
91 
92 static MPI_Datatype
93 redist_sab_get_MPI_Datatype(Xt_redist redist, int rank,
94  enum xt_msg_direction direction);
95 
96 static int
98  enum xt_msg_direction direction,
99  int *restrict *ranks);
100 
101 static MPI_Comm
103 
104 static const struct xt_redist_vtable redist_sab_vtable = {
106  .delete = redist_sab_delete,
107  .s_exchange = redist_sab_s_exchange,
108  .a_exchange = redist_sab_a_exchange,
109  .s_exchange1 = redist_sab_s_exchange1,
110  .a_exchange1 = redist_sab_a_exchange1,
111  .get_num_msg = redist_sab_get_num_msg,
112  .get_msg_MPI_Datatype = redist_sab_get_MPI_Datatype,
113  .get_msg_ranks = redist_sab_get_msg_ranks,
114  .get_MPI_Comm = redist_sab_get_MPI_Comm
115 };
116 
118 
120 
121  const struct xt_redist_vtable *vtable;
122 
124 
125  int nmsg[2];
126 
129 };
130 
132  const struct Xt_redist_msg *send_msgs,
133  const struct Xt_redist_msg *recv_msgs,
134  MPI_Comm comm)
135 {
136  return xt_redist_single_array_base_custom_new(nsend, nrecv, send_msgs,
137  recv_msgs, comm,
139 }
140 
142  int nsend, int nrecv,
143  const struct Xt_redist_msg *send_msgs,
144  const struct Xt_redist_msg *recv_msgs,
145  MPI_Comm comm, Xt_config config)
146 {
147  // ensure that yaxt is initialized
148  assert(xt_initialized());
149 
150  Xt_redist_sab redist = xmalloc(sizeof (*redist));
151 
152  redist->comm = xt_mpi_comm_smart_dup(comm, &redist->tag_offset);
153  redist->exchanger
154  = config->exchanger_new(nsend, nrecv, send_msgs, recv_msgs,
155  redist->comm, redist->tag_offset);
156 
157  redist->vtable = &redist_sab_vtable;
158  redist->nmsg[SEND] = nsend;
159  redist->nmsg[RECV] = nrecv;
160  return (Xt_redist)redist;
161 }
162 
163 static inline Xt_redist_sab
164 xrsab(void *redist)
165 {
166  return (Xt_redist_sab)redist;
167 }
168 
169 static Xt_redist
171 {
172  Xt_redist_sab redist_sab = xrsab(redist);
173  Xt_redist_sab redist_sab_new = xmalloc(sizeof *redist_sab_new);
174  redist_sab_new->vtable = redist_sab->vtable;
175  for (size_t i = 0; i < 2; ++i)
176  redist_sab_new->nmsg[i] = redist_sab->nmsg[i];
177  redist_sab_new->comm = xt_mpi_comm_smart_dup(redist_sab->comm,
178  &redist_sab_new->tag_offset);
179  redist_sab_new->exchanger
180  = xt_exchanger_copy(redist_sab->exchanger, redist_sab_new->comm,
181  redist_sab_new->tag_offset);
182  return (Xt_redist)redist_sab_new;
183 }
184 
185 static void
187 
188  Xt_redist_sab redist_sab = xrsab(redist);
189 
190  xt_exchanger_delete(redist_sab->exchanger);
191 
192  xt_mpi_comm_smart_dedup(&redist_sab->comm, redist_sab->tag_offset);
193 
194  free(redist_sab);
195 }
196 
197 static void
198 redist_sab_s_exchange(Xt_redist redist, int num_arrays,
199  const void **src_data, void **dst_data)
200 {
201  Xt_redist_sab redist_rep = xrsab(redist);
202  if (num_arrays == 1)
203  redist_sab_s_exchange1(redist, src_data[0], dst_data[0]);
204  else
205  Xt_abort(redist_rep->comm, "ERROR: multi-array s_exchange is not"
206  " implemented for this xt_redist type "
207  "(Xt_redist_single_array_base)", __FILE__, __LINE__);
208 }
209 
210 static void
211 redist_sab_a_exchange(Xt_redist redist, int num_arrays,
212  const void **src_data, void **dst_data,
213  Xt_request *request)
214 {
215  Xt_redist_sab redist_rep = xrsab(redist);
216  if (num_arrays == 1)
217  redist_sab_a_exchange1(redist, src_data[0], dst_data[0], request);
218  else
219  Xt_abort(redist_rep->comm, "ERROR: multi-array a_exchange is not"
220  " implemented for this xt_redist type "
221  "(Xt_redist_single_array_base)", __FILE__, __LINE__);
222 }
223 
224 static void
225 redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data) {
226 
227  Xt_redist_sab redist_sab = xrsab(redist);
228 
229  xt_exchanger_s_exchange(redist_sab->exchanger, src_data, dst_data);
230 }
231 
232 static void
233 redist_sab_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data,
234  Xt_request *request) {
235 
236  Xt_redist_sab redist_sab = xrsab(redist);
237 
238  xt_exchanger_a_exchange(redist_sab->exchanger, src_data, dst_data, request);
239 }
240 
242  enum xt_msg_direction direction)
243 {
244  return xrsab(redist)->nmsg[direction];
245 }
246 
247 static MPI_Datatype
249  enum xt_msg_direction direction)
250 {
251  return xt_exchanger_get_MPI_Datatype(xrsab(redist)->exchanger, rank,
252  direction);
253 }
254 
255 static int
257  enum xt_msg_direction direction,
258  int *restrict *ranks)
259 {
260  return xt_exchanger_get_msg_ranks(xrsab(redist)->exchanger, direction, ranks);
261 }
262 
263 static MPI_Comm
265 
266  Xt_redist_sab redist_sab = xrsab(redist);
267 
268  return redist_sab->comm;
269 }
270 
271 /*
272  * Local Variables:
273  * c-basic-offset: 2
274  * coding: utf-8
275  * indent-tabs-mode: nil
276  * show-trailing-whitespace: t
277  * require-trailing-newline: t
278  * End:
279  */
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
Xt_exchanger_new exchanger_new
const struct xt_redist_vtable * vtable
Xt_redist(* copy)(Xt_redist)
struct Xt_config_ xt_default_config
Definition: xt_config.c:65
implementation of configuration object
int xt_initialized(void)
Definition: xt_init.c:107
void xt_exchanger_s_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data)
Definition: xt_exchanger.c:71
int xt_exchanger_get_msg_ranks(Xt_exchanger exchanger, enum xt_msg_direction direction, int *restrict *ranks)
Definition: xt_exchanger.c:126
void xt_exchanger_a_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data, Xt_request *request)
Definition: xt_exchanger.c:76
void xt_exchanger_delete(Xt_exchanger exchanger)
Definition: xt_exchanger.c:66
Xt_exchanger xt_exchanger_copy(Xt_exchanger exchanger, MPI_Comm new_comm, int new_tag_offset)
Definition: xt_exchanger.c:61
MPI_Datatype xt_exchanger_get_MPI_Datatype(Xt_exchanger exchanger, int rank, enum xt_msg_direction direction)
Definition: xt_exchanger.c:134
exchanging of data based on information provided by redist's
index list declaration
MPI_Comm xt_mpi_comm_smart_dup(MPI_Comm comm, int *tag_offset)
Definition: xt_mpi.c:813
void xt_mpi_comm_smart_dedup(MPI_Comm *comm, int tag_offset)
Definition: xt_mpi.c:864
utility routines for MPI
redistribution of data, non-public declarations
xt_msg_direction
@ RECV
@ SEND
static int redist_sab_get_num_msg(Xt_redist redist, enum xt_msg_direction direction)
struct Xt_redist_sab_ * Xt_redist_sab
static Xt_redist redist_sab_copy(Xt_redist redist)
static MPI_Datatype redist_sab_get_MPI_Datatype(Xt_redist redist, int rank, enum xt_msg_direction direction)
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 void redist_sab_s_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data)
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 void redist_sab_a_exchange1(Xt_redist redist, const void *src_data, void *dst_data, Xt_request *request)
static void redist_sab_a_exchange(Xt_redist redist, int num_arrays, 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)
exchange map declarations