Blame test/mpi/group/grouptest2.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
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
Packit Service c5cf8c
/*
Packit Service c5cf8c
   Test the group routines
Packit Service c5cf8c
   (some tested elsewere)
Packit Service c5cf8c
Packit Service c5cf8c
MPI_Group_compare
Packit Service c5cf8c
MPI_Group_excl
Packit Service c5cf8c
MPI_Group_intersection
Packit Service c5cf8c
MPI_Group_range_excl
Packit Service c5cf8c
MPI_Group_rank
Packit Service c5cf8c
MPI_Group_size
Packit Service c5cf8c
MPI_Group_translate_ranks
Packit Service c5cf8c
MPI_Group_union
Packit Service c5cf8c
Packit Service c5cf8c
 */
Packit Service c5cf8c
#include "mpi.h"
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
/* stdlib.h Needed for malloc declaration */
Packit Service c5cf8c
#include <stdlib.h>
Packit Service c5cf8c
#include "mpitest.h"
Packit Service c5cf8c
Packit Service c5cf8c
int main(int argc, char **argv)
Packit Service c5cf8c
{
Packit Service c5cf8c
    int errs = 0;
Packit Service c5cf8c
    MPI_Group basegroup;
Packit Service c5cf8c
    MPI_Group g1, g2, g3, g4, g5, g6, g7, g8, g9, g10;
Packit Service c5cf8c
    MPI_Group g3a, g3b;
Packit Service c5cf8c
    MPI_Comm comm, newcomm, splitcomm, dupcomm;
Packit Service c5cf8c
    int i, grp_rank, rank, grp_size, size, result;
Packit Service c5cf8c
    int nranks, *ranks, *ranks_out;
Packit Service c5cf8c
    int range[1][3];
Packit Service c5cf8c
    int worldrank;
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Init(&argc, &argv);
Packit Service c5cf8c
    MPI_Comm_rank(MPI_COMM_WORLD, &worldrank);
Packit Service c5cf8c
Packit Service c5cf8c
    comm = MPI_COMM_WORLD;
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm_group(comm, &basegroup);
Packit Service c5cf8c
    MPI_Comm_rank(comm, &rank;;
Packit Service c5cf8c
    MPI_Comm_size(comm, &size);
Packit Service c5cf8c
Packit Service c5cf8c
/* Get the basic information on this group */
Packit Service c5cf8c
    MPI_Group_rank(basegroup, &grp_rank);
Packit Service c5cf8c
    if (grp_rank != rank) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "group rank %d != comm rank %d\n", grp_rank, rank);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Group_size(basegroup, &grp_size);
Packit Service c5cf8c
    if (grp_size != size) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "group size %d != comm size %d\n", grp_size, size);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
/* Form a new communicator with inverted ranking */
Packit Service c5cf8c
    MPI_Comm_split(comm, 0, size - rank, &newcomm);
