21 double *** src_fields,
double *** src_frac_masks,
double ** tgt_field,
22 double frac_mask_fallback_value,
double scale_factor,
double scale_summand);
25 double *** src_fields,
double *** src_frac_masks,
26 int is_target,
double frac_mask_fallback_value,
27 double scale_factor,
double scale_summand);
30 double frac_mask_fallback_value,
double scale_factor,
double scale_summand);
33 double frac_mask_fallback_value,
double scale_factor,
double scale_summand);
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;
140 return contains_non_remote_src_data;
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) {
259 xmalloc(1 *
sizeof(*mvp_at_tgt));
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) {
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];
323 prefix_num_src_per_tgt[tgt_count] = total_num_src;
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]);
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;
354 collection_selection,
356 src_redists, min_buffer_sizes, num_src_fields,
359 src_redists, num_src_fields,
362 src_redists, num_src_fields,
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,
369 num_src_fields, with_frac_mask, NULL);
371 free(min_buffer_sizes);
409 size_t const * collection_indices =
419 if (collection_indices != NULL) {
421 double *** temp_src_fields =
428 temp_src_fields[i][j] =
src_fields[collection_indices[i]][j];
433 double *** temp_src_frac_masks =
435 temp_src_frac_masks[0] =
439 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i *
num_src_fields;
441 temp_src_frac_masks[i][j] =
462 sum_mvp_at_tgt->
src2tgt, (
double const **)src_send_buffer,
463 src_recv_buffer,
"yac_interp_operator_sum_mvp_at_tgt_execute");
468 (
double const * restrict *)src_recv_buffer,
469 (
double const * restrict *)(
477 if (sum_mvp_at_tgt->
is_source && (collection_indices != NULL)) {
503 "yac_interp_operator_sum_mvp_at_tgt_execute_put") !=
507 double ** src_send_buffer = NULL;
519 size_t const * collection_indices =
526 if (collection_indices == NULL) {
530 src_send_buffer_sizes[j]);
545 src_send_buffer_sizes[j]);
553 src_send_buffer_sizes[j]);
559 sum_mvp_at_tgt->
src2tgt, (
double const **)src_send_buffer,
560 "yac_interp_operator_sum_mvp_at_tgt_execute_put");
578 (
double const * restrict **)(sum_mvp_at_tgt->
src_fields),
579 (
double const * restrict **)(
581 (
double const * restrict *)src_recv_buffer,
582 (
double const * restrict *)(
609 "yac_interp_operator_sum_mvp_at_tgt_execute_get") !=
616 "yac_interp_operator_sum_mvp_at_tgt_execute_get");
648 "yac_interp_operator_sum_mvp_at_tgt_execute_get");
661 "yac_interp_operator_sum_mvp_at_tgt_execute_put_test");
685 "yac_interp_operator_sum_mvp_at_tgt_execute_get_test");
704 "yac_interp_operator_sum_mvp_at_tgt_execute_wait");
740 if (interp == NULL)
return;
749 sum_mvp_at_tgt->
src2tgt,
"yac_interp_operator_sum_mvp_at_tgt_delete");
763 free(sum_mvp_at_tgt);
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.
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)
#define xcalloc(nmemb, size)
double ** src_fields_buffer
struct yac_collection_selection * collection_selection
struct yac_interpolation_buffer src_send_data
struct yac_interp_operator_vtable const * vtable
struct yac_interpolation_buffer src_recv_data
double frac_mask_fallback_value
struct yac_interpolation_exchange * src2tgt
size_t * prefix_num_src_per_tgt
double *** src_frac_masks
Virtual function table for interpolation operators.
int(* is_source)(struct yac_interp_operator *interp)
Abstract interpolation operator type.
#define COPY_DATA(data, count)
#define YAC_ASSERT_F(exp, format,...)