|
Packit |
0848f5 |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
*
|
|
Packit |
0848f5 |
* (C) 2001 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
* See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
*/
|
|
Packit |
0848f5 |
#include "mpi.h"
|
|
Packit |
0848f5 |
#include <stdio.h>
|
|
Packit |
0848f5 |
#include <stdlib.h>
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
int main(int argc, char *argv[])
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
MPI_Group g1, g2, g4, g5, g45, selfgroup, g6;
|
|
Packit |
0848f5 |
int ranks[16], size, rank, myrank, range[1][3];
|
|
Packit |
0848f5 |
int errs = 0;
|
|
Packit |
0848f5 |
int i, rin[16], rout[16], result;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Init(0, 0);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Comm_group(MPI_COMM_WORLD, &g1;;
|
|
Packit |
0848f5 |
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
|
Packit |
0848f5 |
MPI_Comm_size(MPI_COMM_WORLD, &size);
|
|
Packit |
0848f5 |
if (size < 8) {
|
|
Packit |
0848f5 |
fprintf(stderr, "Test requires 8 processes (16 prefered) only %d provided\n", size);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* 16 members, this process is rank 0, return in group 1 */
|
|
Packit |
0848f5 |
ranks[0] = myrank;
|
|
Packit |
0848f5 |
ranks[1] = 2;
|
|
Packit |
0848f5 |
ranks[2] = 7;
|
|
Packit |
0848f5 |
if (myrank == 2)
|
|
Packit |
0848f5 |
ranks[1] = 3;
|
|
Packit |
0848f5 |
if (myrank == 7)
|
|
Packit |
0848f5 |
ranks[2] = 6;
|
|
Packit |
0848f5 |
MPI_Group_incl(g1, 3, ranks, &g2;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Check the resulting group */
|
|
Packit |
0848f5 |
MPI_Group_size(g2, &size);
|
|
Packit |
0848f5 |
MPI_Group_rank(g2, &rank;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (size != 3) {
|
|
Packit |
0848f5 |
fprintf(stderr, "Size should be %d, is %d\n", 3, size);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
if (rank != 0) {
|
|
Packit |
0848f5 |
fprintf(stderr, "Rank should be %d, is %d\n", 0, rank);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
rin[0] = 0;
|
|
Packit |
0848f5 |
rin[1] = 1;
|
|
Packit |
0848f5 |
rin[2] = 2;
|
|
Packit |
0848f5 |
MPI_Group_translate_ranks(g2, 3, rin, g1, rout);
|
|
Packit |
0848f5 |
for (i = 0; i < 3; i++) {
|
|
Packit |
0848f5 |
if (rout[i] != ranks[i]) {
|
|
Packit |
0848f5 |
fprintf(stderr, "translated rank[%d] %d should be %d\n", i, rout[i], ranks[i]);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Translate the process of the self group against another group */
|
|
Packit |
0848f5 |
MPI_Comm_group(MPI_COMM_SELF, &selfgroup);
|
|
Packit |
0848f5 |
rin[0] = 0;
|
|
Packit |
0848f5 |
MPI_Group_translate_ranks(selfgroup, 1, rin, g1, rout);
|
|
Packit |
0848f5 |
if (rout[0] != myrank) {
|
|
Packit |
0848f5 |
fprintf(stderr, "translated of self is %d should be %d\n", rout[0], myrank);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
for (i = 0; i < size; i++)
|
|
Packit |
0848f5 |
rin[i] = i;
|
|
Packit |
0848f5 |
MPI_Group_translate_ranks(g1, size, rin, selfgroup, rout);
|
|
Packit |
0848f5 |
for (i = 0; i < size; i++) {
|
|
Packit |
0848f5 |
if (i == myrank && rout[i] != 0) {
|
|
Packit |
0848f5 |
fprintf(stderr, "translated world to self of %d is %d\n", i, rout[i]);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else if (i != myrank && rout[i] != MPI_UNDEFINED) {
|
|
Packit |
0848f5 |
fprintf(stderr, "translated world to self of %d should be undefined, is %d\n",
|
|
Packit |
0848f5 |
i, rout[i]);
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Group_free(&selfgroup);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Exclude everyone in our group */
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int ii, *lranks, g1size;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Group_size(g1, &g1size);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
lranks = (int *) malloc(g1size * sizeof(int));
|
|
Packit |
0848f5 |
for (ii = 0; ii < g1size; ii++)
|
|
Packit |
0848f5 |
lranks[ii] = ii;
|
|
Packit |
0848f5 |
MPI_Group_excl(g1, g1size, lranks, &g6;;
|
|
Packit |
0848f5 |
if (g6 != MPI_GROUP_EMPTY) {
|
|
Packit |
0848f5 |
fprintf(stderr, "Group formed by excluding all ranks not empty\n");
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
MPI_Group_free(&g6;;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
free(lranks);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Add tests for additional group operations */
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
* g2 = incl 1,3,7
|
|
Packit |
0848f5 |
* g3 = excl 1,3,7
|
|
Packit |
0848f5 |
* intersect (w, g2) => g2
|
|
Packit |
0848f5 |
* intersect (w, g3) => g3
|
|
Packit |
0848f5 |
* intersect (g2, g3) => empty
|
|
Packit |
0848f5 |
*
|
|
Packit |
0848f5 |
* g4 = rincl 1:n-1:2
|
|
Packit |
0848f5 |
* g5 = rexcl 1:n-1:2
|
|
Packit |
0848f5 |
* union(g4, g5) => world
|
|
Packit |
0848f5 |
* g6 = rincl n-1:1:-1
|
|
Packit |
0848f5 |
* g7 = rexcl n-1:1:-1
|
|
Packit |
0848f5 |
* union(g6, g7) => concat of entries, similar to world
|
|
Packit |
0848f5 |
* diff(w, g2) => g3
|
|
Packit |
0848f5 |
*/
|
|
Packit |
0848f5 |
MPI_Group_free(&g2;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
range[0][0] = 1;
|
|
Packit |
0848f5 |
range[0][1] = size - 1;
|
|
Packit |
0848f5 |
range[0][2] = 2;
|
|
Packit |
0848f5 |
MPI_Group_range_excl(g1, 1, range, &g5;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
range[0][0] = 1;
|
|
Packit |
0848f5 |
range[0][1] = size - 1;
|
|
Packit |
0848f5 |
range[0][2] = 2;
|
|
Packit |
0848f5 |
MPI_Group_range_incl(g1, 1, range, &g4;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Group_union(g4, g5, &g45);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Group_compare(MPI_GROUP_EMPTY, g4, &result);
|
|
Packit |
0848f5 |
if (result != MPI_UNEQUAL) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
fprintf(stderr, "Comparison with empty group gave %d, not 3\n", result);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Group_free(&g4;;
|
|
Packit |
0848f5 |
MPI_Group_free(&g5;;
|
|
Packit |
0848f5 |
MPI_Group_free(&g45);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Now, duplicate the test, but using negative strides */
|
|
Packit |
0848f5 |
range[0][0] = size - 1;
|
|
Packit |
0848f5 |
range[0][1] = 1;
|
|
Packit |
0848f5 |
range[0][2] = -2;
|
|
Packit |
0848f5 |
MPI_Group_range_excl(g1, 1, range, &g5;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
range[0][0] = size - 1;
|
|
Packit |
0848f5 |
range[0][1] = 1;
|
|
Packit |
0848f5 |
range[0][2] = -2;
|
|
Packit |
0848f5 |
MPI_Group_range_incl(g1, 1, range, &g4;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Group_union(g4, g5, &g45);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Group_compare(MPI_GROUP_EMPTY, g4, &result);
|
|
Packit |
0848f5 |
if (result != MPI_UNEQUAL) {
|
|
Packit |
0848f5 |
errs++;
|
|
Packit |
0848f5 |
fprintf(stderr,
|
|
Packit |
0848f5 |
"Comparison with empty group (formed with negative strides) gave %d, not 3\n",
|
|
Packit |
0848f5 |
result);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Group_free(&g4;;
|
|
Packit |
0848f5 |
MPI_Group_free(&g5;;
|
|
Packit |
0848f5 |
MPI_Group_free(&g45);
|
|
Packit |
0848f5 |
MPI_Group_free(&g1;;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (myrank == 0) {
|
|
Packit |
0848f5 |
if (errs == 0) {
|
|
Packit |
0848f5 |
printf(" No Errors\n");
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
else {
|
|
Packit |
0848f5 |
printf("Found %d errors\n", errs);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Finalize();
|
|
Packit |
0848f5 |
return 0;
|
|
Packit |
0848f5 |
}
|