Blame test/mpi/coll/allred5.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2003 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 <stdio.h>
Packit Service c5cf8c
#include <stdlib.h>
Packit Service c5cf8c
#include "mpitest.h"
Packit Service c5cf8c
#include <assert.h>
Packit Service c5cf8c
Packit Service c5cf8c
/*
Packit Service c5cf8c
static char MTEST_Descrip[] = "Test MPI_Allreduce with count greater than the number of processes";
Packit Service c5cf8c
*/
Packit Service c5cf8c
Packit Service c5cf8c
/* We make the error count global so that we can easily control the output
Packit Service c5cf8c
   of error information (in particular, limiting it after the first 10
Packit Service c5cf8c
   errors */
Packit Service c5cf8c
int errs = 0;
Packit Service c5cf8c
Packit Service c5cf8c
int main(int argc, char *argv[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    MPI_Comm comm;
Packit Service c5cf8c
    MPI_Datatype dtype;
Packit Service c5cf8c
    int count, *bufin, *bufout, size, i, minsize = 1;
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Init(&argc, &argv);
Packit Service c5cf8c
Packit Service c5cf8c
    while (MTestGetIntracommGeneral(&comm, minsize, 1)) {
Packit Service c5cf8c
        if (comm == MPI_COMM_NULL) {
Packit Service c5cf8c
            continue;
Packit Service c5cf8c
        }
Packit Service c5cf8c
        MPI_Comm_size(comm, &size);
Packit Service c5cf8c
        count = size * 2;
Packit Service c5cf8c
        bufin = (int *) malloc(count * sizeof(int));
Packit Service c5cf8c
        bufout = (int *) malloc(count * sizeof(int));
Packit Service c5cf8c
        if (!bufin || !bufout) {
Packit Service c5cf8c
            fprintf(stderr, "Unable to allocated space for buffers (%d)\n", count);
Packit Service c5cf8c
            MPI_Abort(MPI_COMM_WORLD, 1);
Packit Service c5cf8c
        }
Packit Service c5cf8c
        for (i = 0; i < count; i++) {
Packit Service c5cf8c
            bufin[i] = i;
Packit Service c5cf8c
            bufout[i] = -1;
Packit Service c5cf8c
        }
Packit Service c5cf8c
Packit Service c5cf8c
        dtype = MPI_INT;
Packit Service c5cf8c
        MPI_Allreduce(bufin, bufout, count, dtype, MPI_SUM, comm);
Packit Service c5cf8c
        /* Check output */
Packit Service c5cf8c
        for (i = 0; i < count; i++) {
Packit Service c5cf8c
            if (bufout[i] != i * size) {
Packit Service c5cf8c
                fprintf(stderr, "Expected bufout[%d] = %d but found %d\n", i, i * size, bufout[i]);
Packit Service c5cf8c
                errs++;
Packit Service c5cf8c
            }
Packit Service c5cf8c
        }
Packit Service c5cf8c
        free(bufin);
Packit Service c5cf8c
        free(bufout);
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
}