Yet Another eXchange Tool 0.11.2
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 <stdint.h>
54#include <string.h>
55
56#include <mpi.h>
57
58#include <xt/xt_config.h>
59#include <xt/xt_mpi.h>
60#include "xt_config_internal.h"
67#include "xt_idxlist_internal.h"
68#include "xt/quicksort.h"
69#include "xt/mergesort.h"
73#include "core/core.h"
74#include "core/ppm_xfuncs.h"
75
76static const char filename[] = "xt_config.c";
77
79{
80 Xt_config config = xmalloc(sizeof(*config));
81 *config = xt_default_config;
82 return config;
83}
84
86{
88 free((void *)(intptr_t)config->xmdd_bucket_gen);
89 free(config);
90}
91
92static const struct {
93 char name[32];
95 int code;
96} exchanger_table[] = {
97 { "irecv_send",
99 { "irecv_isend",
101 { "irecv_isend_packed",
103 { "irecv_isend_ddt_packed",
104#ifdef XT_ENABLE_DDT_EXCHANGER
106#else
108#endif
110 { "mix_irecv_isend",
112 { "neigh_alltoall",
113#ifdef XT_CAN_USE_MPI_NEIGHBOR_ALLTOALL
115#else
117#endif
120
121enum {
123};
124
125int
127{
128 for (size_t i = 0; i < num_exchanger; ++i)
129 if (!strcmp(name, exchanger_table[i].name))
130 return exchanger_table[i].code;
131 return -1;
132}
133
134static inline size_t
136{
137 for (size_t i = 0; i < num_exchanger; ++i)
138 if (exchanger_table[i].f == exchanger_new)
139 return i;
140 return SIZE_MAX;
141}
142
143
145{
146 Xt_exchanger_new exchanger_new = config->exchanger_new;
147 size_t eentry = exchanger_by_function(exchanger_new);
148 if (eentry != SIZE_MAX)
149 return exchanger_table[eentry].code;
150 static const char fmt[]
151 = "error: unexpected exchanger function (%p)!";
152 char buf[sizeof (fmt) + 3*sizeof(void *)];
153 sprintf(buf, fmt, (void *)exchanger_new);
154 Xt_abort(Xt_default_comm, buf, filename, __LINE__);
155}
156
159{
160 Xt_exchanger_new exchanger_new = config->exchanger_new;
161#ifdef XT_CAN_USE_MPI_NEIGHBOR_ALLTOALL
162 if (exchanger_new == xt_exchanger_neigh_alltoall_new) {
163 int flag;
164 xt_mpi_call(MPI_Comm_test_inter(comm, &flag), comm);
165 if (flag)
166 exchanger_new = xt_exchanger_mix_isend_irecv_new;
167 }
168#else
169 (void)comm;
170#endif
171 return exchanger_new;
172}
173
174static const struct {
175 char name[16];
177} sort_algo_table[] = {
178 { .name = "quicksort",
179 .func = {
180 .sort_int = xt_quicksort_int,
181 .sort_xt_int = xt_quicksort_xt_int,
182 .sort_index = xt_quicksort_index,
183 .sort_idxpos = xt_quicksort_idxpos,
184 .sort_xt_int_permutation = xt_quicksort_xt_int_permutation,
185 .sort_int_permutation = xt_quicksort_int_permutation
186 },
187 },
188 { .name = "mergesort",
189 .func = {
190 .sort_int = xt_mergesort_int,
191 .sort_xt_int = xt_mergesort_xt_int,
192 .sort_index = xt_mergesort_index,
193 .sort_idxpos = xt_mergesort_idxpos,
194 .sort_xt_int_permutation = xt_mergesort_xt_int_permutation,
195 .sort_int_permutation = xt_mergesort_int_permutation
196 },
197 },
199
200enum {
202};
203
205 .exchanger_new = xt_exchanger_mix_isend_irecv_new,
206 .exchanger_team_share = NULL,
207 .idxv_cnv_size = CHEAP_VECTOR_SIZE,
208 .sort_funcs = &sort_algo_table[XT_QUICKSORT].func,
209 .xmdd_bucket_gen = &Xt_xmdd_cycl_stripe_bucket_gen_desc,
210 .flags = 2U << xt_force_xmap_striping_bit_ofs,
211};
212
213
214int
216{
217 for (size_t i = 0; i < num_sort_algo; ++i)
218 if (!strcmp(name, sort_algo_table[i].name))
219 return (int)i;
220 return -1;
221}
222
223static inline size_t
225{
226 for (size_t i = 0; i < num_sort_algo; ++i)
228 return i;
229 return SIZE_MAX;
230}
231
233{
234 const struct Xt_sort_algo_funcptr *sort_funcs = config->sort_funcs;
235 size_t eentry = sort_algo_by_table(sort_funcs);
236 if (eentry != SIZE_MAX)
237 return (int)eentry;
238 static const char fmt[]
239 = "error: unexpected exchanger function (%p)!";
240 char buf[sizeof (fmt) + 3*sizeof(void *)];
241 sprintf(buf, fmt, (const void *)sort_funcs);
242 Xt_abort(Xt_default_comm, buf, filename, __LINE__);
243}
244
246{
247 if (algo >= 0 && algo < num_sort_algo) {
248 config->sort_funcs = &sort_algo_table[algo].func;
249 return;
250 }
251 static const char fmt[]
252 = "error: user-requested exchanger code (%d) does not exist!";
253 char buf[sizeof (fmt) + 3*sizeof(int)];
254 sprintf(buf, fmt, algo);
255 Xt_abort(Xt_default_comm, buf, filename, __LINE__);
256}
257
258enum {
260};
261
262void
263xt_config_set_mem_saving(Xt_config config, int memconserve)
264{
265 XT_CONFIG_SET_FORCE_NOSORT_BIT(config, memconserve);
266}
267
268int
273
274
277{
278 return (Xt_xmdd_bucket_gen)(intptr_t)config->xmdd_bucket_gen;
279}
280
281void
283 Xt_xmdd_bucket_gen bucket_gen_iface)
284{
285 if (bucket_gen_iface == &Xt_xmdd_cycl_stripe_bucket_gen_desc)
286 config->xmdd_bucket_gen = bucket_gen_iface;
287 else {
288 Xt_xmdd_bucket_gen gen = xmalloc(sizeof (*bucket_gen_iface));
289 config->xmdd_bucket_gen = gen;
290 *gen = *bucket_gen_iface;
291 }
292}
293
294
295
296
298{
299 static const char fmt[]
300 = "error: user-requested exchanger code (%d) does not exist!";
301 char buf[sizeof (fmt) + 3*sizeof(int)];
302 const char *msg = buf;
303 for (size_t i = 0; i < num_exchanger; ++i)
304 if (exchanger_table[i].code == method) {
305 Xt_exchanger_new exchanger_new;
306 if (exchanger_table[i].f) {
307 exchanger_new = exchanger_table[i].f;
308 } else {
309 exchanger_new = xt_default_config.exchanger_new;
310 size_t default_entry = exchanger_by_function(exchanger_new);
311 if (default_entry == SIZE_MAX) {
312 msg = "error: invalid default exchanger constructor!";
313 goto abort;
314 }
315 fprintf(stderr, "warning: %s exchanger unavailable, using "
316 "%s instead\n",
317 exchanger_table[i].name, exchanger_table[default_entry].name);
318 }
319 config->exchanger_new = exchanger_new;
320 return;
321 }
322 sprintf(buf, fmt, method);
323abort:
324 Xt_abort(Xt_default_comm, msg, filename, __LINE__);
325}
326
328{
329 return config->idxv_cnv_size;
330}
331
332void
334{
335 if (cnvsize > 3)
336 config->idxv_cnv_size = cnvsize;
337}
338
339int
341{
342 return (int)((config->flags & (uint32_t)xt_mthread_mode_mask)
344}
345
346void
348{
349 assert(mode >= XT_MT_NONE && mode <= XT_MT_OPENMP);
350#ifndef _OPENMP
351 if (mode == XT_MT_OPENMP)
352 Xt_abort(Xt_default_comm,
353 "error: automatic opening of OpenMP parallel regions requested,"
354 " but OpenMP is not configured.\n", filename, __LINE__);
355#else
356 if (mode == XT_MT_OPENMP) {
357 int thread_support_provided = MPI_THREAD_SINGLE;
358 xt_mpi_call(MPI_Query_thread(&thread_support_provided), Xt_default_comm);
359 if (thread_support_provided != MPI_THREAD_MULTIPLE)
360 Xt_abort(Xt_default_comm,
361 "error: automatic opening of OpenMP parallel regions requested,"
362 "\n but MPI is not running in thread-safe mode.\n",
363 filename, __LINE__);
364 }
365#endif
366 config->flags = (config->flags & ~(uint32_t)xt_mthread_mode_mask)
367 | ((uint32_t)mode << xt_mthread_mode_bit_ofs);
368}
369
370void
371xt_config_set_dist_dir_stripe_alignment(Xt_config config, int use_stripe_alignment);
372
373void
374xt_config_set_dist_dir_stripe_alignment(Xt_config config, int use_stripe_alignment)
375{
376 xt_config_set_xmap_stripe_align(config, use_stripe_alignment);
377}
378
379int
381
382int
387
388void
389xt_config_set_xmap_stripe_align(Xt_config config, int use_stripe_align)
390{
391 if (use_stripe_align < 0 || use_stripe_align > 2)
392 Xt_abort(Xt_default_comm,
393 "error: invalid value passed to "
394 "xt_config_set_xmap_stripe_align.\n", filename, __LINE__);
395 XT_CONFIG_SET_XMAP_STRIPING(config, use_stripe_align);
396}
397
398int
403
524void
526{
527 const char *config_env = getenv("XT_CONFIG_DEFAULT_EXCHANGE_METHOD");
528 if (config_env) {
529 int exchanger_id = xt_exchanger_id_by_name(config_env);
530 if (exchanger_id != -1)
532 else
533 fprintf(stderr, "warning: Unexpected value "
534 "for XT_CONFIG_DEFAULT_EXCHANGE_METHOD=%s\n", config_env);
535 }
536 config_env = getenv("XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE");
537 if (config_env) {
538 const char *endptr;
539 long v;
540 errno = 0;
541 if (!strcmp(config_env, "INT_MAX")) {
542 v = INT_MAX;
543 endptr = config_env + 7;
544 } else {
545 char *endptr_;
546 v = strtol(config_env, &endptr_, 0);
547 endptr = endptr_;
548 }
549 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
550 || (errno != 0 && v == 0)) {
551 perror("failed to parse value of "
552 "XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE environment variable");
553 } else if (endptr == config_env) {
554 fputs("malformed value of XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE"
555 " environment variable, no digits were found\n",
556 stderr);
557 } else if (v < 1 || v > INT_MAX) {
558 fprintf(stderr, "value of XT_CONFIG_DEFAULT_IDXVEC_AUTOCONVERT_SIZE"
559 " environment variable (%ld) out of range [1,%d]\n",
560 v, INT_MAX);
561 } else
563 }
564 config_env = getenv("XT_CONFIG_DEFAULT_MULTI_THREAD_MODE");
565 if (config_env) {
566 char *endptr;
567 long v = strtol(config_env, &endptr, 0);
568 if (endptr != config_env) {
569 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
570 || (errno != 0 && v == 0)) {
571 perror("failed to parse value of "
572 "XT_CONFIG_DEFAULT_MULTI_THREAD_MODE environment variable");
573 goto dont_set_mt_mode;
574 } else if (v < XT_MT_NONE || v > XT_MT_OPENMP) {
575 fprintf(stderr, "numeric value of XT_CONFIG_DEFAULT_MULTI_THREAD_MODE"
576 " environment variable (%ld) out of range [0,%d]\n",
577 v, XT_MT_OPENMP);
578 goto dont_set_mt_mode;
579 } else if (*endptr) {
580 fprintf(stderr, "trailing text '%s' found after numeric value (%*s) in "
581 "XT_CONFIG_DEFAULT_MULTI_THREAD_MODE environment variable\n",
582 endptr, (int)(endptr-config_env), config_env);
583 goto dont_set_mt_mode;
584 }
585 } else {
586 if (!strcasecmp(config_env, "XT_MT_OPENMP")) {
587#ifndef _OPENMP
588 fputs("multi-threaded operation requested via "
589 "XT_CONFIG_DEFAULT_MULTI_THREAD_MODE, but OpenMP support is not"
590 " compiled in!\n", stderr);
591 goto dont_set_mt_mode;
592#else
593 v = XT_MT_OPENMP;
594#endif
595 } else if (!strcasecmp(config_env, "XT_MT_NONE")) {
596 v = XT_MT_NONE;
597 } else {
598 fputs("unexpected value of XT_CONFIG_DEFAULT_MULTI_THREAD_MODE"
599 " environment variable, unrecognized text or numeral\n",
600 stderr);
601 goto dont_set_mt_mode;
602 }
603 }
605 }
606dont_set_mt_mode:;
607
608 config_env = getenv("XT_CONFIG_DEFAULT_SORT_ALGORITHM");
609 if (config_env) {
610 char *endptr;
611 long v = strtol(config_env, &endptr, 0);
612 if (endptr != config_env) {
613 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
614 || (errno != 0 && v == 0)) {
615 perror("failed to parse value of "
616 "XT_CONFIG_DEFAULT_SORT_ALGORITHM environment variable");
617 goto dont_set_sort_algorithm;
618 } else if (v < 0 || v > XT_MERGESORT) {
619 fprintf(stderr, "numeric value of XT_CONFIG_DEFAULT_SORT_ALGORITHM"
620 " environment variable (%ld) out of range [0,%d]\n",
621 v, XT_MERGESORT);
622 goto dont_set_sort_algorithm;
623 } else if (*endptr) {
624 fprintf(stderr, "trailing text '%s' found after numeric value (%*s) in "
625 "XT_CONFIG_DEFAULT_SORT_ALGORITHM environment variable\n",
626 endptr, (int)(endptr-config_env), config_env);
627 goto dont_set_sort_algorithm;
628 }
629 } else {
630 if (!strcasecmp(config_env, "QUICKSORT")) {
631 v = XT_QUICKSORT;
632 } else if (!strcasecmp(config_env, "MERGESORT")) {
633 v = XT_MERGESORT;
634 } else {
635 fputs("unexpected value of XT_CONFIG_DEFAULT_SORT_ALGORITHM"
636 " environment variable, unrecognized text or numeral\n",
637 stderr);
638 goto dont_set_sort_algorithm;
639 }
640 }
642 }
643dont_set_sort_algorithm:;
644 {
645 const char *evn = "XT_CONFIG_DEFAULT_XMAP_STRIPE_ALIGN";
646 config_env = getenv(evn);
647 if (!config_env)
648 config_env = getenv((evn = "XT_CONFIG_DEFAULT_DIST_DIR_STRIPE_ALIGNMENT"));
649 if (config_env) {
650 const char *endptr;
651 long v;
652 errno = 0;
653 if (!strcmp(config_env, "auto")) {
654 v = 2;
655 endptr = config_env + 4;
656 } else if (!strcmp(config_env, "one_by_one")) {
657 v = 0;
658 endptr = config_env + 10;
659 } else if (!strcmp(config_env, "always")) {
660 v = 1;
661 endptr = config_env + 6;
662 } else {
663 char *endptr_;
664 v = strtol(config_env, &endptr_, 0);
665 endptr = endptr_;
666 }
667 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
668 || (errno != 0 && v == 0)) {
669 fprintf(stderr, "warning: failed to parse value of "
670 "environment variable %s: %s", evn, strerror(errno));
671 } else if (endptr == config_env) {
672 fprintf(stderr, "warning: malformed value of environment variable "
673 "%s, no digits or symbolic constant found\n", evn);
674 } else if (v < 0 || v > 2) {
675 fprintf(stderr, "value of environment variable %s (%ld) out of range [0,2]\n", evn, v);
676 } else
678 }
679 }
680
681 {
682 static const char evn[] = "XT_CONFIG_DEFAULT_MEM_SAVING";
683 config_env = getenv(evn);
684 if (config_env) {
685 const char *endptr;
686 long v;
687 if (!strcasecmp(config_env, "FORCE_NOSORT")) {
688 v = 1;
689 endptr = config_env + 12;
690 } else {
691 char *endptr_;
692 v = strtol(config_env, &endptr_, 0);
693 endptr = endptr_;
694 }
695 if ((errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
696 || (errno != 0 && v == 0)) {
697 perror("failed to parse value of "
698 "XT_CONFIG_DEFAULT_MEM_SAVING environment variable");
699 } else if (endptr == config_env) {
700 fprintf(stderr, "warning: malformed value of environment variable "
701 "%s, no digits or symbolic constant found\n", evn);
702 } else if (v < 0 || v > XT_MAX_MEM_SAVING) {
703 fprintf(stderr, "numeric value of XT_CONFIG_DEFAULT_MEM_SAVING"
704 " environment variable (%ld) out of range [0,%d]\n",
706 } else if (*endptr) {
707 fprintf(stderr, "trailing text '%s' found after value (%*s) in "
708 "%s environment variable\n",
709 endptr, (int)(endptr-config_env), evn, config_env);
710 } else
712 }
713 }
714}
715
716/*
717 * Local Variables:
718 * c-basic-offset: 2
719 * coding: utf-8
720 * indent-tabs-mode: nil
721 * show-trailing-whitespace: t
722 * require-trailing-newline: t
723 * End:
724 */
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 xt_config_set_xmap_stripe_align(Xt_config config, int use_stripe_align)
Definition xt_config.c:389
void xt_config_set_idxvec_autoconvert_size(Xt_config config, int cnvsize)
Definition xt_config.c:333
void xt_config_set_redist_mthread_mode(Xt_config config, int mode)
Definition xt_config.c:347
void xt_config_defaults_init(void)
Definition xt_config.c:525
@ XT_MAX_MEM_SAVING
Definition xt_config.c:259
static const char filename[]
Definition xt_config.c:76
int xt_exchanger_id_by_name(const char *name)
Definition xt_config.c:126
int xt_sort_algo_id_by_name(const char *name)
Definition xt_config.c:215
void xt_config_delete(Xt_config config)
Definition xt_config.c:85
void xt_config_set_exchange_method(Xt_config config, int method)
Definition xt_config.c:297
void xt_config_set_sort_algorithm_by_id(Xt_config config, int algo)
Definition xt_config.c:245
int xt_config_get_mem_saving(Xt_config config)
Definition xt_config.c:269
int code
Definition xt_config.c:95
static const struct @117030141027020005042111231012044123003044056005 sort_algo_table[]
void xt_config_set_mem_saving(Xt_config config, int memconserve)
Definition xt_config.c:263
int xt_config_get_dist_dir_stripe_alignment(Xt_config config)
Definition xt_config.c:383
void xt_config_set_dist_dir_stripe_alignment(Xt_config config, int use_stripe_alignment)
Definition xt_config.c:374
int xt_config_get_sort_algorithm_id(Xt_config config)
Definition xt_config.c:232
@ num_exchanger
Definition xt_config.c:122
Xt_xmdd_bucket_gen xt_config_get_xmdd_bucket_gen(Xt_config config)
Definition xt_config.c:276
int xt_config_get_redist_mthread_mode(Xt_config config)
Definition xt_config.c:340
Xt_config xt_config_new(void)
Definition xt_config.c:78
@ num_sort_algo
Definition xt_config.c:201
void xt_config_set_xmdd_bucket_gen(Xt_config config, Xt_xmdd_bucket_gen bucket_gen_iface)
Definition xt_config.c:282
Xt_exchanger_new xt_config_get_exchange_new_by_comm(Xt_config config, MPI_Comm comm)
Definition xt_config.c:158
int xt_config_get_xmap_stripe_align(Xt_config config)
Definition xt_config.c:399
int xt_config_get_idxvec_autoconvert_size(Xt_config config)
Definition xt_config.c:327
int xt_config_get_exchange_method(Xt_config config)
Definition xt_config.c:144
struct Xt_config_ xt_default_config
Definition xt_config.c:204
struct Xt_sort_algo_funcptr func
Definition xt_config.c:176
static size_t sort_algo_by_table(const struct Xt_sort_algo_funcptr *sort_funcs)
Definition xt_config.c:224
char name[32]
Definition xt_config.c:93
static size_t exchanger_by_function(Xt_exchanger_new exchanger_new)
Definition xt_config.c:135
static const struct @166373060313372022170003223057022306144070252033 exchanger_table[]
Xt_exchanger_new f
Definition xt_config.c:94
opaque configuration object for settings where the default needs to be overridden
struct Xt_config_ * Xt_config
Definition xt_config.h:58
@ 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_irecv_isend_ddt_packed
Definition xt_config.h:81
@ xt_exchanger_neigh_alltoall
Definition xt_config.h:80
@ xt_exchanger_mix_isend_irecv
Definition xt_config.h:79
implementation of configuration object
#define XT_CONFIG_SET_FORCE_NOSORT_BIT(config, val)
#define XT_CONFIG_GET_FORCE_NOSORT(config)
@ xt_force_xmap_striping_bit_ofs
@ xt_mthread_mode_bit_ofs
@ xt_mthread_mode_mask
#define XT_CONFIG_GET_XMAP_STRIPING(config)
#define XT_CONFIG_SET_XMAP_STRIPING(config, v)
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
struct Xt_xmdd_bucket_gen_ * Xt_xmdd_bucket_gen
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.