Packit Service c5cf8c
    MPI_Comm_group(newcomm, &g1;;
Packit Service c5cf8c
    ranks = (int *) malloc(size * sizeof(int));
Packit Service c5cf8c
    ranks_out = (int *) malloc(size * sizeof(int));
Packit Service c5cf8c
    for (i = 0; i < size; i++)
Packit Service c5cf8c
        ranks[i] = i;
Packit Service c5cf8c
    nranks = size;
Packit Service c5cf8c
    MPI_Group_translate_ranks(g1, nranks, ranks, basegroup, ranks_out);
Packit Service c5cf8c
    for (i = 0; i < size; i++) {
Packit Service c5cf8c
        if (ranks_out[i] != (size - 1) - i) {
Packit Service c5cf8c
            errs++;
Packit Service c5cf8c
            fprintf(stdout, "Translate ranks got %d expected %d\n", ranks_out[i], (size - 1) - i);
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
/* Check Compare */
Packit Service c5cf8c
    MPI_Group_compare(basegroup, g1, &result);
Packit Service c5cf8c
    if (result != MPI_SIMILAR) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "Group compare should have been similar, was %d\n", result);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    MPI_Comm_dup(comm, &dupcomm);
Packit Service c5cf8c
    MPI_Comm_group(dupcomm, &g2;;
Packit Service c5cf8c
    MPI_Group_compare(basegroup, g2, &result);
Packit Service c5cf8c
    if (result != MPI_IDENT) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "Group compare should have been ident, was %d\n", result);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    MPI_Comm_split(comm, rank < size / 2, rank, &splitcomm);
Packit Service c5cf8c
    MPI_Comm_group(splitcomm, &g3;;
Packit Service c5cf8c
    MPI_Group_compare(basegroup, g3, &result);
Packit Service c5cf8c
    if (result != MPI_UNEQUAL) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "Group compare should have been unequal, was %d\n", result);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* Build two groups that have this process and one other, but do not
Packit Service c5cf8c
     * have the same processes */
Packit Service c5cf8c
    ranks[0] = rank;
Packit Service c5cf8c
    ranks[1] = (rank + 1) % size;
Packit Service c5cf8c
    MPI_Group_incl(basegroup, 2, ranks, &g3a);
Packit Service c5cf8c
    ranks[1] = (rank + size - 1) % size;
Packit Service c5cf8c
    MPI_Group_incl(basegroup, 2, ranks, &g3b);
Packit Service c5cf8c
    MPI_Group_compare(g3a, g3b, &result);
Packit Service c5cf8c
    if (result != MPI_UNEQUAL) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout,
Packit Service c5cf8c
                "Group compare of equal sized but different groups should have been unequal, was %d\n",
Packit Service c5cf8c
                result);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
/* Build two new groups by excluding members; use Union to put them
Packit Service c5cf8c
   together again */
Packit Service c5cf8c
Packit Service c5cf8c
/* Exclude 0 */
Packit Service c5cf8c
    for (i = 0; i < size; i++)
Packit Service c5cf8c
        ranks[i] = i;
Packit Service c5cf8c
    MPI_Group_excl(basegroup, 1, ranks, &g4;;
Packit Service c5cf8c
/* Exclude 1-(size-1) */
Packit Service c5cf8c
    MPI_Group_excl(basegroup, size - 1, ranks + 1, &g5;;
Packit Service c5cf8c
    MPI_Group_union(g5, g4, &g6;;
Packit Service c5cf8c
    MPI_Group_compare(basegroup, g6, &result);
Packit Service c5cf8c
    if (result != MPI_IDENT) {
Packit Service c5cf8c
        int usize;
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        /* See ordering requirements on union */
Packit Service c5cf8c
        fprintf(stdout, "Group excl and union did not give ident groups\n");
Packit Service c5cf8c
        fprintf(stdout, "[%d] result of compare was %d\n", rank, result);
Packit Service c5cf8c
        MPI_Group_size(g6, &usize);
Packit Service c5cf8c
        fprintf(stdout, "Size of union is %d, should be %d\n", usize, size);
Packit Service c5cf8c
    }
Packit Service c5cf8c
    MPI_Group_union(basegroup, g4, &g7;;
Packit Service c5cf8c
    MPI_Group_compare(basegroup, g7, &result);
Packit Service c5cf8c
    if (result != MPI_IDENT) {
Packit Service c5cf8c
        int usize;
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "Group union of overlapping groups failed\n");
Packit Service c5cf8c
        fprintf(stdout, "[%d] result of compare was %d\n", rank, result);
Packit Service c5cf8c
        MPI_Group_size(g7, &usize);
Packit Service c5cf8c
        fprintf(stdout, "Size of union is %d, should be %d\n", usize, size);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
/* Use range_excl instead of ranks */
Packit Service c5cf8c
    /* printf ("range excl\n"); fflush(stdout); */
Packit Service c5cf8c
    range[0][0] = 1;
Packit Service c5cf8c
    range[0][1] = size - 1;
Packit Service c5cf8c
    range[0][2] = 1;
Packit Service c5cf8c
    MPI_Group_range_excl(basegroup, 1, range, &g8;;
Packit Service c5cf8c
    /* printf("out  of range excl\n"); fflush(stdout); */
Packit Service c5cf8c
    MPI_Group_compare(g5, g8, &result);
Packit Service c5cf8c
    /* printf("out of compare\n"); fflush(stdout); */
Packit Service c5cf8c
    if (result != MPI_IDENT) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "Group range excl did not give ident groups\n");
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* printf("intersection\n"); fflush(stdout); */
Packit Service c5cf8c
    MPI_Group_intersection(basegroup, g4, &g9;;
Packit Service c5cf8c
    MPI_Group_compare(g9, g4, &result);
Packit Service c5cf8c
    if (result != MPI_IDENT) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "Group intersection did not give ident groups\n");
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
/* Exclude EVERYTHING and check against MPI_GROUP_EMPTY */
Packit Service c5cf8c
    /* printf("range excl all\n"); fflush(stdout); */
Packit Service c5cf8c
    range[0][0] = 0;
Packit Service c5cf8c
    range[0][1] = size - 1;
Packit Service c5cf8c
    range[0][2] = 1;
Packit Service c5cf8c
    MPI_Group_range_excl(basegroup, 1, range, &g10);
Packit Service c5cf8c
Packit Service c5cf8c
    /* printf("done range excl all\n"); fflush(stdout); */
Packit Service c5cf8c
    MPI_Group_compare(g10, MPI_GROUP_EMPTY, &result);
Packit Service c5cf8c
    /* printf("done compare to MPI_GROUP_EMPTY\n"); fflush(stdout); */
Packit Service c5cf8c
Packit Service c5cf8c
    if (result != MPI_IDENT) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        fprintf(stdout, "MPI_GROUP_EMPTY didn't compare against empty group\n");
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    /* printf("freeing groups\n"); fflush(stdout); */
Packit Service c5cf8c
    MPI_Group_free(&basegroup);
Packit Service c5cf8c
    MPI_Group_free(&g1;;
Packit Service c5cf8c
    MPI_Group_free(&g2;;
Packit Service c5cf8c
    MPI_Group_free(&g3;;
Packit Service c5cf8c
    MPI_Group_free(&g3a);
Packit Service c5cf8c
    MPI_Group_free(&g3b);
Packit Service c5cf8c
    MPI_Group_free(&g4;;
Packit Service c5cf8c
    MPI_Group_free(&g5;;
Packit Service c5cf8c
    MPI_Group_free(&g6;;
Packit Service c5cf8c
    MPI_Group_free(&g7;;
Packit Service c5cf8c
    MPI_Group_free(&g8;;
Packit Service c5cf8c
    MPI_Group_free(&g9;;
Packit Service c5cf8c
    MPI_Group_free(&g10);
Packit Service c5cf8c
    MPI_Comm_free(&dupcomm);
Packit Service c5cf8c
    MPI_Comm_free(&splitcomm);
Packit Service c5cf8c
    MPI_Comm_free(&newcomm);
Packit Service c5cf8c
Packit Service c5cf8c
    free(ranks);
Packit Service c5cf8c
    free(ranks_out);
Packit Service c5cf8c
    MTest_Finalize(errs);
Packit Service c5cf8c
    return MTestReturnValue(errs);
Packit Service c5cf8c
}