YAC 3.21.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#include <yaxt.h>
7
9#include "utils_core.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 // pre-allocated buffer for tgt_field pointers during async get
127
128 // temporary data
129 double ** tgt_field;
133
135};
136
137static int local_src_data_is_used(size_t count, size_t const * src_field_idx) {
138
139 int contains_non_remote_src_data = 0;
140 for (size_t i = 0; (i < count) && !contains_non_remote_src_data; ++i) {
141 contains_non_remote_src_data = src_field_idx[i] != SIZE_MAX;
142 }
143 return contains_non_remote_src_data;
144}
145
253 struct yac_collection_selection const * collection_selection,
254 struct yac_interpolation_buffer src_send_data,
255 struct yac_interpolation_buffer src_recv_data,
256 struct yac_interpolation_exchange * src2tgt,
257 size_t * tgt_pos, size_t tgt_count, size_t * prefix_num_src_per_tgt,
258 double * weights, size_t * src_field_idx, size_t * src_idx,
259 size_t num_src_fields, int with_frac_mask, int * ref_count) {
260
261 struct yac_interp_operator_sum_mvp_at_tgt * mvp_at_tgt =
262 xmalloc(1 * sizeof(*mvp_at_tgt));
263
264 size_t collection_size =
266
268 mvp_at_tgt->collection_selection =
270 mvp_at_tgt->with_frac_mask = with_frac_mask;
271 mvp_at_tgt->src_send_data = src_send_data;
272 mvp_at_tgt->src_recv_data = src_recv_data;
273 mvp_at_tgt->src2tgt = src2tgt;
274 mvp_at_tgt->src_fields =
275 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_fields)));
276 for (size_t i = 0; i < collection_size; ++i)
277 mvp_at_tgt->src_fields[i] = mvp_at_tgt->src_send_data.buffer + i * num_src_fields;
278 if (with_frac_mask) {
279 mvp_at_tgt->src_frac_masks =
280 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_frac_masks)));
281 for (size_t i = 0; i < collection_size; ++i)
282 mvp_at_tgt->src_frac_masks[i] =
284 } else {
285 mvp_at_tgt->src_frac_masks = NULL;
286 }
287 mvp_at_tgt->src_fields_buffer =
289 num_src_fields, sizeof(*(mvp_at_tgt->src_fields_buffer)));
290 mvp_at_tgt->tgt_pos = tgt_pos;
291 mvp_at_tgt->tgt_count = tgt_count;
293 mvp_at_tgt->weights = weights;
294 mvp_at_tgt->src_field_idx = src_field_idx;
295 mvp_at_tgt->src_idx = src_idx;
296 mvp_at_tgt->num_src_fields = num_src_fields;
297 mvp_at_tgt->is_source =
300 mvp_at_tgt->is_target = tgt_count > 0;
301 mvp_at_tgt->async_get_is_active = 0;
302 mvp_at_tgt->tgt_field_buffer =
303 xmalloc(collection_size * sizeof(*mvp_at_tgt->tgt_field_buffer));
304
305 mvp_at_tgt->ref_count =
306 (ref_count == NULL)?xcalloc(1, sizeof(*mvp_at_tgt->ref_count)):ref_count;
307 ++*(mvp_at_tgt->ref_count);
308
309 return (struct yac_interp_operator *)mvp_at_tgt;
310}
311
313 struct yac_collection_selection const * collection_selection,
314 Xt_redist * src_redists, size_t * tgt_pos, size_t tgt_count,
315 size_t * num_src_per_tgt, double * weights, size_t * src_field_idx,
316 size_t * src_idx, size_t num_src_fields, int with_frac_mask) {
317
318 size_t collection_size =
320
321 size_t total_num_src = 0;
322 size_t * prefix_num_src_per_tgt =
323 xmalloc((tgt_count + 1) * sizeof(*prefix_num_src_per_tgt));
324 for (size_t i = 0; i < tgt_count; ++i) {
325 prefix_num_src_per_tgt[i] = total_num_src;
326 total_num_src += num_src_per_tgt[i];
327 }
328 prefix_num_src_per_tgt[tgt_count] = total_num_src;
329
330 // some consistency checking
331 for (size_t i = 0; i < total_num_src; ++i) {
333 (src_field_idx[i] == SIZE_MAX) || (src_field_idx[i] < num_src_fields),
334 "invalid src_field_idx value "
335 "(has to be either SIZE_MAX or < num_src_fields(= %zu))"
336 "src_field_idx[%zu] = %zu", num_src_fields, i, src_field_idx[i]);
337 }
338
339 // in case a process is both source and target, the send buffer is also used
340 // to copy the send field (and send_frac_mask) in the put for the get
341 // --> we have to make sure that the buffer contains all locally required
342 // data
343 size_t * min_buffer_sizes =
344 xcalloc(num_src_fields, sizeof(*min_buffer_sizes));
345 for (size_t i = 0, offset = 0; i < tgt_count; ++i) {
346 size_t curr_num_src = num_src_per_tgt[i];
347 for (size_t j = 0; j < curr_num_src; ++j, ++offset) {
348 size_t curr_src_field_idx = src_field_idx[offset];
349 if (curr_src_field_idx == SIZE_MAX) continue;
350 size_t curr_src_extent = (src_idx[offset] + 1) * sizeof(double);
351 if (min_buffer_sizes[curr_src_field_idx] < curr_src_extent)
352 min_buffer_sizes[curr_src_field_idx] = curr_src_extent;
353 }
354 }
355
356 struct yac_interp_operator * interp =
358 collection_selection,
360 src_redists, min_buffer_sizes, num_src_fields,
363 src_redists, num_src_fields,
366 src_redists, num_src_fields,
367 collection_size, with_frac_mask, "source to target"),
368 COPY_DATA(tgt_pos, tgt_count), tgt_count,
369 prefix_num_src_per_tgt,
370 (weights != NULL)?COPY_DATA(weights, total_num_src):NULL,
371 COPY_DATA(src_field_idx, total_num_src),
372 COPY_DATA(src_idx, total_num_src),
373 num_src_fields, with_frac_mask, NULL);
374
375 free(min_buffer_sizes);
376 return interp;
377}
378
380 struct yac_interp_operator * interp) {
381
382 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
383 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
384
385 return sum_mvp_at_tgt->is_source;
386}
387
389 struct yac_interp_operator * interp) {
390
391 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
392 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
393
394 return sum_mvp_at_tgt->is_target;
395}
396
398 struct yac_interp_operator * interp,
399 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
400 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
401
402 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
403 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
404
406
407 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
409
410 size_t collection_size =
412 sum_mvp_at_tgt->collection_selection);
413 size_t const * collection_indices =
415 sum_mvp_at_tgt->collection_selection);
416 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
417 double ** src_send_buffer = sum_mvp_at_tgt->src_fields_buffer;
418 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
419
420 if (sum_mvp_at_tgt->is_source) {
421
422 // if the collection selection is not contiguous
423 if (collection_indices != NULL) {
424
425 double *** temp_src_fields =
426 xmalloc(collection_size * sizeof(*temp_src_fields));
427 temp_src_fields[0] =
428 xmalloc(collection_size * num_src_fields * sizeof(**temp_src_fields));
429 for (size_t i = 0; i < collection_size; ++i) {
430 temp_src_fields[i] = temp_src_fields[0] + i * num_src_fields;
431 for (size_t j = 0; j < num_src_fields; ++j)
432 temp_src_fields[i][j] = src_fields[collection_indices[i]][j];
433 }
434 src_fields = temp_src_fields;
435
436 if (src_frac_masks != NULL) {
437 double *** temp_src_frac_masks =
438 xmalloc(collection_size * sizeof(*temp_src_frac_masks));
439 temp_src_frac_masks[0] =
440 xmalloc(
441 collection_size * num_src_fields * sizeof(**temp_src_frac_masks));
442 for (size_t i = 0; i < collection_size; ++i) {
443 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i * num_src_fields;
444 for (size_t j = 0; j < num_src_fields; ++j)
445 temp_src_frac_masks[i][j] =
446 src_frac_masks[collection_indices[i]][j];
447 }
448 src_frac_masks = temp_src_frac_masks;
449 }
450 }
451
452 // copy src_field and src_frac_mask into a 2D buffer for communication
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[i * num_src_fields + j] = src_fields[i][j];
456 if (with_frac_mask)
457 for (size_t i = 0; i < collection_size; ++i)
458 for (size_t j = 0; j < num_src_fields; ++j)
459 src_send_buffer
461 src_frac_masks[i][j];
462 }
463
464 // send source points to targets
466 sum_mvp_at_tgt->src2tgt, (double const **)src_send_buffer,
467 src_recv_buffer, "yac_interp_operator_sum_mvp_at_tgt_execute");
468
470 (double const * restrict **)src_fields,
471 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
472 (double const * restrict *)src_recv_buffer,
473 (double const * restrict *)(
474 with_frac_mask?(src_recv_buffer + collection_size * num_src_fields):NULL),
475 tgt_field, sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
476 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
477 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
480
481 if (sum_mvp_at_tgt->is_source && (collection_indices != NULL)) {
482 free(src_fields[0]);
483 free(src_fields);
484 if (src_frac_masks != NULL) {
485 free(src_frac_masks[0]);
486 free(src_frac_masks);
487 }
488 }
489}
490
492 struct yac_interp_operator * interp,
493 double *** src_fields, double *** src_frac_masks, int is_target,
494 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
495
499
500 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
501 (struct yac_interp_operator_sum_mvp_at_tgt *)interp;
502
503 // wait until previous exchange is completed
504 // (except for when there is an open get operation, which matches this put)
506 sum_mvp_at_tgt->src2tgt,
507 "yac_interp_operator_sum_mvp_at_tgt_execute_put") !=
510
511 double ** src_send_buffer = NULL;
512
513 // if source data from the local process is being used for the interpolation
514 // of target points
515 if (sum_mvp_at_tgt->is_source) {
516
517 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
519
520 size_t collection_size =
522 sum_mvp_at_tgt->collection_selection);
523 size_t const * collection_indices =
525 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
526 size_t * src_send_buffer_sizes = sum_mvp_at_tgt->src_send_data.buffer_sizes;
527 src_send_buffer = sum_mvp_at_tgt->src_send_data.buffer;
528
529 // if collection selection is contiguous
530 if (collection_indices == NULL) {
531 for (size_t i = 0; i < collection_size; ++i)
532 for (size_t j = 0; j < num_src_fields; ++j)
533 memcpy(src_send_buffer[i * num_src_fields + j], src_fields[i][j],
534 src_send_buffer_sizes[j]);
535 if (with_frac_mask) {
536 for (size_t i = 0; i < collection_size; ++i)
537 for (size_t j = 0; j < num_src_fields; ++j)
538 memcpy(
539 src_send_buffer
541 src_frac_masks[i][j], src_send_buffer_sizes[j]);
542 }
543 } else {
544 for (size_t i = 0; i < collection_size; ++i)
545 for (size_t j = 0; j < num_src_fields; ++j)
546 memcpy(
547 src_send_buffer[i * num_src_fields + j],
548 src_fields[collection_indices[i]][j],
549 src_send_buffer_sizes[j]);
550 if (with_frac_mask) {
551 for (size_t i = 0; i < collection_size; ++i)
552 for (size_t j = 0; j < num_src_fields; ++j)
553 memcpy(
554 src_send_buffer
556 src_frac_masks[collection_indices[i]][j],
557 src_send_buffer_sizes[j]);
558 }
559 }
560 }
561
563 sum_mvp_at_tgt->src2tgt, (double const **)src_send_buffer,
564 "yac_interp_operator_sum_mvp_at_tgt_execute_put");
565}
566
567static void compute_tgt(
568 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt) {
569
570 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
572 sum_mvp_at_tgt->frac_mask_fallback_value;
574
575 size_t collection_size =
577 sum_mvp_at_tgt->collection_selection);
578 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
579 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
580
582 (double const * restrict **)(sum_mvp_at_tgt->src_fields),
583 (double const * restrict **)(
584 with_frac_mask?sum_mvp_at_tgt->src_frac_masks:NULL),
585 (double const * restrict *)src_recv_buffer,
586 (double const * restrict *)(
588 (src_recv_buffer + collection_size * num_src_fields):NULL),
589 sum_mvp_at_tgt->tgt_field,
590 sum_mvp_at_tgt->tgt_pos,
591 sum_mvp_at_tgt->tgt_count,
592 sum_mvp_at_tgt->prefix_num_src_per_tgt,
593 sum_mvp_at_tgt->weights,
594 sum_mvp_at_tgt->src_field_idx,
595 sum_mvp_at_tgt->src_idx,
597 sum_mvp_at_tgt->scale_factor,
598 sum_mvp_at_tgt->scale_summand);
599
600 sum_mvp_at_tgt->async_get_is_active = 0;
601}
602
604 struct yac_interp_operator * interp, double ** tgt_field,
605 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
606
607 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
609
610 // wait until previous exchange is completed
612 sum_mvp_at_tgt->src2tgt,
613 "yac_interp_operator_sum_mvp_at_tgt_execute_get") !=
616
617 // receive source field data
619 sum_mvp_at_tgt->src2tgt, sum_mvp_at_tgt->src_recv_data.buffer,
620 "yac_interp_operator_sum_mvp_at_tgt_execute_get");
621
622 sum_mvp_at_tgt->tgt_field = tgt_field;
624 sum_mvp_at_tgt->scale_factor = scale_factor;
625 sum_mvp_at_tgt->scale_summand = scale_summand;
626
627 compute_tgt(sum_mvp_at_tgt);
628}
629
631 struct yac_interp_operator * interp, double ** tgt_field,
632 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
633
634 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
636
637 // wait until previous get operation is completed
641
642 sum_mvp_at_tgt->async_get_is_active = 1;
643 size_t collection_size =
645 sum_mvp_at_tgt->collection_selection);
646 for (size_t i = 0; i < collection_size; ++i)
647 sum_mvp_at_tgt->tgt_field_buffer[i] = tgt_field[i];
648 sum_mvp_at_tgt->tgt_field = sum_mvp_at_tgt->tgt_field_buffer;
650 sum_mvp_at_tgt->scale_factor = scale_factor;
651 sum_mvp_at_tgt->scale_summand = scale_summand;
652
653 // receive source field data
655 sum_mvp_at_tgt->src2tgt,
656 sum_mvp_at_tgt->src_recv_data.buffer,
657 "yac_interp_operator_sum_mvp_at_tgt_execute_get");
658}
659
660static enum YAC_INTERP_TEST_STATUS
662 struct yac_interp_operator * interp) {
663
664 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
666
667 enum YAC_INTERP_EXCH_TEST_STATUS result =
669 sum_mvp_at_tgt->src2tgt,
670 "yac_interp_operator_sum_mvp_at_tgt_execute_put_test");
671
672 // if the source to target exchange has been completed and there still was
673 // an open asynchronous get operation --> use received source data to compute
674 // target points
675 if ((result == YAC_INTERP_EXCH_COMPLETE) &&
676 sum_mvp_at_tgt->async_get_is_active)
677 compute_tgt(sum_mvp_at_tgt);
678
679 return
680 (result == YAC_INTERP_EXCH_COMPLETE)?
682}
683
684static enum YAC_INTERP_TEST_STATUS
686 struct yac_interp_operator * interp) {
687
688 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
690
691 enum YAC_INTERP_EXCH_TEST_STATUS result =
693 sum_mvp_at_tgt->src2tgt,
694 "yac_interp_operator_sum_mvp_at_tgt_execute_get_test");
695
696 if ((result == YAC_INTERP_EXCH_COMPLETE) &&
697 sum_mvp_at_tgt->async_get_is_active)
698 compute_tgt(sum_mvp_at_tgt);
699
700 return
701 (result == YAC_INTERP_EXCH_COMPLETE)?
703}
704
706 struct yac_interp_operator * interp) {
707
708 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
710
712 sum_mvp_at_tgt->src2tgt,
713 "yac_interp_operator_sum_mvp_at_tgt_execute_wait");
714
715 if (sum_mvp_at_tgt->async_get_is_active)
716 compute_tgt(sum_mvp_at_tgt);
717}
718
720 struct yac_interp_operator * interp) {
721
722 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
724
725 size_t collection_size =
727 sum_mvp_at_tgt->collection_selection);
728
729 return
731 sum_mvp_at_tgt->collection_selection,
733 sum_mvp_at_tgt->src_send_data, sum_mvp_at_tgt->num_src_fields,
736 sum_mvp_at_tgt->src_recv_data, sum_mvp_at_tgt->num_src_fields,
739 sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
740 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
741 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
742 sum_mvp_at_tgt->num_src_fields, sum_mvp_at_tgt->with_frac_mask,
743 sum_mvp_at_tgt->ref_count);
744}
745
747 struct yac_interp_operator * interp) {
748
749 if (interp == NULL) return;
750
751 struct yac_interp_operator_sum_mvp_at_tgt * sum_mvp_at_tgt =
753
754 free(sum_mvp_at_tgt->src_fields);
755 if (sum_mvp_at_tgt->src_frac_masks != NULL)
756 free(sum_mvp_at_tgt->src_frac_masks);
758 sum_mvp_at_tgt->src2tgt, "yac_interp_operator_sum_mvp_at_tgt_delete");
761 free(sum_mvp_at_tgt->src_fields_buffer);
762 free(sum_mvp_at_tgt->tgt_field_buffer);
763
764 if (!--(*(sum_mvp_at_tgt->ref_count))) {
765 free(sum_mvp_at_tgt->tgt_pos);
766 free(sum_mvp_at_tgt->src_idx);
767 free(sum_mvp_at_tgt->src_field_idx);
768 free(sum_mvp_at_tgt->weights);
769 free(sum_mvp_at_tgt->prefix_num_src_per_tgt);
770 free(sum_mvp_at_tgt->ref_count);
771 }
773 free(sum_mvp_at_tgt);
774}
#define UNUSED(x)
Definition core.h:72
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.
struct Xt_redist_ * Xt_redist
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine)
Execute the get phase and receive target data synchronously.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine)
Test whether the put phase has completed.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_get_test(struct yac_interpolation_exchange *exchange, char const *routine)
Test whether the get phase has completed.
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine)
Execute the full exchange (put + get) synchronously.
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_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine)
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.
enum YAC_INTERP_EXCH_STATUS yac_interpolation_exchange_status(struct yac_interpolation_exchange *exchange, char const *routine)
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine)
Execute the get phase asynchronously.
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine)
Delete an interpolation exchange and release resources.
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine)
Wait for completion of pending put/get phases.
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)
Utility macros and functions for interpolation operators. This file contains utility macros for targe...
#define CHECK_WITH_FRAC_MASK()
Assert that a local with_frac_mask flag is consistent with the frac_mask_fallback_value that was pass...
static void compute_tgt_field_stencil(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 using stencil-based summation of source data (sparse-matrix-vector multip...
@ 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:270
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:39