YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
interpolation_sum_mvp_at_tgt.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 pack their source data into a buffer, in order
67 * to be able to asynchronously process the put operation
68 * - from buffer: src_fields (+src_frac_masks) provided by user
69 * - to buffer: src_send_buffer
70 * II. source processes send source data to target processes, such
71 * that each target process can compute its own target field
72 * - send buffer: src_send_buffer
73 * - recv buffer: src_recv_buffer
74 * - exchange: src2tgt
75 * get:
76 * I. target processes receive source data from source processes
77 * - send buffer: src_send_buffer
78 * - recv buffer: src_recv_buffer
79 * - exchange: src2tgt
80 * II. target process comput their target field
81 * - from buffer: src_recv_buffer
82 * - to buffer: tgt_field provied by the user
83 */
84
88
89 double *** src_fields;
90 double *** src_frac_masks;
92 size_t * tgt_pos;
93 size_t tgt_count;
95 double * weights;
96 size_t * src_field_idx;
97 size_t * src_idx;
101
103
104 // temporary data
105 double ** tgt_field;
109
111};
112
114 size_t collection_size,
115 struct yac_interpolation_buffer src_send_data,
116 struct yac_interpolation_buffer src_recv_data,
117 struct yac_interpolation_exchange * src2tgt,
118 size_t * tgt_pos, size_t tgt_count, size_t * prefix_num_src_per_tgt,
119 double * weights, size_t * src_field_idx, size_t * src_idx,
120 size_t num_src_fields, int with_frac_mask, int * ref_count) {
121
122 struct yac_interpolation_sum_mvp_at_tgt * mvp_at_tgt =
123 xmalloc(1 * sizeof(*mvp_at_tgt));
124
126 mvp_at_tgt->collection_size = collection_size;
127 mvp_at_tgt->with_frac_mask = with_frac_mask;
128 mvp_at_tgt->src_send_data = src_send_data;
129 mvp_at_tgt->src_recv_data = src_recv_data;
130 mvp_at_tgt->src2tgt = src2tgt;
131 mvp_at_tgt->src_fields =
132 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_fields)));
133 for (size_t i = 0; i < collection_size; ++i)
134 mvp_at_tgt->src_fields[i] = mvp_at_tgt->src_send_data.buffer + i * num_src_fields;
135 if (with_frac_mask) {
136 mvp_at_tgt->src_frac_masks =
137 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_frac_masks)));
138 for (size_t i = 0; i < collection_size; ++i)
139 mvp_at_tgt->src_frac_masks[i] =
141 } else {
142 mvp_at_tgt->src_frac_masks = NULL;
143 }
144 mvp_at_tgt->src_fields_buffer =
146 num_src_fields, sizeof(*(mvp_at_tgt->src_fields_buffer)));
147 mvp_at_tgt->tgt_pos = tgt_pos;
148 mvp_at_tgt->tgt_count = tgt_count;
150 mvp_at_tgt->weights = weights;
151 mvp_at_tgt->src_field_idx = src_field_idx;
152 mvp_at_tgt->src_idx = src_idx;
153 mvp_at_tgt->num_src_fields = num_src_fields;
154 mvp_at_tgt->is_source =
156 mvp_at_tgt->is_target = tgt_count > 0;
157 mvp_at_tgt->async_get_is_active = 0;
158
159 mvp_at_tgt->ref_count =
160 (ref_count == NULL)?xcalloc(1, sizeof(*mvp_at_tgt->ref_count)):ref_count;
161 ++*(mvp_at_tgt->ref_count);
162
163 return (struct yac_interpolation_type *)mvp_at_tgt;
164}
165
167 size_t collection_size, Xt_redist * src_redists, size_t * tgt_pos,
168 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
169 size_t * src_field_idx, size_t * src_idx,
170 size_t num_src_fields, int with_frac_mask) {
171
172 size_t total_num_src = 0;
173 size_t * prefix_num_src_per_tgt =
174 xmalloc((tgt_count + 1) * sizeof(*prefix_num_src_per_tgt));
175 for (size_t i = 0; i < tgt_count; ++i) {
176 prefix_num_src_per_tgt[i] = total_num_src;
177 total_num_src += num_src_per_tgt[i];
178 }
179 prefix_num_src_per_tgt[tgt_count] = total_num_src;
180
181 // in case a process is both source and target, the send buffer is also used
182 // to copy the send field (and send_frac_mask) in the put for the get
183 // --> we have to make sure that the buffer contains all locally required
184 // data
185 size_t * min_buffer_sizes =
186 xcalloc(num_src_fields, sizeof(*min_buffer_sizes));
187 for (size_t i = 0, offset = 0; i < tgt_count; ++i) {
188 size_t curr_num_src = num_src_per_tgt[i];
189 for (size_t j = 0; j < curr_num_src; ++j, ++offset) {
190 size_t curr_src_field_idx = src_field_idx[offset];
191 if (curr_src_field_idx == SIZE_MAX) continue;
192 size_t curr_src_extent = (src_idx[offset] + 1) * sizeof(double);
193 if (min_buffer_sizes[curr_src_field_idx] < curr_src_extent)
194 min_buffer_sizes[curr_src_field_idx] = curr_src_extent;
195 }
196 }
197
198 struct yac_interpolation_type * interp =
200 collection_size,
202 src_redists, min_buffer_sizes, num_src_fields,
203 with_frac_mask?2*collection_size:collection_size, SEND_BUFFER),
205 src_redists, num_src_fields,
206 with_frac_mask?2*collection_size:collection_size, RECV_BUFFER),
208 src_redists, num_src_fields,
209 collection_size, with_frac_mask, "source to target"),
210 COPY_DATA(tgt_pos, tgt_count), tgt_count,
211 prefix_num_src_per_tgt,
212 (weights != NULL)?COPY_DATA(weights, total_num_src):NULL,
213 COPY_DATA(src_field_idx, total_num_src),
214 COPY_DATA(src_idx, total_num_src),
215 num_src_fields, with_frac_mask, NULL);
216
217 free(min_buffer_sizes);
218 return interp;
219}
220
222 struct yac_interpolation_type * interp) {
223
224 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
225 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
226
227 return sum_mvp_at_tgt->is_source;
228}
229
231 struct yac_interpolation_type * interp) {
232
233 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
234 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
235
236 return sum_mvp_at_tgt->is_target;
237}
238
240 struct yac_interpolation_type * interp,
241 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
242 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
243
244 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
245 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
246
248
249 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
250 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_tgt_execute")
251
252 size_t collection_size = sum_mvp_at_tgt->collection_size;
253 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
254 double ** temp_src_fields = sum_mvp_at_tgt->src_fields_buffer;
255 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
256 if (sum_mvp_at_tgt->is_source) {
257 for (size_t i = 0; i < collection_size; ++i)
258 for (size_t j = 0; j < num_src_fields; ++j)
259 temp_src_fields[i * num_src_fields + j] = src_fields[i][j];
260 if (with_frac_mask)
261 for (size_t i = 0; i < collection_size; ++i)
262 for (size_t j = 0; j < num_src_fields; ++j)
263 temp_src_fields
265 src_frac_masks[i][j];
266 }
267
268 // send source points to targets
270 sum_mvp_at_tgt->src2tgt, (double const **)temp_src_fields,
271 src_recv_buffer, "yac_interpolation_sum_mvp_at_tgt_execute");
272
274 (double const * restrict **)src_fields,
275 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
276 (double const * restrict *)src_recv_buffer,
277 (double const * restrict *)(
278 with_frac_mask?(src_recv_buffer + collection_size * num_src_fields):NULL),
279 tgt_field, sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
280 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
281 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
284}
285
287 struct yac_interpolation_type * interp,
288 double *** src_fields, double *** src_frac_masks, int is_target,
289 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
290
291 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
292 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
293
294 // wait until previous exchange is completed
296 sum_mvp_at_tgt->src2tgt,
297 "yac_interpolation_sum_mvp_at_tgt_execute_get") !=
300
301 double ** src_send_buffer = NULL;
302
303 if (sum_mvp_at_tgt->is_source) {
304
305 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
306 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_tgt_execute_put")
307
308 size_t collection_size = sum_mvp_at_tgt->collection_size;
309 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
310 size_t * src_send_buffer_sizes = sum_mvp_at_tgt->src_send_data.buffer_sizes;
311 src_send_buffer = sum_mvp_at_tgt->src_send_data.buffer;
312 if (sum_mvp_at_tgt->is_source)
313 for (size_t i = 0; i < collection_size; ++i)
314 for (size_t j = 0; j < num_src_fields; ++j)
315 memcpy(src_send_buffer[i * num_src_fields + j], src_fields[i][j],
316 src_send_buffer_sizes[j]);
317 if (with_frac_mask) {
318 for (size_t i = 0; i < collection_size; ++i)
319 for (size_t j = 0; j < num_src_fields; ++j)
320 memcpy(
321 src_send_buffer
323 src_frac_masks[i][j], src_send_buffer_sizes[j]);
324 }
325 }
326
328 sum_mvp_at_tgt->src2tgt, (double const **)src_send_buffer,
329 "yac_interpolation_sum_mvp_at_tgt_execute_put");
330}
331
332static void compute_tgt(
333 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt) {
334
335 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
337 sum_mvp_at_tgt->frac_mask_fallback_value;
338 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_tgt_execute_get")
339
340 size_t collection_size = sum_mvp_at_tgt->collection_size;
341 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
342 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
343
345 (double const * restrict **)(sum_mvp_at_tgt->src_fields),
346 (double const * restrict **)(
347 with_frac_mask?sum_mvp_at_tgt->src_frac_masks:NULL),
348 (double const * restrict *)src_recv_buffer,
349 (double const * restrict *)(
351 (src_recv_buffer + collection_size * num_src_fields):NULL),
352 sum_mvp_at_tgt->tgt_field,
353 sum_mvp_at_tgt->tgt_pos,
354 sum_mvp_at_tgt->tgt_count,
355 sum_mvp_at_tgt->prefix_num_src_per_tgt,
356 sum_mvp_at_tgt->weights,
357 sum_mvp_at_tgt->src_field_idx,
358 sum_mvp_at_tgt->src_idx,
360 sum_mvp_at_tgt->scale_factor,
361 sum_mvp_at_tgt->scale_summand);
362
363 sum_mvp_at_tgt->async_get_is_active = 0;
364}
365
367 struct yac_interpolation_type * interp, double ** tgt_field,
368 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
369
370 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
371 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
372
373 // wait until previous exchange is completed
375 sum_mvp_at_tgt->src2tgt,
376 "yac_interpolation_sum_mvp_at_tgt_execute_get") !=
379
380 // receive source field data
382 sum_mvp_at_tgt->src2tgt, sum_mvp_at_tgt->src_recv_data.buffer,
383 "yac_interpolation_sum_mvp_at_tgt_execute_get");
384
385 sum_mvp_at_tgt->tgt_field = tgt_field;
387 sum_mvp_at_tgt->scale_factor = scale_factor;
388 sum_mvp_at_tgt->scale_summand = scale_summand;
389
390 compute_tgt(sum_mvp_at_tgt);
391}
392
394 struct yac_interpolation_type * interp, double ** tgt_field,
395 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
396
397 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
398 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
399
400 // wait until previous exchange is completed
402
403 sum_mvp_at_tgt->async_get_is_active = 1;
405 sum_mvp_at_tgt->scale_factor = scale_factor;
406 sum_mvp_at_tgt->scale_summand = scale_summand;
407
408 // receive source field data
410 sum_mvp_at_tgt->src2tgt,
411 sum_mvp_at_tgt->src_recv_data.buffer,
412 "yac_interpolation_sum_mvp_at_tgt_execute_get");
413}
414
416 struct yac_interpolation_type * interp) {
417
418 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
419 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
420
421 int result =
423 sum_mvp_at_tgt->src2tgt,
424 "yac_interpolation_sum_mvp_at_tgt_execute_put_test");
425
426 if (result && sum_mvp_at_tgt->async_get_is_active)
427 compute_tgt(sum_mvp_at_tgt);
428
429 return result;
430}
431
433 struct yac_interpolation_type * interp) {
434
435 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
436 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
437
438 int result =
440 sum_mvp_at_tgt->src2tgt,
441 "yac_interpolation_sum_mvp_at_tgt_execute_get_test");
442
443 if (result && sum_mvp_at_tgt->async_get_is_active)
444 compute_tgt(sum_mvp_at_tgt);
445
446 return result;
447}
448
450 struct yac_interpolation_type * interp) {
451
452 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
453 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
454
456 sum_mvp_at_tgt->src2tgt,
457 "yac_interpolation_sum_mvp_at_tgt_execute_wait");
458
459 if (sum_mvp_at_tgt->async_get_is_active)
460 compute_tgt(sum_mvp_at_tgt);
461}
462
464 struct yac_interpolation_type * interp) {
465
466 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
467 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
468
469 return
471 sum_mvp_at_tgt->collection_size,
473 sum_mvp_at_tgt->src_send_data, sum_mvp_at_tgt->num_src_fields,
474 sum_mvp_at_tgt->with_frac_mask?
475 2*sum_mvp_at_tgt->collection_size:sum_mvp_at_tgt->collection_size),
477 sum_mvp_at_tgt->src_recv_data, sum_mvp_at_tgt->num_src_fields,
478 sum_mvp_at_tgt->with_frac_mask?
479 2*sum_mvp_at_tgt->collection_size:sum_mvp_at_tgt->collection_size),
481 sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
482 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
483 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
484 sum_mvp_at_tgt->num_src_fields, sum_mvp_at_tgt->with_frac_mask,
485 sum_mvp_at_tgt->ref_count);
486}
487
489 struct yac_interpolation_type * interp) {
490
491 if (interp == NULL) return;
492
493 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
494 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
495
496 free(sum_mvp_at_tgt->src_fields);
497 if (sum_mvp_at_tgt->src_frac_masks != NULL)
498 free(sum_mvp_at_tgt->src_frac_masks);
500 sum_mvp_at_tgt->src2tgt, "yac_interpolation_sum_mvp_at_tgt_delete");
503 free(sum_mvp_at_tgt->src_fields_buffer);
504
505 if (!--(*(sum_mvp_at_tgt->ref_count))) {
506 free(sum_mvp_at_tgt->tgt_pos);
507 free(sum_mvp_at_tgt->src_idx);
508 free(sum_mvp_at_tgt->src_field_idx);
509 free(sum_mvp_at_tgt->weights);
510 free(sum_mvp_at_tgt->prefix_num_src_per_tgt);
511 free(sum_mvp_at_tgt->ref_count);
512 }
513 free(sum_mvp_at_tgt);
514}
int yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
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_WAIT_PUT
@ YAC_INTERP_EXCH_WAIT_GET
static struct yac_interpolation_type_vtable const interpolation_sum_mvp_at_tgt_vtable
static void yac_interpolation_sum_mvp_at_tgt_execute_get_async(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
struct yac_interpolation_type * yac_interpolation_sum_mvp_at_tgt_new(size_t collection_size, Xt_redist *src_redists, size_t *tgt_pos, 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, int with_frac_mask)
static struct yac_interpolation_type * yac_interpolation_sum_mvp_at_tgt_new_(size_t collection_size, struct yac_interpolation_buffer src_send_data, struct yac_interpolation_buffer src_recv_data, struct yac_interpolation_exchange *src2tgt, size_t *tgt_pos, 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)
static struct yac_interpolation_type * yac_interpolation_sum_mvp_at_tgt_copy(struct yac_interpolation_type *interp)
static int yac_interpolation_sum_mvp_at_tgt_execute_put_test(struct yac_interpolation_type *interp)
static int yac_interpolation_sum_mvp_at_tgt_is_target(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_tgt_delete(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_tgt_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_tgt_execute_wait(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_tgt_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 void yac_interpolation_sum_mvp_at_tgt_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 int yac_interpolation_sum_mvp_at_tgt_is_source(struct yac_interpolation_type *interp)
static void compute_tgt(struct yac_interpolation_sum_mvp_at_tgt *sum_mvp_at_tgt)
static int yac_interpolation_sum_mvp_at_tgt_execute_get_test(struct yac_interpolation_type *interp)
struct yac_interpolation_buffer yac_interpolation_buffer_init_2(Xt_redist *redists, size_t *min_buffer_sizes, size_t num_fields, size_t collection_size, enum yac_interpolation_buffer_type type)
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_type_vtable const * vtable
struct yac_interpolation_buffer src_send_data
struct yac_interpolation_exchange * src2tgt
struct yac_interpolation_buffer src_recv_data
int(* is_source)(struct yac_interpolation_type *interp)
#define COPY_DATA(data, count)
Definition utils_core.h:209