Blame src/mpi/romio/test/darray_read.c

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2014 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
#include <stdio.h>
Packit Service c5cf8c
#include <stdlib.h>
Packit Service c5cf8c
#include <mpi.h>
Packit Service c5cf8c
Packit Service c5cf8c
#define NSIDE 5
Packit Service c5cf8c
#define NBLOCK 3
Packit Service c5cf8c
#define NPROC 2
Packit Service c5cf8c
Packit Service c5cf8c
#define CHECK(fn) {int errcode; errcode = (fn); if (errcode != MPI_SUCCESS) handle_error(errcode, #fn);}
Packit Service c5cf8c
Packit Service c5cf8c
static void handle_error(int errcode, const char *str)
Packit Service c5cf8c
{
Packit Service c5cf8c
    char msg[MPI_MAX_ERROR_STRING];
Packit Service c5cf8c
    int resultlen;
Packit Service c5cf8c
    MPI_Error_string(errcode, msg, &resultlen);
Packit Service c5cf8c
    fprintf(stderr, "%s: %s\n", str, msg);
Packit Service c5cf8c
    MPI_Abort(MPI_COMM_WORLD, 1);
Packit Service c5cf8c
}
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
int main(int argc, char *argv[])
Packit Service c5cf8c
{
Packit Service c5cf8c
    int i, j, nerrors = 0, total_errors = 0;
Packit Service c5cf8c
Packit Service c5cf8c
    int rank, size;
Packit Service c5cf8c
    int bpos;
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Datatype darray;
Packit Service c5cf8c
    MPI_Status status;
Packit Service c5cf8c
    MPI_File mpi_fh;
Packit Service c5cf8c
Packit Service c5cf8c
    /* Define array distribution
Packit Service c5cf8c
     * A 2x2 block size works with ROMIO, a 3x3 block size breaks it. */
Packit Service c5cf8c
    int distrib[2] = { MPI_DISTRIBUTE_CYCLIC, MPI_DISTRIBUTE_CYCLIC };
Packit Service c5cf8c
    int bsize[2] = { NBLOCK, NBLOCK };
Packit Service c5cf8c
    int gsize[2] = { NSIDE, NSIDE };
Packit Service c5cf8c
    int psize[2] = { NPROC, NPROC };
Packit Service c5cf8c
Packit Service c5cf8c
    double data[NSIDE * NSIDE];
Packit Service c5cf8c
    double *ldata, *pdata;
Packit Service c5cf8c
Packit Service c5cf8c
    int tsize, nelem;
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_File dfile;
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_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
    /* Set up type */
Packit Service c5cf8c
    CHECK(MPI_Type_create_darray(size, rank, 2, gsize, distrib,
Packit Service c5cf8c
                                 bsize, psize, MPI_ORDER_FORTRAN, MPI_DOUBLE, &darray));
Packit Service c5cf8c
    CHECK(MPI_Type_commit(&darray));
Packit Service c5cf8c
    CHECK(MPI_Type_size(darray, &tsize));
Packit Service c5cf8c
    nelem = tsize / sizeof(double);
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < (NSIDE * NSIDE); i++)
Packit Service c5cf8c
        data[i] = i;
Packit Service c5cf8c
Packit Service c5cf8c
    if (rank == 0) {
Packit Service c5cf8c
        CHECK(MPI_File_open(MPI_COMM_SELF, argv[1],
Packit Service c5cf8c
                            MPI_MODE_CREATE | MPI_MODE_WRONLY, MPI_INFO_NULL, &dfile));
Packit Service c5cf8c
        CHECK(MPI_File_write(dfile, data, NSIDE * NSIDE, MPI_DOUBLE, &status));
Packit Service c5cf8c
        CHECK(MPI_File_close(&dfile));
Packit Service c5cf8c
    }
Packit Service c5cf8c
    MPI_Barrier(MPI_COMM_WORLD);
Packit Service c5cf8c
Packit Service c5cf8c
    /* Allocate buffer */
Packit Service c5cf8c
    ldata = (double *) malloc(tsize);
Packit Service c5cf8c
    pdata = (double *) malloc(tsize);
Packit Service c5cf8c
Packit Service c5cf8c
    /* Use Pack to pull out array */
Packit Service c5cf8c
    bpos = 0;
Packit Service c5cf8c
    CHECK(MPI_Pack(data, 1, darray, pdata, tsize, &bpos, MPI_COMM_WORLD));
Packit Service c5cf8c
Packit Service c5cf8c
    MPI_Barrier(MPI_COMM_WORLD);
Packit Service c5cf8c
Packit Service c5cf8c
    /* Read in array from file.  */
Packit Service c5cf8c
    CHECK(MPI_File_open(MPI_COMM_WORLD, argv[1], MPI_MODE_RDONLY, MPI_INFO_NULL, &mpi_fh));
Packit Service c5cf8c
    CHECK(MPI_File_set_view(mpi_fh, 0, MPI_DOUBLE, darray, "native", MPI_INFO_NULL));
Packit Service c5cf8c
    CHECK(MPI_File_read_all(mpi_fh, ldata, nelem, MPI_DOUBLE, &status));
Packit Service c5cf8c
    CHECK(MPI_File_close(&mpi_fh));
Packit Service c5cf8c
Packit Service c5cf8c
    for (i = 0; i < size; i++) {
Packit Service c5cf8c
#ifdef VERBOSE
Packit Service c5cf8c
        MPI_Barrier(MPI_COMM_WORLD);
Packit Service c5cf8c
        if (rank == i) {
Packit Service c5cf8c
            printf("=== Rank %i === (%i elements) \nPacked: ", rank, nelem);
Packit Service c5cf8c
            for (j = 0; j < nelem; j++) {
Packit Service c5cf8c
                printf("%4.1f ", pdata[j]);
Packit Service c5cf8c
                fflush(stdout);
Packit Service c5cf8c
            }
Packit Service c5cf8c
            printf("\nRead:   ");
Packit Service c5cf8c
            for (j = 0; j < nelem; j++) {
Packit Service c5cf8c
                printf("%4.1f ", ldata[j]);
Packit Service c5cf8c
                fflush(stdout);
Packit Service c5cf8c
            }
Packit Service c5cf8c
            printf("\n\n");
Packit Service c5cf8c
            fflush(stdout);
Packit Service c5cf8c
        }
Packit Service c5cf8c
#endif
Packit Service c5cf8c
        if (rank == i) {
Packit Service c5cf8c
            for (j = 0; j < nelem; j++) {
Packit Service c5cf8c
                if (pdata[j] != ldata[j]) {
Packit Service c5cf8c
                    fprintf(stderr, "rank %d at index %d: packbuf %4.1f filebuf %4.1f\n",
Packit Service c5cf8c
                            rank, j, pdata[j], ldata[j]);
Packit Service c5cf8c
                    nerrors++;
Packit Service c5cf8c
                }
Packit Service c5cf8c
            }
Packit Service c5cf8c
        }
Packit Service c5cf8c
    }
Packit Service c5cf8c
    MPI_Allreduce(&nerrors, &total_errors, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
Packit Service c5cf8c
    if (rank == 0 && total_errors == 0)
Packit Service c5cf8c
        printf(" No Errors\n");
Packit Service c5cf8c
Packit Service c5cf8c
    free(ldata);
Packit Service c5cf8c
    free(pdata);
Packit Service c5cf8c
    MPI_Type_free(&darray);
Packit Service c5cf8c
    MPI_Finalize();
Packit Service c5cf8c
Packit Service c5cf8c
    exit(total_errors);
Packit Service c5cf8c
Packit Service c5cf8c
}