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 );
39 fprintf( stderr, "This test requiers at least 4 processes\n" );
40 MPI_Abort( MPI_COMM_WORLD, 1 );
44 MPI_Comm_group( comm, &gworld );
45 for (i=0; i<size; i++) {
49 /* Try translating ranks from comm world compared against
50 comm self, so most will be UNDEFINED */
51 MPI_Group_translate_ranks( gworld, size, ranks, gself, ranksout );
53 for (i=0; i<size; i++) {
55 if (ranksout[i] != 0) {
56 printf( "[%d] Rank %d is %d but should be 0\n", rank,
62 if (ranksout[i] != MPI_UNDEFINED) {
63 printf( "[%d] Rank %d is %d but should be undefined\n", rank,
70 /* MPI-2 Errata requires that MPI_PROC_NULL is mapped to MPI_PROC_NULL */
71 ranks[0] = MPI_PROC_NULL;
74 ranks[3] = MPI_PROC_NULL;
75 for (i=0; i<4; i++) ranksout[i] = -1;
77 MPI_Group_translate_ranks( gworld, 4, ranks, gself, ranksout );
78 if (ranksout[0] != MPI_PROC_NULL) {
79 printf( "[%d] Rank[0] should be MPI_PROC_NULL but is %d\n",
83 if (rank != 1 && ranksout[1] != MPI_UNDEFINED) {
84 printf( "[%d] Rank[1] should be MPI_UNDEFINED but is %d\n",
88 if (rank == 1 && ranksout[1] != 0) {
89 printf( "[%d] Rank[1] should be 0 but is %d\n",
93 if (ranksout[2] != 0) {
94 printf( "[%d] Rank[2] should be 0 but is %d\n",
98 if (ranksout[3] != MPI_PROC_NULL) {
99 printf( "[%d] Rank[3] should be MPI_PROC_NULL but is %d\n",
104 MPI_Group_free(&gself);
106 /* Now, try comparing small groups against larger groups, and use groups
107 with irregular members (to bypass optimizations in group_translate_ranks
111 ranks[nelms++] = size - 2;
113 if (rank != 0 && rank != size - 2) {
114 ranks[nelms++] = rank;
117 MPI_Group_incl( gworld, nelms, ranks, &ngroup );
119 for (i=0; i<nelms; i++) ranksout[i] = -1;
122 ranksin[2] = MPI_PROC_NULL;
124 MPI_Group_translate_ranks( ngroup, nelms+1, ranksin, gworld, ranksout );
125 for (i=0; i<nelms+1; i++) {
126 if (ranksin[i] == MPI_PROC_NULL) {
127 if (ranksout[i] != MPI_PROC_NULL) {
128 fprintf( stderr, "Input rank for proc_null but output was %d\n",
133 else if (ranksout[i] != ranks[ranksin[i]]) {
134 fprintf( stderr, "Expected ranksout[%d] = %d but found %d\n",
135 i, ranks[ranksin[i]], ranksout[i] );
140 range[0][0] = size -1 ;
143 MPI_Group_range_incl( gworld, 1, range, &galt);
144 for (i=0; i<nelms+1; i++) ranksout[i] = -1;
145 MPI_Group_translate_ranks( ngroup, nelms+1, ranksin, galt, ranksout );
146 for (i=0; i<nelms+1; i++) {
147 if (ranksin[i] == MPI_PROC_NULL) {
148 if (ranksout[i] != MPI_PROC_NULL) {
149 fprintf( stderr, "Input rank for proc_null but output was %d\n",
154 else if (ranksout[i] != (size-1)-ranks[ranksin[i]]) {
155 fprintf( stderr, "Expected ranksout[%d] = %d but found %d\n",
156 i, (size-1)-ranks[ranksin[i]], ranksout[i] );
162 MPI_Group_free(&gworld);
163 MPI_Group_free(&galt);
164 MPI_Group_free(&ngroup);
166 MTest_Finalize( errs );