Blame test/mpi/coll/icalltoallw.c

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