1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
4 * (C) 2003 by Argonne National Laboratory.
5 * See COPYRIGHT in top-level directory.
11 #include "mpicolltest.h"
14 static char MTEST_Descrip[] = "Simple intercomm allgatherv test";
17 int main(int argc, char *argv[])
20 int *rbuf = 0, *sbuf = 0;
21 int *recvcounts, *recvdispls;
22 int leftGroup, i, count, rank, rsize;
24 MPI_Datatype datatype;
26 MTest_Init(&argc, &argv);
29 /* Get an intercommunicator */
30 while (MTestGetIntercomm(&comm, &leftGroup, 4)) {
31 if (comm == MPI_COMM_NULL)
33 MPI_Comm_rank(comm, &rank);
34 MPI_Comm_remote_size(comm, &rsize);
36 /* To improve reporting of problems about operations, we
37 * change the error handler to errors return */
38 MPI_Errhandler_set(comm, MPI_ERRORS_RETURN);
40 for (count = 1; count < 65000; count = 2 * count) {
41 /* The left group will send rank to the right group;
42 * The right group will send -rank to the left group */
43 rbuf = (int *) malloc(count * rsize * sizeof(int));
44 sbuf = (int *) malloc(count * sizeof(int));
45 recvcounts = (int *) malloc(rsize * sizeof(int));
46 recvdispls = (int *) malloc(rsize * sizeof(int));
47 for (i = 0; i < count * rsize; i++)
49 for (i = 0; i < rsize; i++) {
50 recvcounts[i] = count;
51 recvdispls[i] = i * count;
54 for (i = 0; i < count; i++)
55 sbuf[i] = i + rank * count;
58 for (i = 0; i < count; i++)
59 sbuf[i] = -(i + rank * count);
61 err = MTest_Allgatherv(sbuf, count, datatype,
62 rbuf, recvcounts, recvdispls, datatype, comm);
68 for (i = 0; i < count * rsize; i++) {
75 for (i = 0; i < count * rsize; i++) {
82 /* Use Allgather in a unidirectional way */
83 for (i = 0; i < count * rsize; i++)
86 err = MTest_Allgatherv(sbuf, 0, datatype,
87 rbuf, recvcounts, recvdispls, datatype, comm);
92 for (i = 0; i < count * rsize; i++) {
99 for (i = 0; i < rsize; i++) {
103 err = MTest_Allgatherv(sbuf, count, datatype,
104 rbuf, recvcounts, recvdispls, datatype, comm);
107 MTestPrintError(err);
109 for (i = 0; i < count * rsize; i++) {
120 MTestFreeComm(&comm);
123 MTest_Finalize(errs);