YAC 3.12.0
Yet Another Coupler
Loading...
Searching...
No Matches
interp_operator_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"
14
16 struct yac_interp_operator * interp);
18 struct yac_interp_operator * interp);
20 struct yac_interp_operator * interp,
21 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
22 double frac_mask_fallback_value, double scale_factor, double scale_summand);
24 struct yac_interp_operator * interp,
25 double *** src_fields, double *** src_frac_masks,
26 int is_target, double frac_mask_fallback_value,
27 double scale_factor, double scale_summand);
29 struct yac_interp_operator * interp, double ** tgt_field,
30 double frac_mask_fallback_value, double scale_factor, double scale_summand);
32 struct yac_interp_operator * interp, double ** tgt_field,
33 double frac_mask_fallback_value, double scale_factor, double scale_summand);
34static enum YAC_INTERP_TEST_STATUS
36 struct yac_interp_operator * interp);
37static enum YAC_INTERP_TEST_STATUS
39 struct yac_interp_operator * interp);
41 struct yac_interp_operator * interp);
43 struct yac_interp_operator * interp);
45 struct yac_interp_operator * interp);
46
60
62
64
67
68 /* data flow:
69 * put:
70 * I. source processes pack their source data into a buffer, in order
71 * to be able to asynchronously process the put operation
72 * - from buffer: src_fields (+src_frac_masks) provided by user
73 * - to buffer: src_send_buffer
74 * II. source processes send source data to target processes, such
75 * that each target process can compute its own target field
76 * - send buffer: src_send_buffer
77 * - recv buffer: src_recv_buffer
78 * - exchange: src2tgt
79 * get:
80 * I. target processes receive source data from source processes
81 * - send buffer: src_send_buffer
82 * - recv buffer: src_recv_buffer
83 * - exchange: src2tgt
84 * II. target process comput their target field
85 * - from buffer: src_recv_buffer
86 * - to buffer: tgt_field provied by the user
87 */
88
89 /*
90 * The following arrays are shared between multiple copies of the same
91 * interpolation operation and are only freed when the reference counter
92 * reaches zero:
93 * - tgt_pos
94 * - src_idx
95 * - src_field_idx
96 * - weights
97 * - prefix_num_src_per_tgt
98 * - ref_count
99 */
100
104
105 double *** src_fields;
106 double *** src_frac_masks;
108 size_t * tgt_pos;
109 size_t tgt_count;
114 double * weights;
116 size_t * src_idx;
122
124
125 // temporary data
126 double ** tgt_field;
130
132};
133
134static int local_src_data_is_used(size_t count, size_t const * src_field_idx) {
135
136 int contains_non_remote_src_data = 0;
137 for (size_t i = 0; (i < count) && !contains_non_remote_src_data; ++i) {
138 contains_non_remote_src_data = src_field_idx[i] != SIZE_MAX;
139 }
140 return contains_non_remote_src_data;
141}
142
250 struct yac_collection_selection const * collection_selection,
251 struct yac_interpolation_buffer src_send_data,
252 struct yac_interpolation_buffer src_recv_data,
253 struct yac_interpolation_exchange * src2tgt,
254 size_t * tgt_pos, size_t tgt_count, size_t * prefix_num_src_per_tgt,
255 double * weights, size_t * src_field_idx, size_t * src_idx,
256 size_t num_src_fields, int with_frac_mask, int * ref_count) {
257
258 struct yac_interp_operator_sum_mvp_at_tgt * mvp_at_tgt =
259 xmalloc(1 * sizeof(*mvp_at_tgt));
260
261 size_t collection_size =
263
265 mvp_at_tgt->collection_selection =
267 mvp_at_tgt->with_frac_mask = with_frac_mask;
268 mvp_at_tgt->src_send_data = src_send_data;
269 mvp_at_tgt->src_recv_data = src_recv_data;
270 mvp_at_tgt->src2tgt = src2tgt;
271 mvp_at_tgt->src_fields =
272 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_fields)));
273 for (size_t i = 0; i < collection_size; ++i)
274 mvp_at_tgt->src_fields[i] = mvp_at_tgt->src_send_data.buffer + i * num_src_fields;
275 if (with_frac_mask) {
276 mvp_at_tgt->src_frac_masks =
277 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_frac_masks)));
278 for (size_t i = 0; i < collection_size; ++i)
279 mvp_at_tgt->src_frac_masks[i] =
281 } else {
282 mvp_at_tgt->src_frac_masks = NULL;
283 }
284 mvp_at_tgt->src_fields_buffer =
286 num_src_fields, sizeof(*(mvp_at_tgt->src_fields_buffer)));
287 mvp_at_tgt->tgt_pos = tgt_pos;
288 mvp_at_tgt->tgt_count = tgt_count;
290 mvp_at_tgt->weights = weights;
291 mvp_at_tgt->src_field_idx = src_field_idx;
292 mvp_at_tgt->src_idx = src_idx;
293 mvp_at_tgt->num_src_fields = num_src_fields;
294 mvp_at_tgt->is_source =
297 mvp_at_tgt->is_target = tgt_count > 0;
298 mvp_at_tgt->async_get_is_active = 0;
299
300 mvp_at_tgt->ref_count =
301 (ref_count == NULL)?xcalloc(1, sizeof(*mvp_at_tgt->ref_count)):ref_count;
302 ++*(mvp_at_tgt->ref_count);
303
304 return (struct yac_interp_operator *)mvp_at_tgt;
305}
306
308 struct yac_collection_selection const * collection_selection,
309 Xt_redist * src_redists, size_t * tgt_pos, size_t tgt_count,
310 size_t * num_src_per_tgt, double * weights, size_t * src_field_idx,
311 size_t * src_idx, size_t num_src_fields, int with_frac_mask) {
312
313 size_t collection_size =
315
316 size_t total_num_src = 0;
317 size_t * prefix_num_src_per_tgt =
318 xmalloc((tgt_count + 1) * sizeof(*prefix_num_src_per_tgt));
319 for (size_t i = 0; i < tgt_count; ++i) {
320 prefix_num_src_per_tgt[i] = total_num_src;
321 total_num_src += num_src_per_tgt[i];
322 }
323 prefix_num_src_per_tgt[tgt_count] = total_num_src;
324
325 // some consistency checking
326 for (size_t i = 0; i < total_num_src; ++i) {
328 (src_field_idx[i] == SIZE_MAX) || (src_field_idx[i] < num_src_fields),
329 "ERROR(yac_interp_operator_sum_mvp_at_tgt_new): "
330 "invalid src_field_idx value "
331 "(has to be either SIZE_MAX or < num_src_fields(= %zu))"
332 "src_field_idx[%zu] = %zu", num_src_fields, i, src_field_idx[i]);
333 }
334
335 // in case a process is both source and target, the send buffer is also used
336 // to copy the send field (and send_frac_mask) in the put for the get
337 // --> we have to make sure that the buffer contains all locally required
338 // data
339 size_t * min_buffer_sizes =
340 xcalloc(num_src_fields, sizeof(*min_buffer_sizes));
341 for (size_t i = 0, offset = 0; i < tgt_count; ++i) {
342 size_t curr_num_src = num_src_per_tgt[i];
343 for (size_t j = 0; j < curr_num_src; ++j, ++offset) {
344 size_t curr_src_field_idx = src_field_idx[offset];
345 if (curr_src_field_idx == SIZE_MAX) continue;
346 size_t curr_src_extent = (src_idx[offset] + 1) * sizeof(double);
347 if (min_buffer_sizes[curr_src_field_idx] < curr_src_extent)
348 min_buffer_sizes[curr_src_field_idx] = curr_src_extent;
349 }
350 }
351
352 struct yac_interp_operator * interp =
354 collection_selection,
356 src_redists, min_buffer_sizes, num_src_fields,
359 src_redists, num_src_fields,
362 src_redists, num_src_fields,
363 collection_size, with_frac_mask, "source to target"),
364 COPY_DATA(tgt_pos, tgt_count), tgt_count,
365 prefix_num_src_per_tgt,
366 (weights != NULL)?COPY_DATA(weights, total_num_src):NULL,
367 COPY_DATA(src_field_idx, total_num_src),
368 COPY_DATA(src_idx, total_num_src),
369 num_src_fields, with_frac_mask, NULL);
370
371 free(min_buffer_sizes);
372 return interp;
373}
374
376 struct yac_interp_operator * interp) {
377
378 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
379 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
380
381 return sum_mvp_at_tgt->is_source;
382}
383
385 struct yac_interp_operator * interp) {
386
387 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
388 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
389
390 return sum_mvp_at_tgt->is_target;
391}
392
394 struct yac_interp_operator * interp,
395 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
396 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
397
398 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
399 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
400
402
403 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
404 CHECK_WITH_FRAC_MASK("yac_interp_operator_sum_mvp_at_tgt_execute")
405
406 size_t collection_size =
408 sum_mvp_at_tgt->collection_selection);
409 size_t const * collection_indices =
411 sum_mvp_at_tgt->collection_selection);
412 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
413 double ** src_send_buffer = sum_mvp_at_tgt->src_fields_buffer;
414 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
415
416 if (sum_mvp_at_tgt->is_source) {
417
418 // if the collection selection is not contiguous
419 if (collection_indices != NULL) {
420
421 double *** temp_src_fields =
422 xmalloc(collection_size * sizeof(*temp_src_fields));
423 temp_src_fields[0] =
424 xmalloc(collection_size * num_src_fields * sizeof(**temp_src_fields));
425 for (size_t i = 0; i < collection_size; ++i) {
426 temp_src_fields[i] = temp_src_fields[0] + i * num_src_fields;
427 for (size_t j = 0; j < num_src_fields; ++j)
428 temp_src_fields[i][j] = src_fields[collection_indices[i]][j];
429 }
430 src_fields = temp_src_fields;
431
432 if (src_frac_masks != NULL) {
433 double *** temp_src_frac_masks =
434 xmalloc(collection_size * sizeof(*temp_src_frac_masks));
435 temp_src_frac_masks[0] =
436 xmalloc(
437 collection_size * num_src_fields * sizeof(**temp_src_frac_masks));
438 for (size_t i = 0; i < collection_size; ++i) {
439 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i * num_src_fields;
440 for (size_t j = 0; j < num_src_fields; ++j)
441 temp_src_frac_masks[i][j] =
442 src_frac_masks[collection_indices[i]][j];
443 }
444 src_frac_masks = temp_src_frac_masks;
445 }
446 }
447
448 // copy src_field and src_frac_mask into a 2D buffer for communication
449 for (size_t i = 0; i < collection_size; ++i)
450 for (size_t j = 0; j < num_src_fields; ++j)
451 src_send_buffer[i * num_src_fields + j] = src_fields[i][j];
452 if (with_frac_mask)
453 for (size_t i = 0; i < collection_size; ++i)
454 for (size_t j = 0; j < num_src_fields; ++j)
455 src_send_buffer
457 src_frac_masks[i][j];
458 }
459
460 // send source points to targets
462 sum_mvp_at_tgt->src2tgt, (double const **)src_send_buffer,
463 src_recv_buffer, "yac_interp_operator_sum_mvp_at_tgt_execute");
464
466 (double const * restrict **)src_fields,
467 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
468 (double const * restrict *)src_recv_buffer,
469 (double const * restrict *)(
470 with_frac_mask?(src_recv_buffer + collection_size * num_src_fields):NULL),
471 tgt_field, sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
472 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
473 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
476
477 if (sum_mvp_at_tgt->is_source && (collection_indices != NULL)) {
478 free(src_fields[0]);
479 free(src_fields);
480 if (src_frac_masks != NULL) {
481 free(src_frac_masks[0]);
482 free(src_frac_masks);
483 }
484 }
485}
486
488 struct yac_interp_operator * interp,
489 double *** src_fields, double *** src_frac_masks, int is_target,
490 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
491
495
496 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
497 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
498
499 // wait until previous exchange is completed
500 // (except for when there is an open get operation, which matches this put)
502 sum_mvp_at_tgt->src2tgt,
503 "yac_interp_operator_sum_mvp_at_tgt_execute_put") !=
506
507 double ** src_send_buffer = NULL;
508
509 // if source data from the local process is being used for the interpolation
510 // of target points
511 if (sum_mvp_at_tgt->is_source) {
512
513 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
514 CHECK_WITH_FRAC_MASK("yac_interp_operator_sum_mvp_at_tgt_execute_put")
515
516 size_t collection_size =
518 sum_mvp_at_tgt->collection_selection);
519 size_t const * collection_indices =
521 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
522 size_t * src_send_buffer_sizes = sum_mvp_at_tgt->src_send_data.buffer_sizes;
523 src_send_buffer = sum_mvp_at_tgt->src_send_data.buffer;
524
525 // if collection selection is contiguous
526 if (collection_indices == NULL) {
527 for (size_t i = 0; i < collection_size; ++i)
528 for (size_t j = 0; j < num_src_fields; ++j)
529 memcpy(src_send_buffer[i * num_src_fields + j], src_fields[i][j],
530 src_send_buffer_sizes[j]);
531 if (with_frac_mask) {
532 for (size_t i = 0; i < collection_size; ++i)
533 for (size_t j = 0; j < num_src_fields; ++j)
534 memcpy(
535 src_send_buffer
537 src_frac_masks[i][j], src_send_buffer_sizes[j]);
538 }
539 } else {
540 for (size_t i = 0; i < collection_size; ++i)
541 for (size_t j = 0; j < num_src_fields; ++j)
542 memcpy(
543 src_send_buffer[i * num_src_fields + j],
544 src_fields[collection_indices[i]][j],
545 src_send_buffer_sizes[j]);
546 if (with_frac_mask) {
547 for (size_t i = 0; i < collection_size; ++i)
548 for (size_t j = 0; j < num_src_fields; ++j)
549 memcpy(
550 src_send_buffer
552 src_frac_masks[collection_indices[i]][j],
553 src_send_buffer_sizes[j]);
554 }
555 }
556 }
557
559 sum_mvp_at_tgt->src2tgt, (double const **)src_send_buffer,
560 "yac_interp_operator_sum_mvp_at_tgt_execute_put");
561}
562
563static void compute_tgt(
564 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt) {
565
566 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
568 sum_mvp_at_tgt->frac_mask_fallback_value;
569 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp/compute_tgt")
570
571 size_t collection_size =
573 sum_mvp_at_tgt->collection_selection);
574 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
575 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
576
578 (double const * restrict **)(sum_mvp_at_tgt->src_fields),
579 (double const * restrict **)(
580 with_frac_mask?sum_mvp_at_tgt->src_frac_masks:NULL),
581 (double const * restrict *)src_recv_buffer,
582 (double const * restrict *)(
584 (src_recv_buffer + collection_size * num_src_fields):NULL),
585 sum_mvp_at_tgt->tgt_field,
586 sum_mvp_at_tgt->tgt_pos,
587 sum_mvp_at_tgt->tgt_count,
588 sum_mvp_at_tgt->prefix_num_src_per_tgt,
589 sum_mvp_at_tgt->weights,
590 sum_mvp_at_tgt->src_field_idx,
591 sum_mvp_at_tgt->src_idx,
593 sum_mvp_at_tgt->scale_factor,
594 sum_mvp_at_tgt->scale_summand);
595
596 sum_mvp_at_tgt->async_get_is_active = 0;
597}
598
600 struct yac_interp_operator * interp, double ** tgt_field,
601 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
602
603 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
605
606 // wait until previous exchange is completed
608 sum_mvp_at_tgt->src2tgt,
609 "yac_interp_operator_sum_mvp_at_tgt_execute_get") !=
612
613 // receive source field data
615 sum_mvp_at_tgt->src2tgt, sum_mvp_at_tgt->src_recv_data.buffer,
616 "yac_interp_operator_sum_mvp_at_tgt_execute_get");
617
618 sum_mvp_at_tgt->tgt_field = tgt_field;
620 sum_mvp_at_tgt->scale_factor = scale_factor;
621 sum_mvp_at_tgt->scale_summand = scale_summand;
622
623 compute_tgt(sum_mvp_at_tgt);
624}
625
627 struct yac_interp_operator * interp, double ** tgt_field,
628 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
629
630 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
632
633 // wait until previous get operation is completed
637
638 sum_mvp_at_tgt->async_get_is_active = 1;
639 sum_mvp_at_tgt->tgt_field = tgt_field;
641 sum_mvp_at_tgt->scale_factor = scale_factor;
642 sum_mvp_at_tgt->scale_summand = scale_summand;
643
644 // receive source field data
646 sum_mvp_at_tgt->src2tgt,
647 sum_mvp_at_tgt->src_recv_data.buffer,
648 "yac_interp_operator_sum_mvp_at_tgt_execute_get");
649}
650
651static enum YAC_INTERP_TEST_STATUS
653 struct yac_interp_operator * interp) {
654
655 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
657
658 enum YAC_INTERP_EXCH_TEST_STATUS result =
660 sum_mvp_at_tgt->src2tgt,
661 "yac_interp_operator_sum_mvp_at_tgt_execute_put_test");
662
663 // if the source to target exchange has been completed and there still was
664 // an open asynchronous get operation --> use received source data to compute
665 // target points
666 if ((result == YAC_INTERP_EXCH_COMPLETE) &&
667 sum_mvp_at_tgt->async_get_is_active)
668 compute_tgt(sum_mvp_at_tgt);
669
670 return
671 (result == YAC_INTERP_EXCH_COMPLETE)?
673}
674
675static enum YAC_INTERP_TEST_STATUS
677 struct yac_interp_operator * interp) {
678
679 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
681
682 enum YAC_INTERP_EXCH_TEST_STATUS result =
684 sum_mvp_at_tgt->src2tgt,
685 "yac_interp_operator_sum_mvp_at_tgt_execute_get_test");
686
687 if ((result == YAC_INTERP_EXCH_COMPLETE) &&
688 sum_mvp_at_tgt->async_get_is_active)
689 compute_tgt(sum_mvp_at_tgt);
690
691 return
692 (result == YAC_INTERP_EXCH_COMPLETE)?
694}
695
697 struct yac_interp_operator * interp) {
698
699 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
701
703 sum_mvp_at_tgt->src2tgt,
704 "yac_interp_operator_sum_mvp_at_tgt_execute_wait");
705
706 if (sum_mvp_at_tgt->async_get_is_active)
707 compute_tgt(sum_mvp_at_tgt);
708}
709
711 struct yac_interp_operator * interp) {
712
713 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
715
716 size_t collection_size =
718 sum_mvp_at_tgt->collection_selection);
719
720 return
722 sum_mvp_at_tgt->collection_selection,
724 sum_mvp_at_tgt->src_send_data, sum_mvp_at_tgt->num_src_fields,
727 sum_mvp_at_tgt->src_recv_data, sum_mvp_at_tgt->num_src_fields,
730 sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
731 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
732 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
733 sum_mvp_at_tgt->num_src_fields, sum_mvp_at_tgt->with_frac_mask,
734 sum_mvp_at_tgt->ref_count);
735}
736
738 struct yac_interp_operator * interp) {
739
740 if (interp == NULL) return;
741
742 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
744
745 free(sum_mvp_at_tgt->src_fields);
746 if (sum_mvp_at_tgt->src_frac_masks != NULL)
747 free(sum_mvp_at_tgt->src_frac_masks);
749 sum_mvp_at_tgt->src2tgt, "yac_interp_operator_sum_mvp_at_tgt_delete");
752 free(sum_mvp_at_tgt->src_fields_buffer);
753
754 if (!--(*(sum_mvp_at_tgt->ref_count))) {
755 free(sum_mvp_at_tgt->tgt_pos);
756 free(sum_mvp_at_tgt->src_idx);
757 free(sum_mvp_at_tgt->src_field_idx);
758 free(sum_mvp_at_tgt->weights);
759 free(sum_mvp_at_tgt->prefix_num_src_per_tgt);
760 free(sum_mvp_at_tgt->ref_count);
761 }
763 free(sum_mvp_at_tgt);
764}
#define UNUSED(x)
Definition core.h:73
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
size_t const * yac_collection_selection_get_indices(struct yac_collection_selection const *collection_selection)
Get explicit selection indices if non-contiguous.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
struct yac_collection_selection * yac_collection_selection_copy(const struct yac_collection_selection *collection_selection)
Selection of indices from a collection.
struct yac_interp_operator * yac_interp_operator_sum_mvp_at_tgt_new(struct yac_collection_selection const *collection_selection, 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)
Create a sum (weighted or unweighted) interpolation operator computed on the target processes.
YAC_INTERP_TEST_STATUS
@ YAC_INTERP_INCOMPLETE
@ YAC_INTERP_COMPLETE
static int local_src_data_is_used(size_t count, size_t const *src_field_idx)
static void yac_interp_operator_sum_mvp_at_tgt_execute(struct yac_interp_operator *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_sum_mvp_at_tgt_execute_put_test(struct yac_interp_operator *interp)
static int yac_interp_operator_sum_mvp_at_tgt_is_target(struct yac_interp_operator *interp)
static void yac_interp_operator_sum_mvp_at_tgt_execute_get_async(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static struct yac_interp_operator * yac_interp_operator_sum_mvp_at_tgt_copy(struct yac_interp_operator *interp)
static struct yac_interp_operator * yac_interp_operator_sum_mvp_at_tgt_new_(struct yac_collection_selection const *collection_selection, 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)
Internal constructor for the "sum_mvp_at_tgt" interpolation operator.
static void yac_interp_operator_sum_mvp_at_tgt_delete(struct yac_interp_operator *interp)
static struct yac_interp_operator_vtable const interpolation_sum_mvp_at_tgt_vtable
static void yac_interp_operator_sum_mvp_at_tgt_execute_get(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static void yac_interp_operator_sum_mvp_at_tgt_execute_put(struct yac_interp_operator *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_interp_operator_sum_mvp_at_tgt_is_source(struct yac_interp_operator *interp)
static void yac_interp_operator_sum_mvp_at_tgt_execute_wait(struct yac_interp_operator *interp)
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_sum_mvp_at_tgt_execute_get_test(struct yac_interp_operator *interp)
static void compute_tgt(struct yac_interp_operator_sum_mvp_at_tgt *sum_mvp_at_tgt)
Weighted/unweighted sum operator at target in YAC.
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase asynchronously.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
Test whether the put phase has completed.
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
Create a deep copy of an interpolation exchange.
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
Delete an interpolation exchange and release resources.
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase and receive target data synchronously.
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
Wait for completion of pending put/get phases.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_get_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
Test whether the get phase has completed.
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
Execute only the put phase asynchronously.
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)
Create a new interpolation exchange object.
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
Execute the full exchange (put + get) synchronously.
enum YAC_INTERP_EXCH_STATUS yac_interpolation_exchange_status(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_source(struct yac_interpolation_exchange *exchange)
Query whether the current process participates as source.
Interpolation exchange object for temporary buffers and MPI exchanges.
YAC_INTERP_EXCH_TEST_STATUS
Status returned by test routines.
@ YAC_INTERP_EXCH_COMPLETE
No ongoing operation.
@ YAC_INTERP_EXCH_WAIT_PUT
Waiting for put phase completion.
@ YAC_INTERP_EXCH_WAIT_GET
Waiting for get phase completion.
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)
Compute target field values optionally using weighted sums of source data and optionally applying fra...
#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_collection_selection * collection_selection
struct yac_interp_operator_vtable const * vtable
struct yac_interpolation_exchange * src2tgt
Virtual function table for interpolation operators.
int(* is_source)(struct yac_interp_operator *interp)
Abstract interpolation operator type.
int collection_size
#define COPY_DATA(data, count)
Definition utils_core.h:257
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:19