|
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 |
#include "mpitest.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_Request request;
|
|
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 |
char *filename;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
MPI_File dfile;
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
filename = (argc > 1) ? argv[1] : "testfile";
|
|
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 |
/* 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, filename,
|
|
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, filename, 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_iread_all(mpi_fh, ldata, nelem, MPI_DOUBLE, &request));
|
|
Packit Service |
c5cf8c |
CHECK(MPI_Wait(&request, &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 |
|
|
Packit Service |
c5cf8c |
free(ldata);
|
|
Packit Service |
c5cf8c |
free(pdata);
|
|
Packit Service |
c5cf8c |
MPI_Type_free(&darray);
|
|
Packit Service |
c5cf8c |
MTest_Finalize(nerrors);
|
|
Packit Service |
c5cf8c |
|
|
Packit Service |
c5cf8c |
return MTestReturnValue(total_errors);
|
|
Packit Service |
c5cf8c |
}
|