Yet Another eXchange Tool 0.11.1
Loading...
Searching...
No Matches
xt_config.c
Go to the documentation of this file.
1
13/*
14 * Maintainer: Jörg Behrens <behrens@dkrz.de>
15 * Moritz Hanke <hanke@dkrz.de>
16 * Thomas Jahns <jahns@dkrz.de>
17 *
18 * URL: https://dkrz-sw.gitlab-pages.dkrz.de/yaxt/
19 *
20 * Redistribution and use in source and binary forms, with or without
21 * modification, are permitted provided that the following conditions are
22 * met:
23 *
24 * Redistributions of source code must retain the above copyright notice,
25 * this list of conditions and the following disclaimer.
26 *
27 * Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 *
31 * Neither the name of the DKRZ GmbH nor the names of its contributors
32 * may be used to endorse or promote products derived from this software
33 * without specific prior written permission.
34 *
35 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
36 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
37 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
38 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
39 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
40 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
41 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
42 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
45 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46 */
47#ifdef HAVE_CONFIG_H
48#include <config.h>
49#endif
50
51#include <assert.h>
52#include <errno.h>
53#include <string.h>
54
55#include <mpi.h>
56
57#include <xt/xt_config.h>
58#include <xt/xt_mpi.h>
59#include "xt_config_internal.h"
66#include "xt_idxlist_internal.h"
67#include "xt/quicksort.h"
68#include "xt/mergesort.h"
72#include "core/core.h"
73#include "core/ppm_xfuncs.h"
74
75static const char filename[] = "xt_config.c";
76
78{
79 Xt_config config = xmalloc(sizeof(*config));
80 *config = xt_default_config;
81 return config;
82}
83
85{
87 free((void *)config->xmdd_bucket_gen);
88 free(config);
89}
90
91static const struct {
92 char name[32];
94 int code;
95} exchanger_table[] = {
96 { "irecv_send",
98 { "irecv_isend",
100 { "irecv_isend_packed",
102 { "irecv_isend_ddt_packed",
103#ifdef XT_ENABLE_DDT_EXCHANGER
105#else
107#endif
108 xt_exchanger_irecv_isend_ddt_packed },
109 { "mix_irecv_isend",
111 { "neigh_alltoall",
112#ifdef XT_CAN_USE_MPI_NEIGHBOR_ALLTOALL
114#else
116#endif
117 xt_exchanger_neigh_alltoall },
119
120enum {
122};
123
124int
126{
127 for (size_t i = 0; i < num_exchanger; ++i)
128 if (!strcmp(name, exchanger_table[i].name))
129 return exchanger_table[i].code;
130 return -1;
131}
132
133static inline size_t
135{
136 for (size_t i = 0; i < num_exchanger; ++i)
137 if (exchanger_table[i].f == exchanger_new)
138 return i;
139 return SIZE_MAX;
140}
141
142
144{
145 Xt_exchanger_new exchanger_new = config->exchanger_new;
146 size_t eentry = exchanger_by_function(exchanger_new);
147 if (eentry != SIZE_MAX)
148 return exchanger_table[eentry].code;
149 static const char fmt[]
150 = "error: unexpected exchanger function (%p)!";
151 char buf[sizeof (fmt) + 3*sizeof(void *)];
152 sprintf(buf, fmt, (void *)exchanger_new);
153 Xt_abort(Xt_default_comm, buf, filename, __LINE__);
154}
155
158{
159 Xt_exchanger_new exchanger_new = config->exchanger_new;
160#ifdef XT_CAN_USE_MPI_NEIGHBOR_ALLTOALL
161 if (exchanger_new == xt_exchanger_neigh_alltoall_new) {
162 int flag;
163 xt_mpi_call(MPI_Comm_test_inter(comm, &flag), comm);
164 if (flag)
165 exchanger_new = xt_exchanger_mix_isend_irecv_new;
166 }
167#else
168 (void)comm;
169#endif
170 return exchanger_new;
171}
172
173static const struct {
174 char name[16];
176} sort_algo_table[] = {
177 { .name = "quicksort",
178 .func = {
180 .sort_xt_int = xt_quicksort_xt_int,
181 .sort_index = xt_quicksort_index,
182 .sort_idxpos = xt_quicksort_idxpos,
183 .sort_xt_int_permutation = xt_quicksort_xt_int_permutation,
184 .sort_int_permutation = xt_quicksort_int_permutation
185 },
186 },
187 { .name = "mergesort",
188 .func = {
189 .sort_int = xt_mergesort_int,
190 .sort_xt_int = xt_mergesort_xt_int,
191 .sort_index = xt_mergesort_index,
192 .sort_idxpos = xt_mergesort_idxpos,
193 .sort_xt_int_permutation = xt_mergesort_xt_int_permutation,
194 .sort_int_permutation = xt_mergesort_int_permutation
195 },
196 },
198
199enum {
201};
202
205 .exchanger_team_share = NULL,
206 .idxv_cnv_size = CHEAP_VECTOR_SIZE,
207 .sort_funcs = &sort_algo_table[XT_QUICKSORT].func,
208 .xmdd_bucket_gen = &Xt_xmdd_cycl_stripe_bucket_gen_desc,
210};
211
212
213int
215{
216 for (size_t i = 0; i < num_sort_algo; ++i)
217 if (!strcmp(name, sort_algo_table[i].name))
218 return (int)i;
219 return -1;
220}
221
222static inline size_t
224{
225 for (size_t i = 0; i < num_sort_algo; ++i)
227 return i;
228 return SIZE_MAX;
229}
230
232{
233 const struct Xt_sort_algo_funcptr *sort_funcs = config->sort_funcs;
234 size_t eentry = sort_algo_by_table(sort_funcs);
235 if (eentry != SIZE_MAX)
236 return (int)eentry;
237 static const char fmt[]
238 = "error: unexpected exchanger function (%p)!";
239 char buf[sizeof (fmt) + 3*sizeof(void *)];
240 sprintf(buf, fmt, (void *)sort_funcs);
241 Xt_abort(Xt_default_comm, buf, filename, __LINE__);
242}
243
245{
246 if (algo >= 0 && algo < num_sort_algo) {
247 config->sort_funcs = &sort_algo_table[algo].func;
248 return;
249 }
250 static const char fmt[]
251 = "error: user-requested exchanger code (%d) does not exist!";
252 char buf[sizeof (fmt) + 3*sizeof(int)];
253 sprintf(buf, fmt, algo);
254 Xt_abort(Xt_default_comm, buf, filename, __LINE__);
255}
256
257void
258xt_config_set_mem_saving(Xt_config config, int memconserve)
259{
260 if (memconserve)
262 else
264}
265
266int
271
272
278
279void
281 Xt_xmdd_bucket_gen bucket_gen_iface)
282{
283 if (bucket_gen_iface == &Xt_xmdd_cycl_stripe_bucket_gen_desc)
284 config->xmdd_bucket_gen = bucket_gen_iface;
285 else {
286 Xt_xmdd_bucket_gen gen = xmalloc(sizeof (*bucket_gen_iface));
287 config->xmdd_bucket_gen = gen;
288 *gen = *bucket_gen_iface;
289 }
290}
291
292
293
294
296{
297 static const char fmt[]
298 = "error: user-requested exchanger code (%d) does not exist!";
299 char buf[sizeof (fmt) + 3*sizeof(int)];
300 const char *msg = buf;
301 for (size_t i = 0; i < num_exchanger; ++i)
302 if (exchanger_table[i].code == method) {
303 Xt_exchanger_new exchanger_new;
304 if (exchanger_table[i].f) {
305 exchanger_new = exchanger_table[i].f;
306 } else {
307 exchanger_new = xt_default_config.exchanger_new;
308 size_t default_entry = exchanger_by_function(exchanger_new);
309 if (default_entry == SIZE_MAX) {
310 msg = "error: invalid default exchanger constructor!";
311 goto abort;
312 }
313 fprintf(stderr, "warning: %s exchanger unavailable, using "
314 "%s instead\n",
315 exchanger_table[i].name, exchanger_table[default_entry].name);
316 }
317 config->exchanger_new = exchanger_new;
318 return;
319 }
320 sprintf(buf, fmt, method);
321abort:
322 Xt_abort(Xt_default_comm, msg, filename, __LINE__);
323}
324
326{
327 return config->idxv_cnv_size;
328}
329
330void
332{
333 if (cnvsize > 3)
334 config->idxv_cnv_size = cnvsize;
335}
336
337int
339{
340 return (int)((config->flags & (uint32_t)xt_mthread_mode_mask)
342}
343
344void
346{
347 assert(mode >= XT_MT_NONE && mode <= XT_MT_OPENMP);
348#ifndef _OPENMP
349 if (mode == XT_MT_OPENMP)
350 Xt_abort(Xt_default_comm,
351 "error: automatic opening of OpenMP parallel regions requested,"
352 " but OpenMP is not configured.\n", filename, __LINE__);
353#else
354 if (mode == XT_MT_OPENMP) {
355 int thread_support_provided = MPI_THREAD_SINGLE;
356 xt_mpi_call(MPI_Query_thread(&thread_support_provided), Xt_default_comm);
357 if (thread_support_provided != MPI_THREAD_MULTIPLE)
358 Xt_abort(Xt_default_comm,
359 "error: automatic opening of OpenMP parallel regions requested,"
360 "\n but MPI is not running in thread-safe mode.\n",
361 filename, __LINE__);
362 }
363#endif
364 config->flags = (config->flags & ~(uint32_t)xt_mthread_mode_mask)
365 | ((uint32_t)mode << xt_mthread_mode_bit_ofs);
366}
367
368void
369xt_config_set_dist_dir_stripe_alignment(Xt_config config, int use_stripe_alignment)
370{
371 if (use_stripe_alignment < 0 || use_stripe_alignment > 2)
372 Xt_abort(Xt_default_comm,
373 "error: invalid value passed to "
374 "xt_config_set_dist_dir_stripe_alignment.\n", filename, __LINE__);
375 XT_CONFIG_SET_DIST_DIR_STRIPING(config, use_stripe_alignment);
376}
377
378int
383
442void
444{
445 const char *config_env = getenv("XT_CONFIG_DEFAULT_EXCHANGE_METHOD");
446 if (config_env) {
447 int exchanger_id = xt_exchanger_id_by_name(config_env);
448 if (exchanger_id != -1)
450 else
451 fprintf(stderr, "warning: Unexpected value "
452 "for XT_CONFIG_DEFAULT_EXCHANGE_METHOD=%s\n", config_env);
453 }
454 config_env = getenv("XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE");
455 if (config_env) {
456 char *endptr;
457 long v;
458 errno = 0;
459 if (!strcmp(config_env, "INT_MAX")) {
460 v = INT_MAX;
461 endptr = (char *)config_env + 7;
462 } else
463 v = strtol(config_env, &endptr, 0);
464 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
465 || (errno != 0 && v == 0)) {
466 perror("failed to parse value of "
467 "XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE environment variable");
468 } else if (endptr == config_env) {
469 fputs("malformed value of XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE"
470 " environment variable, no digits were found\n",
471 stderr);
472 } else if (v < 1 || v > INT_MAX) {
473 fprintf(stderr, "value of XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE"
474 " environment variable (%ld) out of range [1,%d]\n",
475 v, INT_MAX);
476 } else
478 }
479 config_env = getenv("XT_CONFIG_DEFAULT_MULTI_THREAD_MODE");
480 if (config_env) {
481 char *endptr;
482 long v = strtol(config_env, &endptr, 0);
483 if (endptr != config_env) {
484 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
485 || (errno != 0 && v == 0)) {
486 perror("failed to parse value of "
487 "XT_CONFIG_DEFAULT_MULTI_THREAD_MODE environment variable");
488 goto dont_set_mt_mode;
489 } else if (v < XT_MT_NONE || v > XT_MT_OPENMP) {
490 fprintf(stderr, "numeric value of XT_CONFIG_DEFAULT_MULTI_THREAD_MODE"
491 " environment variable (%ld) out of range [0,%d]\n",
492 v, XT_MT_OPENMP);
493 goto dont_set_mt_mode;
494 } else if (*endptr) {
495 fprintf(stderr, "trailing text '%s' found after numeric value (%*s) in "
496 "XT_CONFIG_DEFAULT_MULTI_THREAD_MODE environment variable\n",
497 endptr, (int)(endptr-config_env), config_env);
498 goto dont_set_mt_mode;
499 }
500 } else {
501 if (!strcasecmp(config_env, "XT_MT_OPENMP")) {
502#ifndef _OPENMP
503 fputs("multi-threaded operation requested via "
504 "XT_CONFIG_DEFAULT_MULTI_THREAD_MODE, but OpenMP support is not"
505 " compiled in!\n", stderr);
506 goto dont_set_mt_mode;
507#else
508 v = XT_MT_OPENMP;
509#endif
510 } else if (!strcasecmp(config_env, "XT_MT_NONE")) {
511 v = XT_MT_NONE;
512 } else {
513 fputs("unexpected value of XT_CONFIG_DEFAULT_MULTI_THREAD_MODE"
514 " environment variable, unrecognized text or numeral\n",
515 stderr);
516 goto dont_set_mt_mode;
517 }
518 }
520 }
521dont_set_mt_mode:;
522
523 config_env = getenv("XT_CONFIG_DEFAULT_SORT_ALGORITHM");
524 if (config_env) {
525 char *endptr;
526 long v = strtol(config_env, &endptr, 0);
527 if (endptr != config_env) {
528 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
529 || (errno != 0 && v == 0)) {
530 perror("failed to parse value of "
531 "XT_CONFIG_DEFAULT_SORT_ALGORITHM environment variable");
532 goto dont_set_sort_algorithm;
533 } else if (v < 0 || v > XT_MERGESORT) {
534 fprintf(stderr, "numeric value of XT_CONFIG_DEFAULT_SORT_ALGORITHM"
535 " environment variable (%ld) out of range [0,%d]\n",
536 v, XT_MERGESORT);
537 goto dont_set_mt_mode;
538 } else if (*endptr) {
539 fprintf(stderr, "trailing text '%s' found after numeric value (%*s) in "
540 "XT_CONFIG_DEFAULT_SORT_ALGORITHM environment variable\n",
541 endptr, (int)(endptr-config_env), config_env);
542 goto dont_set_mt_mode;
543 }
544 } else {
545 if (!strcasecmp(config_env, "QUICKSORT")) {
546 v = XT_QUICKSORT;
547 } else if (!strcasecmp(config_env, "MERGESORT")) {
548 v = XT_MERGESORT;
549 } else {
550 fputs("unexpected value of XT_CONFIG_DEFAULT_SORT_ALGORITHM"
551 " environment variable, unrecognized text or numeral\n",
552 stderr);
553 goto dont_set_sort_algorithm;
554 }
555 }
557 }
558dont_set_sort_algorithm:;
559
560 config_env = getenv("XT_CONFIG_DEFAULT_DIST_DIR_STRIPE_ALIGNMENT");
561 if (config_env) {
562 char *endptr;
563 long v;
564 errno = 0;
565 if (!strcmp(config_env, "auto")) {
566 v = 2;
567 endptr = (char *)config_env + 4;
568 } else if (!strcmp(config_env, "one_by_one")) {
569 v = 0;
570 endptr = (char *)config_env + 10;
571 } else if (!strcmp(config_env, "always")) {
572 v = 1;
573 endptr = (char *)config_env + 6;
574 } else
575 v = strtol(config_env, &endptr, 0);
576 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
577 || (errno != 0 && v == 0)) {
578 perror("failed to parse value of "
579 "XT_CONFIG_DEFAULT_DIST_DIR_STRIPE_ALIGNMENT environment variable");
580 } else if (endptr == config_env) {
581 fputs("malformed value of XT_CONFIG_DEFAULT_DIST_DIR_STRIPE_ALIGNMENT\n"
582 " environment variable, no digits or symbolic constant found\n",
583 stderr);
584 } else if (v < 0 || v > 2) {
585 fprintf(stderr, "value of XT_CONFIG_DEFAULT_DIST_DIR_STRIPE_ALIGNMENT"
586 " environment variable (%ld) out of range [0,2]\n", v);
587 } else
589 }
590}
591
592/*
593 * Local Variables:
594 * c-basic-offset: 2
595 * coding: utf-8
596 * indent-tabs-mode: nil
597 * show-trailing-whitespace: t
598 * require-trailing-newline: t
599 * End:
600 */
int MPI_Comm
Definition core.h:64
void xt_mergesort_index(Xt_int *restrict v_idx, int n, int *restrict v_pos, int reset_pos)
Definition mergesort.c:69
void xt_mergesort_xt_int_permutation(Xt_int *a, size_t n, int *restrict permutation)
merge sort declaration
void xt_mergesort_idxpos(idxpos_type *v, size_t n)
void xt_mergesort_int_permutation(int *a, size_t n, int *permutation)
void xt_mergesort_int(int a[], size_t n)
void xt_mergesort_xt_int(Xt_int a[], size_t n)
add versions of standard API functions not returning on error
#define xmalloc(size)
Definition ppm_xfuncs.h:70
void xt_quicksort_index(Xt_int *restrict v_idx, int n, int *restrict v_pos, int reset_pos)
Definition quicksort.c:71
void xt_quicksort_xt_int_permutation(Xt_int *a, size_t n, int *restrict permutation)
quicksort declaration
void xt_quicksort_int(int a[], size_t n)
void xt_quicksort_xt_int(Xt_int a[], size_t n)
void xt_quicksort_int_permutation(int *restrict a, size_t n, int *restrict permutation)
void xt_quicksort_idxpos(idxpos_type v[], size_t n)
const struct Xt_sort_algo_funcptr * sort_funcs
Xt_exchanger_new exchanger_new
const struct Xt_xmdd_bucket_gen_ * xmdd_bucket_gen
void(* sort_int)(int *a, size_t n)
void xt_config_defaults_init(void)
Definition xt_config.c:443
static const struct @3 exchanger_table[]
static const char filename[]
Definition xt_config.c:75
int xt_sort_algo_id_by_name(const char *name)
Definition xt_config.c:214
int code
Definition xt_config.c:94
int xt_config_get_dist_dir_stripe_alignment(Xt_config config)
Definition xt_config.c:379
void xt_config_set_dist_dir_stripe_alignment(Xt_config config, int use_stripe_alignment)
Definition xt_config.c:369
@ num_sort_algo
Definition xt_config.c:200
Xt_xmdd_bucket_gen xt_config_get_xmdd_bucket_gen(Xt_config config)
Definition xt_config.c:274
Xt_config xt_config_new(void)
Definition xt_config.c:77
void xt_config_set_xmdd_bucket_gen(Xt_config config, Xt_xmdd_bucket_gen bucket_gen_iface)
Definition xt_config.c:280
Xt_exchanger_new xt_config_get_exchange_new_by_comm(Xt_config config, MPI_Comm comm)
Definition xt_config.c:157
static const struct @5 sort_algo_table[]
struct Xt_config_ xt_default_config
Definition xt_config.c:203
struct Xt_sort_algo_funcptr func
Definition xt_config.c:175
static size_t sort_algo_by_table(const struct Xt_sort_algo_funcptr *sort_funcs)
Definition xt_config.c:223
@ num_exchanger
Definition xt_config.c:121
char name[32]
Definition xt_config.c:92
static size_t exchanger_by_function(Xt_exchanger_new exchanger_new)
Definition xt_config.c:134
Xt_exchanger_new f
Definition xt_config.c:93
opaque configuration object for settings where the default needs to be overridden
void xt_config_set_idxvec_autoconvert_size(Xt_config config, int cnvsize)
Definition xt_config.c:331
void xt_config_set_redist_mthread_mode(Xt_config config, int mode)
Definition xt_config.c:345
int xt_exchanger_id_by_name(const char *name)
Definition xt_config.c:125
void xt_config_delete(Xt_config config)
Definition xt_config.c:84
void xt_config_set_exchange_method(Xt_config config, int method)
Definition xt_config.c:295
void xt_config_set_sort_algorithm_by_id(Xt_config config, int algo)
Definition xt_config.c:244
int xt_config_get_mem_saving(Xt_config config)
Definition xt_config.c:267
void xt_config_set_mem_saving(Xt_config config, int memconserve)
Definition xt_config.c:258
@ XT_MT_OPENMP
Definition xt_config.h:142
@ XT_MT_NONE
Definition xt_config.h:140
@ xt_exchanger_irecv_isend
Definition xt_config.h:77
@ xt_exchanger_irecv_send
Definition xt_config.h:76
@ xt_exchanger_irecv_isend_packed
Definition xt_config.h:78
@ xt_exchanger_mix_isend_irecv
Definition xt_config.h:79
int xt_config_get_sort_algorithm_id(Xt_config config)
Definition xt_config.c:231
int xt_config_get_redist_mthread_mode(Xt_config config)
Definition xt_config.c:338
int xt_config_get_idxvec_autoconvert_size(Xt_config config)
Definition xt_config.c:325
int xt_config_get_exchange_method(Xt_config config)
Definition xt_config.c:143
implementation of configuration object
#define XT_CONFIG_GET_FORCE_NOSORT(config)
@ xt_force_dist_dir_striping_bit_ofs
@ xt_mthread_mode_bit_ofs
@ xt_mthread_mode_mask
#define XT_CONFIG_SET_DIST_DIR_STRIPING(config, v)
#define XT_CONFIG_UNSET_FORCE_NOSORT(config)
#define XT_CONFIG_SET_FORCE_NOSORT(config)
#define XT_CONFIG_GET_DIST_DIR_STRIPING(config)
Xt_exchanger(* Xt_exchanger_new)(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Xt_exchanger xt_exchanger_irecv_isend_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Xt_exchanger xt_exchanger_irecv_isend_ddt_packed_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Xt_exchanger xt_exchanger_irecv_isend_packed_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Xt_exchanger xt_exchanger_irecv_send_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Xt_exchanger xt_exchanger_mix_isend_irecv_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Xt_exchanger xt_exchanger_neigh_alltoall_new(int nsend, int nrecv, const struct Xt_redist_msg *send_msgs, const struct Xt_redist_msg *recv_msgs, MPI_Comm comm, int tag_offset, Xt_config config)
Provide non-public declarations common to all index lists.
@ CHEAP_VECTOR_SIZE
#define XT_MERGESORT
utility routines for MPI
#define xt_mpi_call(call, comm)
Definition xt_mpi.h:68
#define XT_QUICKSORT
const struct Xt_xmdd_bucket_gen_ Xt_xmdd_cycl_stripe_bucket_gen_desc
Default bucket generator for creation of distributed directories.
Default bucket generator for creation of distributed directories.