File: gtranks.c

package info (click to toggle)
mpich 4.3.0%2Breally4.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, trixie
  • size: 419,120 kB
  • sloc: ansic: 1,215,557; cpp: 74,755; javascript: 40,763; f90: 20,649; sh: 18,463; xml: 14,418; python: 14,397; perl: 13,772; makefile: 9,279; fortran: 8,063; java: 4,553; asm: 324; ruby: 176; lisp: 19; php: 8; sed: 4
file content (156 lines) | stat: -rw-r--r-- 4,744 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * Copyright (C) by Argonne National Laboratory
 *     See COPYRIGHT in top-level directory
 */

#include "mpi.h"
#include <stdio.h>
#include "mpitest.h"

#define MAX_WORLD_SIZE 1024

int main(int argc, char *argv[])
{
    int errs = 0;
    int ranks[MAX_WORLD_SIZE], ranksout[MAX_WORLD_SIZE], ranksin[MAX_WORLD_SIZE];
    int range[1][3];
    MPI_Group gworld, gself, ngroup, galt;
    MPI_Comm comm;
    int rank, size, i, nelms;

    MTest_Init(&argc, &argv);

    MPI_Comm_group(MPI_COMM_SELF, &gself);

    comm = MPI_COMM_WORLD;

    MPI_Comm_size(comm, &size);
    MPI_Comm_rank(comm, &rank);

    if (size > MAX_WORLD_SIZE) {
        fprintf(stderr,
                "This test requires a comm world with no more than %d processes\n", MAX_WORLD_SIZE);
        MPI_Abort(MPI_COMM_WORLD, 1);
    }
    if (size < 4) {
        fprintf(stderr, "This test requiers at least 4 processes\n");
        MPI_Abort(MPI_COMM_WORLD, 1);
    }

    MPI_Comm_group(comm, &gworld);
    for (i = 0; i < size; i++) {
        ranks[i] = i;
        ranksout[i] = -1;
    }
    /* Try translating ranks from comm world compared against
     * comm self, so most will be UNDEFINED */
    MPI_Group_translate_ranks(gworld, size, ranks, gself, ranksout);

    for (i = 0; i < size; i++) {
        if (i == rank) {
            if (ranksout[i] != 0) {
                printf("[%d] Rank %d is %d but should be 0\n", rank, i, ranksout[i]);
                errs++;
            }
        } else {
            if (ranksout[i] != MPI_UNDEFINED) {
                printf("[%d] Rank %d is %d but should be undefined\n", rank, i, ranksout[i]);
                errs++;
            }
        }
    }

    /* MPI-2 Errata requires that MPI_PROC_NULL is mapped to MPI_PROC_NULL */
    ranks[0] = MPI_PROC_NULL;
    ranks[1] = 1;
    ranks[2] = rank;
    ranks[3] = MPI_PROC_NULL;
    for (i = 0; i < 4; i++)
        ranksout[i] = -1;

    MPI_Group_translate_ranks(gworld, 4, ranks, gself, ranksout);
    if (ranksout[0] != MPI_PROC_NULL) {
        printf("[%d] Rank[0] should be MPI_PROC_NULL but is %d\n", rank, ranksout[0]);
        errs++;
    }
    if (rank != 1 && ranksout[1] != MPI_UNDEFINED) {
        printf("[%d] Rank[1] should be MPI_UNDEFINED but is %d\n", rank, ranksout[1]);
        errs++;
    }
    if (rank == 1 && ranksout[1] != 0) {
        printf("[%d] Rank[1] should be 0 but is %d\n", rank, ranksout[1]);
        errs++;
    }
    if (ranksout[2] != 0) {
        printf("[%d] Rank[2] should be 0 but is %d\n", rank, ranksout[2]);
        errs++;
    }
    if (ranksout[3] != MPI_PROC_NULL) {
        printf("[%d] Rank[3] should be MPI_PROC_NULL but is %d\n", rank, ranksout[3]);
        errs++;
    }

    MPI_Group_free(&gself);

    /* Now, try comparing small groups against larger groups, and use groups
     * with irregular members (to bypass optimizations in group_translate_ranks
     * for simple groups)
     */
    nelms = 0;
    ranks[nelms++] = size - 2;
    ranks[nelms++] = 0;
    if (rank != 0 && rank != size - 2) {
        ranks[nelms++] = rank;
    }

    MPI_Group_incl(gworld, nelms, ranks, &ngroup);

    for (i = 0; i < nelms; i++)
        ranksout[i] = -1;
    ranksin[0] = 1;
    ranksin[1] = 0;
    ranksin[2] = MPI_PROC_NULL;
    ranksin[3] = 2;
    MPI_Group_translate_ranks(ngroup, nelms + 1, ranksin, gworld, ranksout);
    for (i = 0; i < nelms + 1; i++) {
        if (ranksin[i] == MPI_PROC_NULL) {
            if (ranksout[i] != MPI_PROC_NULL) {
                fprintf(stderr, "Input rank for proc_null but output was %d\n", ranksout[i]);
                errs++;
            }
        } else if (ranksout[i] != ranks[ranksin[i]]) {
            fprintf(stderr, "Expected ranksout[%d] = %d but found %d\n",
                    i, ranks[ranksin[i]], ranksout[i]);
            errs++;
        }
    }

    range[0][0] = size - 1;
    range[0][1] = 0;
    range[0][2] = -1;
    MPI_Group_range_incl(gworld, 1, range, &galt);
    for (i = 0; i < nelms + 1; i++)
        ranksout[i] = -1;
    MPI_Group_translate_ranks(ngroup, nelms + 1, ranksin, galt, ranksout);
    for (i = 0; i < nelms + 1; i++) {
        if (ranksin[i] == MPI_PROC_NULL) {
            if (ranksout[i] != MPI_PROC_NULL) {
                fprintf(stderr, "Input rank for proc_null but output was %d\n", ranksout[i]);
                errs++;
            }
        } else if (ranksout[i] != (size - 1) - ranks[ranksin[i]]) {
            fprintf(stderr, "Expected ranksout[%d] = %d but found %d\n",
                    i, (size - 1) - ranks[ranksin[i]], ranksout[i]);
            errs++;
        }
    }


    MPI_Group_free(&gworld);
    MPI_Group_free(&galt);
    MPI_Group_free(&ngroup);

    MTest_Finalize(errs);

    return MTestReturnValue(errs);
}