Yet Another eXchange Tool  DO_NOT_EDIT_HERE
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 "core/ppm_xfuncs.h"
62 #include "core/core.h"
63 #include "xt_exchanger.h"
64 
65 static Xt_redist
67 
68 static void
70 
71 static void
72 redist_sab_s_exchange(Xt_redist redist, int num_arrays,
73  const void **src_data, void **dst_data);
74 
75 static void
76 redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data);
77 
78 static MPI_Datatype
80 
81 static MPI_Datatype
83 
84 static int
86  enum xt_msg_direction direction,
87  int **ranks);
88 
89 static MPI_Comm
91 
92 static const struct xt_redist_vtable redist_sab_vtable = {
94  .delete = redist_sab_delete,
95  .s_exchange = redist_sab_s_exchange,
96  .s_exchange1 = redist_sab_s_exchange1,
97  .get_send_MPI_Datatype = redist_sab_get_send_MPI_Datatype,
98  .get_recv_MPI_Datatype = redist_sab_get_recv_MPI_Datatype,
99  .get_msg_ranks = redist_collection_get_msg_ranks,
100  .get_MPI_Comm = redist_sab_get_MPI_Comm
101 };
102 
104 
106 
107  const struct xt_redist_vtable *vtable;
108 
110 
111  int nsend, nrecv;
112 
115 };
116 
118  struct Xt_redist_msg * send_msgs,
119  struct Xt_redist_msg * recv_msgs,
120  MPI_Comm comm) {
121 
122  Xt_redist_sab redist = xmalloc(sizeof (*redist));
123 
124  redist->comm = xt_mpi_comm_smart_dup(comm, &redist->tag_offset);
125  redist->exchanger
126  = xt_exchanger_default_constructor(nsend, nrecv, send_msgs,
127  recv_msgs, redist->comm,
128  redist->tag_offset);
129 
130  redist->vtable = &redist_sab_vtable;
131  redist->nsend = nsend;
132  redist->nrecv = nrecv;
133  xt_redist_msgs_free((size_t)nsend, send_msgs, redist->comm);
134  xt_redist_msgs_free((size_t)nrecv, recv_msgs, redist->comm);
135  return (Xt_redist)redist;
136 }
137 
138 static inline Xt_redist_sab
139 xrsab(void *redist)
140 {
141  return (Xt_redist_sab)redist;
142 }
143 
144 static Xt_redist
146 {
147  Xt_redist_sab redist_sab = xrsab(redist);
148  Xt_redist_sab redist_sab_new = xmalloc(sizeof *redist_sab_new);
149  redist_sab_new->vtable = redist_sab->vtable;
150  redist_sab_new->nsend = redist_sab->nsend;
151  redist_sab_new->nrecv = redist_sab->nrecv;
152  redist_sab_new->comm = xt_mpi_comm_smart_dup(redist_sab->comm,
153  &redist_sab_new->tag_offset);
154  redist_sab_new->exchanger
155  = xt_exchanger_copy(redist_sab->exchanger, redist_sab_new->comm,
156  redist_sab_new->tag_offset);
157  return (Xt_redist)redist_sab_new;
158 }
159 
160 static void
162 
163  Xt_redist_sab redist_sab = xrsab(redist);
164 
165  xt_exchanger_delete(redist_sab->exchanger);
166 
167 
168  xt_mpi_comm_smart_dedup(&redist_sab->comm, redist_sab->tag_offset);
169 
170  free(redist_sab);
171 }
172 
173 static void
174 redist_sab_s_exchange(Xt_redist redist, int num_arrays,
175  const void **src_data, void **dst_data)
176 {
177  Xt_redist_sab redist_rep = xrsab(redist);
178  if (num_arrays == 1)
179  redist_sab_s_exchange1(redist, src_data[0], dst_data[0]);
180  else
181  Xt_abort(redist_rep->comm, "ERROR: multi-array s_exchange is not"
182  " implemented for this xt_redist type "
183  "(Xt_redist_single_array_base)", __FILE__, __LINE__);
184 }
185 
186 static void
187 redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data) {
188 
189  Xt_redist_sab redist_sab = xrsab(redist);
190 
191  xt_exchanger_s_exchange(redist_sab->exchanger, src_data, dst_data);
192 }
193 
194 static MPI_Datatype
196 
197  return xt_exchanger_get_MPI_Datatype(xrsab(redist)->exchanger, rank, SEND);
198 }
199 
200 static MPI_Datatype
202 
203  return xt_exchanger_get_MPI_Datatype(xrsab(redist)->exchanger, rank, RECV);
204 }
205 
206 static int
208  enum xt_msg_direction direction,
209  int **ranks)
210 {
211  return xt_exchanger_get_msg_ranks(xrsab(redist)->exchanger, direction,
212  ranks);
213 }
214 
215 static MPI_Comm
217 
218  Xt_redist_sab redist_sab = xrsab(redist);
219 
220  return redist_sab->comm;
221 }
222 
223 /*
224  * Local Variables:
225  * c-basic-offset: 2
226  * coding: utf-8
227  * indent-tabs-mode: nil
228  * show-trailing-whitespace: t
229  * require-trailing-newline: t
230  * End:
231  */
void xt_exchanger_s_exchange(Xt_exchanger exchanger, const void *src_data, void *dst_data)
Definition: xt_exchanger.c:75
static MPI_Datatype redist_sab_get_recv_MPI_Datatype(Xt_redist redist, int rank)
static void redist_sab_s_exchange1(Xt_redist redist, const void *src_data, void *dst_data)
static void redist_sab_s_exchange(Xt_redist redist, int num_arrays, const void **src_data, void **dst_data)
xt_msg_direction
static MPI_Comm redist_sab_get_MPI_Comm(Xt_redist redist)
redistribution of data, non-public declarations
Xt_redist(* copy)(Xt_redist)
add versions of standard API functions not returning on error
static Xt_redist_sab xrsab(void *redist)
static int redist_collection_get_msg_ranks(Xt_redist redist, enum xt_msg_direction direction, int **ranks)
int xt_exchanger_get_msg_ranks(Xt_exchanger exchanger, enum xt_msg_direction direction, int **ranks)
Definition: xt_exchanger.c:120
struct Xt_redist_sab_ * Xt_redist_sab
exchange map declarations
Xt_exchanger xt_exchanger_copy(Xt_exchanger exchanger, MPI_Comm new_comm, int new_tag_offset)
Definition: xt_exchanger.c:65
static void xt_redist_msgs_free(size_t n, struct Xt_redist_msg *msgs, MPI_Comm comm)
Xt_exchanger(* xt_exchanger_default_constructor)(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset)
Definition: xt_exchanger.c:59
void xt_exchanger_delete(Xt_exchanger exchanger)
Definition: xt_exchanger.c:70
Xt_redist xt_redist_single_array_base_new(int nsend, int nrecv, struct Xt_redist_msg *send_msgs, struct Xt_redist_msg *recv_msgs, MPI_Comm comm)
static void redist_sab_delete(Xt_redist redist)
static Xt_redist redist_sab_copy(Xt_redist redist)
static MPI_Datatype redist_sab_get_send_MPI_Datatype(Xt_redist redist, int rank)
const struct xt_redist_vtable * vtable
MPI_Comm xt_mpi_comm_smart_dup(MPI_Comm comm, int *tag_offset)
Definition: xt_mpi.c:850
void xt_mpi_comm_smart_dedup(MPI_Comm *comm, int tag_offset)
Definition: xt_mpi.c:901
exchanging of data based on information provided by redist&#39;s
index list declaration
MPI_Datatype xt_exchanger_get_MPI_Datatype(Xt_exchanger exchanger, int rank, enum xt_msg_direction direction)
Definition: xt_exchanger.c:128
static const struct xt_redist_vtable redist_sab_vtable
#define xmalloc(size)
Definition: ppm_xfuncs.h:66
int MPI_Comm
Definition: core.h:64
utility routines for MPI