test_xmap_all2all_fail.c 5.13 KB
Newer Older
1
/**
Thomas Jahns's avatar
Thomas Jahns committed
2
 * @file test_xmap_all2all_fail.c
3
 *
4
 * @copyright Copyright  (C)  2016 Jörg Behrens <behrens@dkrz.de>
5
6
7
8
9
10
11
12
13
14
15
16
 *                                 Moritz Hanke <hanke@dkrz.de>
 *                                 Thomas Jahns <jahns@dkrz.de>
 *
 * @author Jörg Behrens <behrens@dkrz.de>
 *         Moritz Hanke <hanke@dkrz.de>
 *         Thomas Jahns <jahns@dkrz.de>
 */
/*
 * Keywords:
 * Maintainer: Jörg Behrens <behrens@dkrz.de>
 *             Moritz Hanke <hanke@dkrz.de>
 *             Thomas Jahns <jahns@dkrz.de>
Moritz Hanke's avatar
Moritz Hanke committed
17
 * URL: https://doc.redmine.dkrz.de/yaxt/html/
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are  permitted provided that the following conditions are
 * met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 *
 * Neither the name of the DKRZ GmbH nor the names of its contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
 * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
Thomas Jahns's avatar
Thomas Jahns committed
46
47
48
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
49

50
51
#include <assert.h>
#include <string.h>
Thomas Jahns's avatar
Thomas Jahns committed
52
53
54
55
56
#ifdef XT_NEED_MPI_ABORT_WORK_AROUND
#  include <fcntl.h>
#  include <sys/stat.h>
#  include <sys/types.h>
#endif
57
#include <unistd.h>
Thomas Jahns's avatar
Thomas Jahns committed
58

59
60
61
62
63
64
65
#include <mpi.h>

#include <yaxt.h>

#define VERBOSE
#include "tests.h"

66
67
68
69
70
/* If we're not using GNU C, elide __attribute__ */
#ifndef __GNUC__
#  define  __attribute__(x)  /*NOTHING*/
#endif

Thomas Jahns's avatar
Thomas Jahns committed
71
static enum {
72
73
  SMALL,
  BIG,
Thomas Jahns's avatar
Thomas Jahns committed
74
} index_list_size = SMALL;
75

76
static void
77
parse_options(int *argc, char ***argv);
78
79
80
81
82
83
84
85
86
static void
xfail_abort(MPI_Comm comm, const char *msg, const char *source, int line)
  __attribute__((noreturn));

typedef void (*Xt_abort_func)(MPI_Comm comm, const char *msg,
                              const char *source, int line)
  __attribute__((noreturn));
extern Xt_abort_func Xt_abort;

87

88
int main(int argc, char **argv) {
89
90
91
92
93
94
95
96
97

   // init mpi
   xt_mpi_call(MPI_Init(NULL, NULL), MPI_COMM_WORLD);

   xt_initialize(MPI_COMM_WORLD);

   int my_rank;
   MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

98
   parse_options(&argc, &argv);
99

100
101
102
103
   {
      // source index list
      struct Xt_stripe src_stripe;
      src_stripe.nstrides = (index_list_size == SMALL)?7:1023;
104
      src_stripe.start = (Xt_int)(1 + (Xt_int)my_rank * src_stripe.nstrides);
105
106
      src_stripe.stride = 1;
      Xt_idxlist src_idxlist = xt_idxstripes_new(&src_stripe, 1);
107
108

      // destination index list
109
110
      struct Xt_stripe dst_stripe;
      dst_stripe.nstrides = src_stripe.nstrides;
111
      dst_stripe.start = (Xt_int)(src_stripe.start + src_stripe.nstrides);
112
113
      dst_stripe.stride = -1;
      Xt_idxlist dst_idxlist = xt_idxstripes_new(&dst_stripe, 1);
114
115
116

      // test of exchange map
      // NOTE: this should fail
117
      Xt_abort = xfail_abort;
118
119
120
      Xt_xmap xmap
        = xt_xmap_all2all_new(src_idxlist, dst_idxlist, MPI_COMM_WORLD);

121
122
      /* this position should not be reached */
      MPI_Abort(MPI_COMM_WORLD, 1);
123
124
125
126
127
128
129

      // clean up
      xt_xmap_delete(xmap);
      xt_idxlist_delete(src_idxlist);
      xt_idxlist_delete(dst_idxlist);
   }

Thomas Jahns's avatar
Thomas Jahns committed
130
131
   xt_finalize();
   xt_mpi_call(MPI_Finalize(), MPI_COMM_WORLD);
132
133
134

   return TEST_EXIT_CODE;
}
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154

static void
parse_options(int *argc, char ***argv)
{
  int opt;
  while ((opt = getopt(*argc, *argv, "s:")) != -1) {
    switch (opt) {
    case 's':
      if (!strcmp(optarg, "small"))
        index_list_size = SMALL;
      else if (!strcmp(optarg, "big"))
        index_list_size = BIG;
      else
      {
        fprintf(stderr, "Unknown data size \"%s\"\n", optarg);
        exit(EXIT_FAILURE);
      }
    }
  }
}
155

156
157
158
159
static void
xfail_abort(MPI_Comm comm, const char *msg, const char *source, int line)
{
  fprintf(stderr, "Fatal error in %s, line %d: %s\n", source, line, msg);
Thomas Jahns's avatar
Thomas Jahns committed
160
161
162
163
164
165
166
#ifdef XT_NEED_MPI_ABORT_WORK_AROUND
  int fd = open("test_xmap_all2all_fail.result.txt",
                O_WRONLY | O_TRUNC | O_CREAT | O_NOCTTY, 0777);
  static const char exit_msg[] = "exited with code 3\n";
  write(fd, exit_msg, sizeof (exit_msg));
  close(fd);
#endif
167
168
169
170
  MPI_Abort(comm, 3);
  abort();
}

171
172
173
174
175
176
177
178
179
/*
 * Local Variables:
 * c-basic-offset: 2
 * coding: utf-8
 * indent-tabs-mode: nil
 * show-trailing-whitespace: t
 * require-trailing-newline: t
 * End:
 */