Blame test/mpi/coll/icalltoallw.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 "mpitest.h"
Packit Service c5cf8c
#include <stdlib.h>
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
#include "mpicolltest.h"
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
  This program tests MPI_Alltoallw by having processor i send different
Packit Service c5cf8c
  amounts of data to each processor.  This is just the MPI_Alltoallv test,
Packit Service c5cf8c
  but with displacements in bytes rather than units of the datatype.
Packit Service c5cf8c
Packit Service c5cf8c
  Because there are separate send and receive types to alltoallw,
Packit Service c5cf8c
  there need to be tests to rearrange data on the fly.  Not done yet.
Packit Service c5cf8c
Packit Service c5cf8c
  The first test sends i items to processor i from all processors.
Packit Service c5cf8c
Packit Service c5cf8c
  Currently, the test uses only MPI_INT; this is adequate for testing systems
Packit Service c5cf8c
  that use point-to-point operations
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
int main(int argc, char **argv)
Packit Service c5cf8c
{
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm comm;
Packit Service c5cf8c
    int *sbuf, *rbuf;
Packit Service c5cf8c
    int rank, size, lsize, asize;
Packit Service c5cf8c
    int *sendcounts, *recvcounts, *rdispls, *sdispls;
Packit Service c5cf8c
    int i, j, *p, errs;
Packit Service c5cf8c
    MPI_Datatype *sendtypes, *recvtypes;
Packit Service c5cf8c
    int leftGroup;
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Init(&argc, &argv);
Packit Service c5cf8c
    errs = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    while (MTestGetIntercomm(&comm, &leftGroup, 4)) {
Packit Service c5cf8c
        if (comm == MPI_COMM_NULL)
Packit Service c5cf8c
            continue;
Packit Service c5cf8c
Packit Service c5cf8c
        /* Create the buffer */
Packit Service c5cf8c
        MPI_Comm_size(comm, &lsize);
Packit Service c5cf8c
        MPI_Comm_remote_size(comm, &size);
Packit Service c5cf8c
        asize = (lsize > size) ? lsize : size;
Packit Service c5cf8c
        MPI_Comm_rank(comm, &rank;;
Packit Service c5cf8c
        sbuf = (int *) malloc(size * size * sizeof(int));
Packit Service c5cf8c
        rbuf = (int *) malloc(asize * asize * sizeof(int));
Packit Service c5cf8c
        if (!sbuf || !rbuf) {
Packit Service c5cf8c
            fprintf(stderr, "Could not allocated buffers!\n");
Packit Service c5cf8c
            MPI_Abort(comm, 1);
Packit Service c5cf8c
        }
Packit Service c5cf8c
Packit Service c5cf8c
        /* Load up the buffers */
Packit Service c5cf8c
        for (i = 0; i < size * size; i++) {
Packit Service c5cf8c
            sbuf[i] = i + 100 * rank;
Packit Service c5cf8c
            rbuf[i] = -i;
Packit Service c5cf8c
        }
Packit Service c5cf8c
Packit Service c5cf8c
        /* Create and load the arguments to alltoallv */
Packit Service c5cf8c
        sendcounts = (int *) malloc(size * sizeof(int));
Packit Service c5cf8c
        recvcounts = (int *) malloc(size * sizeof(int));
Packit Service c5cf8c
        rdispls = (int *) malloc(size * sizeof(int));
Packit Service c5cf8c
        sdispls = (int *) malloc(size * sizeof(int));
Packit Service c5cf8c
        sendtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
Packit Service c5cf8c
        recvtypes = (MPI_Datatype *) malloc(size * sizeof(MPI_Datatype));
Packit Service c5cf8c
        if (!sendcounts || !recvcounts || !rdispls || !sdispls || !sendtypes || !recvtypes) {
Packit Service c5cf8c
            fprintf(stderr, "Could not allocate arg items!\n");
Packit Service c5cf8c
            MPI_Abort(comm, 1);
Packit Service c5cf8c
        }
Packit Service c5cf8c
        /* Note that process 0 sends no data (sendcounts[0] = 0) */
Packit Service c5cf8c
        for (i = 0; i < size; i++) {
Packit Service c5cf8c
            sendcounts[i] = i;
Packit Service c5cf8c
            sdispls[i] = (((i + 1) * (i)) / 2) * sizeof(int);
Packit Service c5cf8c
            sendtypes[i] = MPI_INT;
Packit Service c5cf8c
            recvcounts[i] = rank;
Packit Service c5cf8c
            rdispls[i] = i * rank * sizeof(int);
Packit Service c5cf8c
            recvtypes[i] = MPI_INT;
Packit Service c5cf8c
        }
Packit Service c5cf8c
        MTest_Alltoallw(sbuf, sendcounts, sdispls, sendtypes,
Packit Service c5cf8c
                        rbuf, recvcounts, rdispls, recvtypes, comm);
Packit Service c5cf8c
Packit Service c5cf8c
        /* Check rbuf */
Packit Service c5cf8c
        for (i = 0; i < size; i++) {
Packit Service c5cf8c
            p = rbuf + rdispls[i] / sizeof(int);
Packit Service c5cf8c
            for (j = 0; j < rank; j++) {
Packit Service c5cf8c
                if (p[j] != i * 100 + (rank * (rank + 1)) / 2 + j) {
Packit Service c5cf8c
                    fprintf(stderr, "[%d] got %d expected %d for %dth\n",
Packit Service c5cf8c
                            rank, p[j], (i * (i + 1)) / 2 + j, j);
Packit Service c5cf8c
                    errs++;
Packit Service c5cf8c
                }
Packit Service c5cf8c
            }
Packit Service c5cf8c
        }
Packit Service c5cf8c
Packit Service c5cf8c
        free(sendtypes);
Packit Service c5cf8c
        free(recvtypes);
Packit Service c5cf8c
        free(sdispls);
Packit Service c5cf8c
        free(rdispls);
Packit Service c5cf8c
        free(recvcounts);
Packit Service c5cf8c
        free(sendcounts);
Packit Service c5cf8c
        free(rbuf);
Packit Service c5cf8c
        free(sbuf);
Packit Service c5cf8c
        MTestFreeComm(&comm);
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Finalize(errs);
Packit Service c5cf8c
    return MTestReturnValue(errs);
Packit Service c5cf8c
}