YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
interpolation_sum_mvp_at_src.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <string.h>
6
8#include "utils_core.h"
9#include "yaxt.h"
10#include "interpolation_utils.h"
12
14 struct yac_interpolation_type * interp);
16 struct yac_interpolation_type * interp);
18 struct yac_interpolation_type * interp,
19 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
20 double frac_mask_fallback_value, double scale_factor, double scale_summand);
22 struct yac_interpolation_type * interp,
23 double *** src_fields, double *** src_frac_masks,
24 int is_target, double frac_mask_fallback_value,
25 double scale_factor, double scale_summand);
27 struct yac_interpolation_type * interp, double ** tgt_field,
28 double frac_mask_fallback_value, double scale_factor, double scale_summand);
30 struct yac_interpolation_type * interp, double ** tgt_field,
31 double frac_mask_fallback_value, double scale_factor, double scale_summand);
33 struct yac_interpolation_type * interp);
35 struct yac_interpolation_type * interp);
37 struct yac_interpolation_type * interp);
39 struct yac_interpolation_type * interp);
41 struct yac_interpolation_type * interp);
42
56
58
60
63
64 /* data flow:
65 * put:
66 * I. source processes collectively exchange data, such that each process
67 * can process its stencils
68 * - send buffer: src_fields (+src_frac_masks) provided by user
69 * - recv buffer: halo_data
70 * - exchange: src2halo
71 * II. all source processes process their stencils to compute the target
72 * field
73 * - from buffer: src_fields (+src_frac_masks) provided by user
74 * halo_data
75 * - to buffer: result_data
76 * III. source processes send target field to target processes
77 * - send buffer: result_data
78 * - recv buffer: tgt_field provided by user
79 * - exchange: result2tgt
80 * get:
81 * I. target processes receive target field from source processes
82 * - send buffer: result_data
83 * - recv buffer: tgt_field provided by user
84 * - exchange: result2tgt
85 */
86
91
92 size_t tgt_count;
94 double * weights;
95 size_t * src_field_idx;
96 size_t * src_idx;
99
102
104};
105
107 size_t collection_size,
108 struct yac_interpolation_buffer halo_data,
109 struct yac_interpolation_buffer result_data,
110 struct yac_interpolation_exchange * src2halo,
111 struct yac_interpolation_exchange * result2tgt,
112 size_t tgt_count, size_t * prefix_num_src_per_tgt, double * weights,
113 size_t * src_field_idx, size_t * src_idx, size_t num_src_fields,
114 int with_frac_mask, int * ref_count) {
115
116 struct yac_interpolation_sum_mvp_at_src * mvp_at_src =
117 xmalloc(1 * sizeof(*mvp_at_src));
118
120 mvp_at_src->collection_size = collection_size;
121 mvp_at_src->with_frac_mask = with_frac_mask;
122 mvp_at_src->halo_data = halo_data;
123 mvp_at_src->result_data = result_data;
124 mvp_at_src->src2halo = src2halo;
125 mvp_at_src->result2tgt = result2tgt;
126 mvp_at_src->tgt_count = tgt_count;
128 mvp_at_src->weights = weights;
129 mvp_at_src->src_field_idx = src_field_idx;
130 mvp_at_src->src_idx = src_idx;
131 mvp_at_src->num_src_fields = num_src_fields;
132 mvp_at_src->src_fields_buffer =
133 xmalloc(
135 sizeof(*(mvp_at_src->src_fields_buffer)));
136 mvp_at_src->is_source =
140 mvp_at_src->is_target =
142
143 mvp_at_src->ref_count =
144 (ref_count == NULL)?xcalloc(1, sizeof(*mvp_at_src->ref_count)):ref_count;
145 ++*(mvp_at_src->ref_count);
146
147 return (struct yac_interpolation_type *)mvp_at_src;
148}
149
151 size_t collection_size, Xt_redist * halo_redists,
152 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
153 size_t * src_field_idx, size_t * src_idx,
154 size_t num_src_fields, Xt_redist result_redist_, int with_frac_mask) {
155
156 size_t total_num_src = 0;
157 size_t * prefix_num_src_per_tgt =
158 xmalloc((tgt_count + 1) * sizeof(*prefix_num_src_per_tgt));
159 for (size_t i = 0; i < tgt_count; ++i) {
160 prefix_num_src_per_tgt[i] = total_num_src;
161 total_num_src += num_src_per_tgt[i];
162 }
163 prefix_num_src_per_tgt[tgt_count] = total_num_src;
164
165 return
167 collection_size,
169 halo_redists, num_src_fields,
170 with_frac_mask?2*collection_size:collection_size, RECV_BUFFER),
172 &result_redist_, 1, collection_size, SEND_BUFFER),
174 halo_redists, num_src_fields,
175 collection_size, with_frac_mask, "source to halo"),
177 &result_redist_, 1, collection_size, 0, "result to target"),
178 tgt_count, prefix_num_src_per_tgt,
179 (weights != NULL)?COPY_DATA(weights, total_num_src):NULL,
180 COPY_DATA(src_field_idx, total_num_src),
181 COPY_DATA(src_idx, total_num_src),
182 num_src_fields, with_frac_mask, NULL);
183}
184
186 struct yac_interpolation_type * interp) {
187
188 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
189 (struct yac_interpolation_sum_mvp_at_src *)interp;
190
191 return sum_mvp_at_src->is_source;
192}
193
195 struct yac_interpolation_type * interp) {
196
197 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
198 (struct yac_interpolation_sum_mvp_at_src *)interp;
199
200 return sum_mvp_at_src->is_target;
201}
202
204 struct yac_interpolation_type * interp,
205 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
206 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
207
208 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
209 (struct yac_interpolation_sum_mvp_at_src *)interp;
210
212 sum_mvp_at_src->result2tgt,
213 "yac_interpolation_sum_mvp_at_src_execute");
214
215 double ** results = sum_mvp_at_src->result_data.buffer;
216
217 if (sum_mvp_at_src->is_source) {
218
219 int with_frac_mask = sum_mvp_at_src->with_frac_mask;
220 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_src_execute")
221
222 size_t num_src_fields = sum_mvp_at_src->num_src_fields;
223 size_t collection_size = sum_mvp_at_src->collection_size;
224 double ** temp_src_fields = sum_mvp_at_src->src_fields_buffer;
225 double ** halo_buffers = sum_mvp_at_src->halo_data.buffer;
226 for (size_t i = 0; i < collection_size; ++i)
227 for (size_t j = 0; j < num_src_fields; ++j)
228 temp_src_fields[i * num_src_fields + j] = src_fields[i][j];
229 if (with_frac_mask)
230 for (size_t i = 0; i < collection_size; ++i)
231 for (size_t j = 0; j < num_src_fields; ++j)
232 temp_src_fields[
234 src_frac_masks[i][j];
235
236 // do halo exchange
238 sum_mvp_at_src->src2halo, (double const **)temp_src_fields,
239 halo_buffers, "yac_interpolation_sum_mvp_at_src_execute");
240
242 (double const * restrict **)src_fields,
243 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
244 (double const * restrict *)halo_buffers,
245 (double const * restrict *)(
246 with_frac_mask?(halo_buffers + collection_size * num_src_fields):NULL),
247 results, NULL, sum_mvp_at_src->tgt_count,
248 sum_mvp_at_src->prefix_num_src_per_tgt,
249 sum_mvp_at_src->weights, sum_mvp_at_src->src_field_idx,
250 sum_mvp_at_src->src_idx, num_src_fields, collection_size,
251 frac_mask_fallback_value, scale_factor, scale_summand);
252 }
253
254 // redistribute results
256 sum_mvp_at_src->result2tgt, (double const **)results, tgt_field,
257 "yac_interpolation_sum_mvp_at_src_execute");
258}
259
261 struct yac_interpolation_type * interp,
262 double *** src_fields, double *** src_frac_masks, int is_target,
263 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
264
265 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
266 (struct yac_interpolation_sum_mvp_at_src *)interp;
267
268 // wait until previous exchange is completed
270 sum_mvp_at_src->result2tgt,
271 "yac_interpolation_sum_mvp_at_src_execute_put") ==
274 sum_mvp_at_src->result2tgt,
275 "yac_interpolation_sum_mvp_at_src_execute_put");
276
277 int with_frac_mask = sum_mvp_at_src->with_frac_mask;
278 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_src_execute_put")
279
280 size_t num_src_fields = sum_mvp_at_src->num_src_fields;
281 size_t collection_size = sum_mvp_at_src->collection_size;
282 double ** temp_src_fields = sum_mvp_at_src->src_fields_buffer;
283 double ** halo_buffers = sum_mvp_at_src->halo_data.buffer;
284 for (size_t i = 0; i < collection_size; ++i)
285 for (size_t j = 0; j < num_src_fields; ++j)
286 temp_src_fields[i * num_src_fields + j] = src_fields[i][j];
287 if (with_frac_mask) {
288 for (size_t i = 0; i < collection_size; ++i)
289 for (size_t j = 0; j < num_src_fields; ++j)
290 temp_src_fields[
292 src_frac_masks[i][j];
293 }
294
295 // do halo exchange
297 sum_mvp_at_src->src2halo, (double const **)temp_src_fields, halo_buffers,
298 "yac_interpolation_sum_mvp_at_src_execute_put");
299
300 double ** results = sum_mvp_at_src->result_data.buffer;
301
303 (double const * restrict **)src_fields,
304 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
305 (double const * restrict *)halo_buffers,
306 (double const * restrict *)(
307 with_frac_mask?(halo_buffers + collection_size * num_src_fields):NULL),
308 results, NULL, sum_mvp_at_src->tgt_count,
309 sum_mvp_at_src->prefix_num_src_per_tgt, sum_mvp_at_src->weights,
310 sum_mvp_at_src->src_field_idx, sum_mvp_at_src->src_idx,
311 num_src_fields, collection_size, frac_mask_fallback_value,
312 scale_factor, scale_summand);
313
315 sum_mvp_at_src->result2tgt, (double const **)results,
316 "yac_interpolation_sum_mvp_at_src_execute_put");
317}
318
320 struct yac_interpolation_type * interp, double ** tgt_field,
321 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
322
323 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
324 (struct yac_interpolation_sum_mvp_at_src*)interp;
325
327 sum_mvp_at_src->result2tgt, tgt_field,
328 "yac_interpolation_sum_mvp_at_src_execute_get");
329}
330
332 struct yac_interpolation_type * interp, double ** tgt_field,
333 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
334
335 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
336 (struct yac_interpolation_sum_mvp_at_src*)interp;
337
338 // wait until previous exchange is completed
340 sum_mvp_at_src->result2tgt,
341 "yac_interpolation_sum_mvp_at_src_execute_get_async") ==
344 sum_mvp_at_src->result2tgt,
345 "yac_interpolation_sum_mvp_at_src_execute_get_async");
346
348 sum_mvp_at_src->result2tgt, tgt_field,
349 "yac_interpolation_sum_mvp_at_src_execute_get_async");
350}
351
353 struct yac_interpolation_type * interp) {
354
355 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
356 (struct yac_interpolation_sum_mvp_at_src*)interp;
357
358 return
360 sum_mvp_at_src->result2tgt,
361 "yac_interpolation_sum_mvp_at_src_execute_put_test");
362}
363
365 struct yac_interpolation_type * interp) {
366
367 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
368 (struct yac_interpolation_sum_mvp_at_src*)interp;
369
370 return
372 sum_mvp_at_src->result2tgt,
373 "yac_interpolation_sum_mvp_at_src_execute_get_test");
374}
375
377 struct yac_interpolation_type * interp) {
378
379 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
380 (struct yac_interpolation_sum_mvp_at_src*)interp;
381
383 sum_mvp_at_src->result2tgt,
384 "yac_interpolation_sum_mvp_at_src_execute_wait");
385}
386
387static struct yac_interpolation_type *
389 struct yac_interpolation_type * interp) {
390
391 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
392 (struct yac_interpolation_sum_mvp_at_src*)interp;
393
394 return
396 sum_mvp_at_src->collection_size,
398 sum_mvp_at_src->halo_data, sum_mvp_at_src->num_src_fields,
399 sum_mvp_at_src->with_frac_mask?
400 2*sum_mvp_at_src->collection_size:sum_mvp_at_src->collection_size),
402 sum_mvp_at_src->result_data, 1, sum_mvp_at_src->collection_size),
405 sum_mvp_at_src->tgt_count,
406 sum_mvp_at_src->prefix_num_src_per_tgt, sum_mvp_at_src->weights,
407 sum_mvp_at_src->src_field_idx, sum_mvp_at_src->src_idx,
408 sum_mvp_at_src->num_src_fields,
409 sum_mvp_at_src->with_frac_mask, sum_mvp_at_src->ref_count);
410}
411
413 struct yac_interpolation_type * interp) {
414
415 if (interp == NULL) return;
416
417 struct yac_interpolation_sum_mvp_at_src * sum_mvp_at_src =
418 (struct yac_interpolation_sum_mvp_at_src*)interp;
419
421 sum_mvp_at_src->result2tgt, "yac_interpolation_sum_mvp_at_src_delete");
422 yac_interpolation_buffer_free(&(sum_mvp_at_src->result_data));
424 sum_mvp_at_src->src2halo, "yac_interpolation_sum_mvp_at_src_delete");
425 yac_interpolation_buffer_free(&(sum_mvp_at_src->halo_data));
426 free(sum_mvp_at_src->src_fields_buffer);
427
428 if (!--(*(sum_mvp_at_src->ref_count))) {
429 free(sum_mvp_at_src->prefix_num_src_per_tgt);
430 free(sum_mvp_at_src->src_idx);
431 free(sum_mvp_at_src->src_field_idx);
432 free(sum_mvp_at_src->weights);
433 free(sum_mvp_at_src->ref_count);
434 }
435
436 free(sum_mvp_at_src);
437}
int yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_target(struct yac_interpolation_exchange *exchange)
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
struct yac_interpolation_exchange * yac_interpolation_exchange_new(Xt_redist *redists, size_t num_fields, size_t collection_size, int with_frac_mask, char const *name)
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
enum YAC_INTERP_EXCH_STATUS yac_interpolation_exchange_status(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_get_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_source(struct yac_interpolation_exchange *exchange)
@ YAC_INTERP_EXCH_ACTIVE
static int yac_interpolation_sum_mvp_at_src_is_target(struct yac_interpolation_type *interp)
static struct yac_interpolation_type_vtable const interpolation_sum_mvp_at_src_vtable
static void yac_interpolation_sum_mvp_at_src_execute_get(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static void yac_interpolation_sum_mvp_at_src_execute_wait(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_src_execute_put(struct yac_interpolation_type *interp, double ***src_fields, double ***src_frac_masks, int is_target, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static struct yac_interpolation_type * yac_interpolation_sum_mvp_at_src_copy(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_src_execute(struct yac_interpolation_type *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static int yac_interpolation_sum_mvp_at_src_execute_put_test(struct yac_interpolation_type *interp)
static int yac_interpolation_sum_mvp_at_src_is_source(struct yac_interpolation_type *interp)
struct yac_interpolation_type * yac_interpolation_sum_mvp_at_src_new(size_t collection_size, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist_, int with_frac_mask)
static void yac_interpolation_sum_mvp_at_src_delete(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_src_execute_get_async(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static int yac_interpolation_sum_mvp_at_src_execute_get_test(struct yac_interpolation_type *interp)
static struct yac_interpolation_type * yac_interpolation_sum_mvp_at_src_new_(size_t collection_size, struct yac_interpolation_buffer halo_data, struct yac_interpolation_buffer result_data, struct yac_interpolation_exchange *src2halo, struct yac_interpolation_exchange *result2tgt, size_t tgt_count, size_t *prefix_num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, int with_frac_mask, int *ref_count)
struct yac_interpolation_buffer yac_interpolation_buffer_copy(struct yac_interpolation_buffer src, size_t num_fields, size_t collection_size)
void yac_interpolation_buffer_free(struct yac_interpolation_buffer *buffer)
struct yac_interpolation_buffer yac_interpolation_buffer_init(Xt_redist *redists, size_t num_fields, size_t collection_size, enum yac_interpolation_buffer_type type)
static void compute_tgt_field_wgt(double const *restrict **src_fields, double const *restrict **src_frac_masks, double const *restrict *remote_src_fields, double const *restrict *remote_src_frac_masks, double *restrict *tgt_field, size_t const *restrict tgt_pos, size_t tgt_count, size_t const *restrict prefix_num_src_per_tgt, double const *restrict weights, size_t const *restrict src_field_idx, size_t const *restrict src_idx, size_t num_src_fields, size_t collection_size, double frac_mask_fallback_value, double scale_factor, double scale_summand)
#define CHECK_WITH_FRAC_MASK(ROUTINE)
@ SEND_BUFFER
@ RECV_BUFFER
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct yac_interpolation_exchange * src2halo
struct yac_interpolation_buffer result_data
struct yac_interpolation_buffer halo_data
struct yac_interpolation_type_vtable const * vtable
struct yac_interpolation_exchange * result2tgt
int(* is_source)(struct yac_interpolation_type *interp)
#define COPY_DATA(data, count)
Definition utils_core.h:209