1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
3 * (C) 2001 by Argonne National Laboratory.
4 * See COPYRIGHT in top-level directory.
10 #define MAX_WORLD_SIZE 1024
12 int main(int argc, char *argv[])
15 int ranks[MAX_WORLD_SIZE], ranksout[MAX_WORLD_SIZE], ranksin[MAX_WORLD_SIZE];
17 MPI_Group gworld, gself, ngroup, galt;
19 int rank, size, i, nelms;
21 MTest_Init(&argc, &argv);
23 MPI_Comm_group(MPI_COMM_SELF, &gself);
25 comm = MPI_COMM_WORLD;
27 MPI_Comm_size(comm, &size);
28 MPI_Comm_rank(comm, &rank);
30 if (size > MAX_WORLD_SIZE) {
32 "This test requires a comm world with no more than %d processes\n", MAX_WORLD_SIZE);
33 MPI_Abort(MPI_COMM_WORLD, 1);
36 fprintf(stderr, "This test requiers at least 4 processes\n");
37 MPI_Abort(MPI_COMM_WORLD, 1);
40 MPI_Comm_group(comm, &gworld);
41 for (i = 0; i < size; i++) {
45 /* Try translating ranks from comm world compared against
46 * comm self, so most will be UNDEFINED */
47 MPI_Group_translate_ranks(gworld, size, ranks, gself, ranksout);
49 for (i = 0; i < size; i++) {
51 if (ranksout[i] != 0) {
52 printf("[%d] Rank %d is %d but should be 0\n", rank, i, ranksout[i]);
57 if (ranksout[i] != MPI_UNDEFINED) {
58 printf("[%d] Rank %d is %d but should be undefined\n", rank, i, ranksout[i]);
64 /* MPI-2 Errata requires that MPI_PROC_NULL is mapped to MPI_PROC_NULL */
65 ranks[0] = MPI_PROC_NULL;
68 ranks[3] = MPI_PROC_NULL;
69 for (i = 0; i < 4; i++)
72 MPI_Group_translate_ranks(gworld, 4, ranks, gself, ranksout);
73 if (ranksout[0] != MPI_PROC_NULL) {
74 printf("[%d] Rank[0] should be MPI_PROC_NULL but is %d\n", rank, ranksout[0]);
77 if (rank != 1 && ranksout[1] != MPI_UNDEFINED) {
78 printf("[%d] Rank[1] should be MPI_UNDEFINED but is %d\n", rank, ranksout[1]);
81 if (rank == 1 && ranksout[1] != 0) {
82 printf("[%d] Rank[1] should be 0 but is %d\n", rank, ranksout[1]);
85 if (ranksout[2] != 0) {
86 printf("[%d] Rank[2] should be 0 but is %d\n", rank, ranksout[2]);
89 if (ranksout[3] != MPI_PROC_NULL) {
90 printf("[%d] Rank[3] should be MPI_PROC_NULL but is %d\n", rank, ranksout[3]);
94 MPI_Group_free(&gself);
96 /* Now, try comparing small groups against larger groups, and use groups
97 * with irregular members (to bypass optimizations in group_translate_ranks
101 ranks[nelms++] = size - 2;
103 if (rank != 0 && rank != size - 2) {
104 ranks[nelms++] = rank;
107 MPI_Group_incl(gworld, nelms, ranks, &ngroup);
109 for (i = 0; i < nelms; i++)
113 ranksin[2] = MPI_PROC_NULL;
115 MPI_Group_translate_ranks(ngroup, nelms + 1, ranksin, gworld, ranksout);
116 for (i = 0; i < nelms + 1; i++) {
117 if (ranksin[i] == MPI_PROC_NULL) {
118 if (ranksout[i] != MPI_PROC_NULL) {
119 fprintf(stderr, "Input rank for proc_null but output was %d\n", ranksout[i]);
123 else if (ranksout[i] != ranks[ranksin[i]]) {
124 fprintf(stderr, "Expected ranksout[%d] = %d but found %d\n",
125 i, ranks[ranksin[i]], ranksout[i]);
130 range[0][0] = size - 1;
133 MPI_Group_range_incl(gworld, 1, range, &galt);
134 for (i = 0; i < nelms + 1; i++)
136 MPI_Group_translate_ranks(ngroup, nelms + 1, ranksin, galt, ranksout);
137 for (i = 0; i < nelms + 1; i++) {
138 if (ranksin[i] == MPI_PROC_NULL) {
139 if (ranksout[i] != MPI_PROC_NULL) {
140 fprintf(stderr, "Input rank for proc_null but output was %d\n", ranksout[i]);
144 else if (ranksout[i] != (size - 1) - ranks[ranksin[i]]) {
145 fprintf(stderr, "Expected ranksout[%d] = %d but found %d\n",
146 i, (size - 1) - ranks[ranksin[i]], ranksout[i]);
152 MPI_Group_free(&gworld);
153 MPI_Group_free(&galt);
154 MPI_Group_free(&ngroup);
156 MTest_Finalize(errs);