13 Xt_redist redist, MPI_Datatype(*xt_redist_get_MPI_Datatype)(Xt_redist,
int)) {
15 if (redist == NULL)
return 0;
17 MPI_Comm comm = xt_redist_get_MPI_Comm(redist);
23 for (
int i = 0; i < comm_size; ++i) {
25 MPI_Datatype dt = xt_redist_get_MPI_Datatype(redist, i);
26 if (dt == MPI_DATATYPE_NULL)
continue;
28 yac_mpi_call(MPI_Type_get_extent(dt, &lb, &extent), comm);
29 size_t curr_size = (size_t)extent + (
size_t)lb;
30 if (curr_size > max_size) max_size = curr_size;
47 Xt_redist * redists,
size_t num_fields,
52 "ERROR(get_buffer_sizes): invalid buffer type");
58 size_t * buffer_sizes;
59 if (redists == NULL) {
60 buffer_sizes =
xcalloc(num_fields,
sizeof(*buffer_sizes));
62 buffer_sizes =
xmalloc(num_fields *
sizeof(*buffer_sizes));
63 for (
size_t i = 0; i < num_fields; ++i)
70 size_t * buffer_sizes,
size_t num_fields,
size_t collection_size) {
72 size_t total_buffer_size = 0;
73 for (
size_t i = 0; i < num_fields; ++i)
74 total_buffer_size += buffer_sizes[i];
75 double ** buffer_data =
76 xmalloc(collection_size * num_fields *
sizeof(*buffer_data));
77 buffer_data[0] =
xmalloc(collection_size * total_buffer_size);
78 for (
size_t i = 0, offset = 0; i < collection_size; ++i) {
79 for (
size_t j = 0; j < num_fields; offset += buffer_sizes[j++]) {
80 buffer_data[i * num_fields + j] =
81 (
double*)((
char*)(buffer_data[0]) + offset);
88 Xt_redist * redists,
size_t num_fields,
size_t collection_size,
100 Xt_redist * redists,
size_t * min_buffer_sizes,
size_t num_fields,
105 for (
size_t i = 0; i < num_fields; ++i)
117 size_t collection_size) {
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
#define xcalloc(nmemb, size)
#define COPY_DATA(data, count)
#define YAC_ASSERT(exp, msg)
#define yac_mpi_call(call, comm)