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],
16 ranksin[MAX_WORLD_SIZE];
18 MPI_Group gworld, gself, ngroup, galt;
20 int rank, size, i, nelms;
22 MTest_Init( &argc, &argv );
24 MPI_Comm_group( MPI_COMM_SELF, &gself );
26 comm = MPI_COMM_WORLD;
28 MPI_Comm_size( comm, &size );
29 MPI_Comm_rank( comm, &rank );
31 if (size > MAX_WORLD_SIZE) {
33 "This test requires a comm world with no more than %d processes\n",
35 MPI_Abort( MPI_COMM_WORLD, 1 );
38 fprintf( stderr, "This test requiers at least 4 processes\n" );
39 MPI_Abort( MPI_COMM_WORLD, 1 );
42 MPI_Comm_group( comm, &gworld );
43 for (i=0; i<size; i++) {
47 /* Try translating ranks from comm world compared against
48 comm self, so most will be UNDEFINED */
49 MPI_Group_translate_ranks( gworld, size, ranks, gself, ranksout );
51 for (i=0; i<size; i++) {
53 if (ranksout[i] != 0) {
54 printf( "[%d] Rank %d is %d but should be 0\n", rank,
60 if (ranksout[i] != MPI_UNDEFINED) {
61 printf( "[%d] Rank %d is %d but should be undefined\n", rank,
68 /* MPI-2 Errata requires that MPI_PROC_NULL is mapped to MPI_PROC_NULL */
69 ranks[0] = MPI_PROC_NULL;
72 ranks[3] = MPI_PROC_NULL;
73 for (i=0; i<4; i++) ranksout[i] = -1;
75 MPI_Group_translate_ranks( gworld, 4, ranks, gself, ranksout );
76 if (ranksout[0] != MPI_PROC_NULL) {
77 printf( "[%d] Rank[0] should be MPI_PROC_NULL but is %d\n",
81 if (rank != 1 && ranksout[1] != MPI_UNDEFINED) {
82 printf( "[%d] Rank[1] should be MPI_UNDEFINED but is %d\n",
86 if (rank == 1 && ranksout[1] != 0) {
87 printf( "[%d] Rank[1] should be 0 but is %d\n",
91 if (ranksout[2] != 0) {
92 printf( "[%d] Rank[2] should be 0 but is %d\n",
96 if (ranksout[3] != MPI_PROC_NULL) {
97 printf( "[%d] Rank[3] should be MPI_PROC_NULL but is %d\n",
102 MPI_Group_free(&gself);
104 /* Now, try comparing small groups against larger groups, and use groups
105 with irregular members (to bypass optimizations in group_translate_ranks
109 ranks[nelms++] = size - 2;
111 if (rank != 0 && rank != size - 2) {
112 ranks[nelms++] = rank;
115 MPI_Group_incl( gworld, nelms, ranks, &ngroup );
117 for (i=0; i<nelms; i++) ranksout[i] = -1;
120 ranksin[2] = MPI_PROC_NULL;
122 MPI_Group_translate_ranks( ngroup, nelms+1, ranksin, gworld, ranksout );
123 for (i=0; i<nelms+1; i++) {
124 if (ranksin[i] == MPI_PROC_NULL) {
125 if (ranksout[i] != MPI_PROC_NULL) {
126 fprintf( stderr, "Input rank for proc_null but output was %d\n",
131 else if (ranksout[i] != ranks[ranksin[i]]) {
132 fprintf( stderr, "Expected ranksout[%d] = %d but found %d\n",
133 i, ranks[ranksin[i]], ranksout[i] );
138 range[0][0] = size -1 ;
141 MPI_Group_range_incl( gworld, 1, range, &galt);
142 for (i=0; i<nelms+1; i++) ranksout[i] = -1;
143 MPI_Group_translate_ranks( ngroup, nelms+1, ranksin, galt, ranksout );
144 for (i=0; i<nelms+1; i++) {
145 if (ranksin[i] == MPI_PROC_NULL) {
146 if (ranksout[i] != MPI_PROC_NULL) {
147 fprintf( stderr, "Input rank for proc_null but output was %d\n",
152 else if (ranksout[i] != (size-1)-ranks[ranksin[i]]) {
153 fprintf( stderr, "Expected ranksout[%d] = %d but found %d\n",
154 i, (size-1)-ranks[ranksin[i]], ranksout[i] );
160 MPI_Group_free(&gworld);
161 MPI_Group_free(&galt);
162 MPI_Group_free(&ngroup);
164 MTest_Finalize( errs );