Blame test/mpi/group/gtranks.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2001 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
#include "mpi.h"
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
#include "mpitest.h"
Packit Service c5cf8c
Packit Service c5cf8c
#define MAX_WORLD_SIZE 1024
Packit Service c5cf8c
Packit Service c5cf8c
int main(int argc, char *argv[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int errs = 0;
Packit Service c5cf8c
    int ranks[MAX_WORLD_SIZE], ranksout[MAX_WORLD_SIZE], ranksin[MAX_WORLD_SIZE];
Packit Service c5cf8c
    int range[1][3];
Packit Service c5cf8c
    MPI_Group gworld, gself, ngroup, galt;
Packit Service c5cf8c
    MPI_Comm comm;
Packit Service c5cf8c
    int rank, size, i, nelms;
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Init(&argc, &argv);
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm_group(MPI_COMM_SELF, &gself);
Packit Service c5cf8c
Packit Service c5cf8c
    comm = MPI_COMM_WORLD;
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm_size(comm, &size);
Packit Service c5cf8c
    MPI_Comm_rank(comm, &rank;;
Packit Service c5cf8c
Packit Service c5cf8c
    if (size > MAX_WORLD_SIZE) {
Packit Service c5cf8c
        fprintf(stderr,
Packit Service c5cf8c
                "This test requires a comm world with no more than %d processes\n", MAX_WORLD_SIZE);
Packit Service c5cf8c
        MPI_Abort(MPI_COMM_WORLD, 1);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (size < 4) {
Packit Service c5cf8c
        fprintf(stderr, "This test requiers at least 4 processes\n");
Packit Service c5cf8c
        MPI_Abort(MPI_COMM_WORLD, 1);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm_group(comm, &gworld);
Packit Service c5cf8c
    for (i = 0; i < size; i++) {
Packit Service c5cf8c
        ranks[i] = i;
Packit Service c5cf8c
        ranksout[i] = -1;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* Try translating ranks from comm world compared against
Packit Service c5cf8c
     * comm self, so most will be UNDEFINED */
Packit Service c5cf8c
    MPI_Group_translate_ranks(gworld, size, ranks, gself, ranksout);
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < size; i++) {
Packit Service c5cf8c
        if (i == rank) {
Packit Service c5cf8c
            if (ranksout[i] != 0) {
Packit Service c5cf8c
                printf("[%d] Rank %d is %d but should be 0\n", rank, i, ranksout[i]);
Packit Service c5cf8c
                errs++;
Packit Service c5cf8c
            }
Packit Service c5cf8c
        } else {
Packit Service c5cf8c
            if (ranksout[i] != MPI_UNDEFINED) {
Packit Service c5cf8c
                printf("[%d] Rank %d is %d but should be undefined\n", rank, i, ranksout[i]);
Packit Service c5cf8c
                errs++;
Packit Service c5cf8c
            }
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* MPI-2 Errata requires that MPI_PROC_NULL is mapped to MPI_PROC_NULL */
Packit Service c5cf8c
    ranks[0] = MPI_PROC_NULL;
Packit Service c5cf8c
    ranks[1] = 1;
Packit Service c5cf8c
    ranks[2] = rank;
Packit Service c5cf8c
    ranks[3] = MPI_PROC_NULL;
Packit Service c5cf8c
    for (i = 0; i < 4; i++)
Packit Service c5cf8c
        ranksout[i] = -1;
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Group_translate_ranks(gworld, 4, ranks, gself, ranksout);
Packit Service c5cf8c
    if (ranksout[0] != MPI_PROC_NULL) {
Packit Service c5cf8c
        printf("[%d] Rank[0] should be MPI_PROC_NULL but is %d\n", rank, ranksout[0]);
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (rank != 1 && ranksout[1] != MPI_UNDEFINED) {
Packit Service c5cf8c
        printf("[%d] Rank[1] should be MPI_UNDEFINED but is %d\n", rank, ranksout[1]);
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (rank == 1 && ranksout[1] != 0) {
Packit Service c5cf8c
        printf("[%d] Rank[1] should be 0 but is %d\n", rank, ranksout[1]);
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (ranksout[2] != 0) {
Packit Service c5cf8c
        printf("[%d] Rank[2] should be 0 but is %d\n", rank, ranksout[2]);
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
    }
Packit Service c5cf8c
    if (ranksout[3] != MPI_PROC_NULL) {
Packit Service c5cf8c
        printf("[%d] Rank[3] should be MPI_PROC_NULL but is %d\n", rank, ranksout[3]);
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Group_free(&gself);
Packit Service c5cf8c
Packit Service c5cf8c
    /* Now, try comparing small groups against larger groups, and use groups
Packit Service c5cf8c
     * with irregular members (to bypass optimizations in group_translate_ranks
Packit Service c5cf8c
     * for simple groups)
Packit Service c5cf8c
     */
Packit Service c5cf8c
    nelms = 0;
Packit Service c5cf8c
    ranks[nelms++] = size - 2;
Packit Service c5cf8c
    ranks[nelms++] = 0;
Packit Service c5cf8c
    if (rank != 0 && rank != size - 2) {
Packit Service c5cf8c
        ranks[nelms++] = rank;
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Group_incl(gworld, nelms, ranks, &ngroup);
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < nelms; i++)
Packit Service c5cf8c
        ranksout[i] = -1;
Packit Service c5cf8c
    ranksin[0] = 1;
Packit Service c5cf8c
    ranksin[1] = 0;
Packit Service c5cf8c
    ranksin[2] = MPI_PROC_NULL;
Packit Service c5cf8c
    ranksin[3] = 2;
Packit Service c5cf8c
    MPI_Group_translate_ranks(ngroup, nelms + 1, ranksin, gworld, ranksout);
Packit Service c5cf8c
    for (i = 0; i < nelms + 1; i++) {
Packit Service c5cf8c
        if (ranksin[i] == MPI_PROC_NULL) {
Packit Service c5cf8c
            if (ranksout[i] != MPI_PROC_NULL) {
Packit Service c5cf8c
                fprintf(stderr, "Input rank for proc_null but output was %d\n", ranksout[i]);
Packit Service c5cf8c
                errs++;
Packit Service c5cf8c
            }
Packit Service c5cf8c
        } else if (ranksout[i] != ranks[ranksin[i]]) {
Packit Service c5cf8c
            fprintf(stderr, "Expected ranksout[%d] = %d but found %d\n",
Packit Service c5cf8c
                    i, ranks[ranksin[i]], ranksout[i]);
Packit Service c5cf8c
            errs++;
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    range[0][0] = size - 1;
Packit Service c5cf8c
    range[0][1] = 0;
Packit Service c5cf8c
    range[0][2] = -1;
Packit Service c5cf8c
    MPI_Group_range_incl(gworld, 1, range, &galt);
Packit Service c5cf8c
    for (i = 0; i < nelms + 1; i++)
Packit Service c5cf8c
        ranksout[i] = -1;
Packit Service c5cf8c
    MPI_Group_translate_ranks(ngroup, nelms + 1, ranksin, galt, ranksout);
Packit Service c5cf8c
    for (i = 0; i < nelms + 1; i++) {
Packit Service c5cf8c
        if (ranksin[i] == MPI_PROC_NULL) {
Packit Service c5cf8c
            if (ranksout[i] != MPI_PROC_NULL) {
Packit Service c5cf8c
                fprintf(stderr, "Input rank for proc_null but output was %d\n", ranksout[i]);
Packit Service c5cf8c
                errs++;
Packit Service c5cf8c
            }
Packit Service c5cf8c
        } else if (ranksout[i] != (size - 1) - ranks[ranksin[i]]) {
Packit Service c5cf8c
            fprintf(stderr, "Expected ranksout[%d] = %d but found %d\n",
Packit Service c5cf8c
                    i, (size - 1) - ranks[ranksin[i]], ranksout[i]);
Packit Service c5cf8c
            errs++;
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Group_free(&gworld);
Packit Service c5cf8c
    MPI_Group_free(&galt);
Packit Service c5cf8c
    MPI_Group_free(&ngroup);
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Finalize(errs);
Packit Service c5cf8c
Packit Service c5cf8c
    return MTestReturnValue(errs);
Packit Service c5cf8c
}