Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
still not our
[simgrid.git] / teshsuite / smpi / mpich3-test / datatype / subarray.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2001 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6
7 #include <stdio.h>
8 #include <string.h>
9 #include "mpi.h"
10
11 #define X 64
12 #define Y 8
13 #define Z 512
14
15 double array[X][Y][Z];
16
17 int main(int argc, char *argv[])
18 {
19     int myrank;
20     MPI_Datatype subarray;
21     int array_size[] = {X, Y, Z};
22     int array_subsize[] = {X/2, Y/2, Z};
23     int array_start[] = {0, 0, 0};
24     int i, j, k;
25     int errs = 0;
26
27     MPI_Init(&argc, &argv);
28     MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
29
30     for (i = 0; i < X; ++i) {
31         for (j = 0; j < Y; ++j) {
32             for (k = 0; k < Z; ++k) {
33                 if (myrank == 0)
34                     array[i][j][k] = 2.0;
35                 else
36                     array[i][j][k] = -2.0;
37             }
38         }
39     }
40
41     MPI_Type_create_subarray(3, array_size, array_subsize, array_start, MPI_ORDER_C,
42                              MPI_DOUBLE, &subarray);
43     MPI_Type_commit(&subarray);
44
45     if(myrank == 0)
46         MPI_Send(array, 1, subarray, 1, 0, MPI_COMM_WORLD);
47     else {
48         MPI_Recv(array, 1, subarray, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
49         for (i = array_start[0]; i < array_subsize[0]; ++i) {
50             for (j = array_start[1]; j < array_subsize[1]; ++j) {
51                 for (k = array_start[2]; k < array_subsize[2]; ++k) {
52                     if (array[i][j][k] != 2.0)
53                         ++errs;
54                 }
55             }
56         }
57     }
58
59     MPI_Type_free(&subarray);
60
61     MPI_Allreduce(MPI_IN_PLACE, &errs, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
62     if (myrank == 0) {
63         if (errs)
64             printf("Found %d errors\n", errs);
65         else
66             printf(" No Errors\n");
67     }
68     MPI_Finalize();
69
70     return 0;
71 }