YAC 3.13.2
Yet Another Coupler
Loading...
Searching...
No Matches
interpolation_utils.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
7#include <mpi.h>
8#include <yaxt.h>
9
10#include "utils_core.h"
12#include "yac_mpi_internal.h"
13
15 Xt_redist redist, MPI_Datatype(*xt_redist_get_MPI_Datatype)(Xt_redist, int)) {
16
17 if (redist == NULL) return 0;
18
19 MPI_Comm comm = xt_redist_get_MPI_Comm(redist);
20 int comm_size;
21 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
22
23 size_t max_size = 0;
24
25 for (int i = 0; i < comm_size; ++i) {
26
27 MPI_Datatype dt = xt_redist_get_MPI_Datatype(redist, i);
28 if (dt == MPI_DATATYPE_NULL) continue;
29 MPI_Aint lb, extent;
30 yac_mpi_call(MPI_Type_get_extent(dt, &lb, &extent), comm);
31 size_t curr_size = (size_t)extent + (size_t)lb;
32 if (curr_size > max_size) max_size = curr_size;
33 yac_mpi_call(MPI_Type_free(&dt), comm);
34 }
35 return max_size;
36}
37
38static size_t xt_redist_get_send_buffer_size(Xt_redist redist) {
39
40 return xt_redist_get_buffer_size(redist, xt_redist_get_send_MPI_Datatype);
41}
42
43static size_t xt_redist_get_recv_buffer_size(Xt_redist redist) {
44
45 return xt_redist_get_buffer_size(redist, xt_redist_get_recv_MPI_Datatype);
46}
47
48static size_t * get_buffer_sizes(
49 Xt_redist * redists, size_t num_fields,
51
53 (type == SEND_BUFFER) || (type == RECV_BUFFER),
54 "ERROR(get_buffer_sizes): invalid buffer type");
55
56 size_t (*xt_redist_get_buffer_size)(Xt_redist) =
57 (type == SEND_BUFFER)?
59
60 size_t * buffer_sizes;
61 if (redists == NULL) {
62 buffer_sizes = xcalloc(num_fields, sizeof(*buffer_sizes));
63 } else {
64 buffer_sizes = xmalloc(num_fields * sizeof(*buffer_sizes));
65 for (size_t i = 0; i < num_fields; ++i)
66 buffer_sizes[i] = xt_redist_get_buffer_size(redists[i]);
67 }
68 return buffer_sizes;
69}
70
71static double ** allocate_buffer(
72 size_t * buffer_sizes, size_t num_fields, size_t collection_size) {
73
74 size_t total_buffer_size = 0;
75 for (size_t i = 0; i < num_fields; ++i)
76 total_buffer_size += buffer_sizes[i];
77 double ** buffer_data =
78 xmalloc(collection_size * num_fields * sizeof(*buffer_data));
79 buffer_data[0] = xmalloc(collection_size * total_buffer_size);
80 for (size_t i = 0, offset = 0; i < collection_size; ++i) {
81 for (size_t j = 0; j < num_fields; offset += buffer_sizes[j++]) {
82 buffer_data[i * num_fields + j] =
83 (double*)((char*)(buffer_data[0]) + offset);
84 }
85 }
86 return buffer_data;
87}
88
90 Xt_redist * redists, size_t num_fields, size_t collection_size,
92
93 size_t * buffer_sizes = get_buffer_sizes(redists, num_fields, type);
94
95 return
97 .buffer_sizes = buffer_sizes,
99}
100
102 Xt_redist * redists, size_t * min_buffer_sizes, size_t num_fields,
104
105
106 size_t * buffer_sizes = get_buffer_sizes(redists, num_fields, type);
107 for (size_t i = 0; i < num_fields; ++i)
108 if (min_buffer_sizes[i] > buffer_sizes[i])
109 buffer_sizes[i] = min_buffer_sizes[i];
110
111 return
112 (struct yac_interpolation_buffer) {
113 .buffer_sizes = buffer_sizes,
115}
116
119 size_t collection_size) {
120
121 return
122 (struct yac_interpolation_buffer) {
123 .buffer_sizes = COPY_DATA(src.buffer_sizes, num_fields),
124 .buffer =
126}
127
129
130 free(buffer->buffer[0]);
131 free(buffer->buffer);
132 free(buffer->buffer_sizes);
133}
unsigned num_fields
#define YAC_ASSERT(exp, msg)
enum callback_type type
static double ** allocate_buffer(size_t *buffer_sizes, size_t num_fields, size_t collection_size)
static size_t xt_redist_get_buffer_size(Xt_redist redist, MPI_Datatype(*xt_redist_get_MPI_Datatype)(Xt_redist, int))
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)
static size_t xt_redist_get_recv_buffer_size(Xt_redist redist)
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)
static size_t * get_buffer_sizes(Xt_redist *redists, size_t num_fields, enum yac_interpolation_buffer_type type)
static size_t xt_redist_get_send_buffer_size(Xt_redist redist)
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)
yac_interpolation_buffer_type
@ SEND_BUFFER
@ RECV_BUFFER
Definition __init__.py:1
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
int collection_size
double * buffer
#define COPY_DATA(data, count)
Definition utils_core.h:258
#define yac_mpi_call(call, comm)