Blame test/mpi/coll/scatter3.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
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
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
Packit Service c5cf8c
/* This example sends contiguous data and receives a vector on some nodes
Packit Service c5cf8c
   and contiguous data on others.  There is some evidence that some
Packit Service c5cf8c
   MPI implementations do not check recvcount on the root process; this
Packit Service c5cf8c
   test checks for that case
Packit Service c5cf8c
*/
Packit Service c5cf8c
Packit Service c5cf8c
int main(int argc, char **argv)
Packit Service c5cf8c
{
Packit Service c5cf8c
    MPI_Datatype vec;
Packit Service c5cf8c
    double *vecin, *vecout, ivalue;
Packit Service c5cf8c
    int root, i, n, stride, errs = 0;
Packit Service c5cf8c
    int rank, size;
Packit Service c5cf8c
    MPI_Aint vextent;
Packit Service c5cf8c
Packit Service c5cf8c
    MTest_Init(&argc, &argv);
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Comm_size(MPI_COMM_WORLD, &size);
Packit Service c5cf8c
    MPI_Comm_rank(MPI_COMM_WORLD, &rank;;
Packit Service c5cf8c
Packit Service c5cf8c
    n = 12;
Packit Service c5cf8c
    stride = 10;
Packit Service c5cf8c
    /* Note that vecout really needs to be only (n-1)*stride+1 doubles, but
Packit Service c5cf8c
     * this is easier and allows a little extra room if there is a bug */
Packit Service c5cf8c
    vecout = (double *) malloc(n * stride * sizeof(double));
Packit Service c5cf8c
    vecin = (double *) malloc(n * size * sizeof(double));
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Type_vector(n, 1, stride, MPI_DOUBLE, &vec;;
Packit Service c5cf8c
    MPI_Type_commit(&vec;;
Packit Service c5cf8c
    MPI_Type_extent(vec, &vextent);
Packit Service c5cf8c
    if (vextent != ((n - 1) * (MPI_Aint) stride + 1) * sizeof(double)) {
Packit Service c5cf8c
        errs++;
Packit Service c5cf8c
        printf("Vector extent is %ld, should be %ld\n",
Packit Service c5cf8c
               (long) vextent, (long) (((n - 1) * stride + 1) * sizeof(double)));
Packit Service c5cf8c
    }
Packit Service c5cf8c
    /* Note that the exted of type vector is from the first to the
Packit Service c5cf8c
     * last element, not n*stride.
Packit Service c5cf8c
     * E.g., with n=1, the extent is a single double */
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < n * size; i++)
Packit Service c5cf8c
        vecin[i] = (double) i;
Packit Service c5cf8c
    for (root = 0; root < size; root++) {
Packit Service c5cf8c
        for (i = 0; i < n * stride; i++)
Packit Service c5cf8c
            vecout[i] = -1.0;
Packit Service c5cf8c
        if (rank == root) {
Packit Service c5cf8c
            /* Receive into a vector */
Packit Service c5cf8c
            MPI_Scatter(vecin, n, MPI_DOUBLE, vecout, 1, vec, root, MPI_COMM_WORLD);
Packit Service c5cf8c
            for (i = 0; i < n; i++) {
Packit Service c5cf8c
                ivalue = n * root + i;
Packit Service c5cf8c
                if (vecout[i * stride] != ivalue) {
Packit Service c5cf8c
                    errs++;
Packit Service c5cf8c
                    printf("[%d] Expected %f but found %f for vecout[%d] on root\n",
Packit Service c5cf8c
                           rank, ivalue, vecout[i * stride], i * stride);
Packit Service c5cf8c
                }
Packit Service c5cf8c
            }
Packit Service c5cf8c
        } else {
Packit Service c5cf8c
            /* Receive into contiguous data */
Packit Service c5cf8c
            MPI_Scatter(NULL, -1, MPI_DATATYPE_NULL, vecout, n, MPI_DOUBLE, root, MPI_COMM_WORLD);
Packit Service c5cf8c
            for (i = 0; i < n; i++) {
Packit Service c5cf8c
                ivalue = rank * n + i;
Packit Service c5cf8c
                if (vecout[i] != ivalue) {
Packit Service c5cf8c
                    printf("[%d] Expected %f but found %f for vecout[%d]\n",
Packit Service c5cf8c
                           rank, ivalue, vecout[i], i);
Packit Service c5cf8c
                    errs++;
Packit Service c5cf8c
                }
Packit Service c5cf8c
            }
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
Packit Service c5cf8c
    free(vecin);
Packit Service c5cf8c
    free(vecout);
Packit Service c5cf8c
    MPI_Type_free(&vec;;
Packit Service c5cf8c
    MTest_Finalize(errs);
Packit Service c5cf8c
    return MTestReturnValue(errs);
Packit Service c5cf8c
}