root/ompi/mca/io/romio321/romio/test/types_with_zeros.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. handle_error
  2. test_indexed_with_zeros
  3. main

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
   2 /*
   3  *  (C) 2014 by Argonne National Laboratory.
   4  *      See COPYRIGHT in top-level directory.
   5  */
   6 
   7 #include <stdio.h>
   8 #include <stdlib.h>
   9 #include <unistd.h>
  10 #include <fcntl.h>
  11 #include <sys/types.h>
  12 #include <sys/uio.h>
  13 
  14 #include <mpi.h>
  15 
  16 #define MAXLEN 9
  17 
  18 static void handle_error(int errcode, const char *str)
  19 {
  20         char msg[MPI_MAX_ERROR_STRING];
  21         int resultlen;
  22         MPI_Error_string(errcode, msg, &resultlen);
  23         fprintf(stderr, "%s: %s\n", str, msg);
  24         MPI_Abort(MPI_COMM_WORLD, 1);
  25 }
  26 
  27 enum {
  28     INDEXED,
  29     HINDEXED,
  30     STRUCT
  31 } testcases;
  32 
  33 static int test_indexed_with_zeros(char *filename, int testcase)
  34 {
  35     int i, rank, np, buflen, num, err, nr_errors=0;
  36     int  nelms[MAXLEN], buf[MAXLEN], indices[MAXLEN], blocklen[MAXLEN];
  37     MPI_File fh;
  38     MPI_Status status;
  39     MPI_Datatype filetype;
  40     MPI_Datatype types[MAXLEN];
  41     MPI_Aint addrs[MAXLEN];
  42 
  43     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  44     MPI_Comm_size(MPI_COMM_WORLD, &np);
  45 
  46     /* set up the number of integers to write in each iteration */
  47     for (i=0; i<MAXLEN; i++) nelms[i] = 0;
  48     if (rank == 0) nelms[4]=nelms[5]=nelms[7]=1;
  49     if (rank == 1) nelms[0]=nelms[1]=nelms[2]=nelms[3]=nelms[6]=nelms[8]=1;
  50 
  51     /* pre-fill the file with integers -999 */
  52     if (rank == 0) {
  53         for (i=0; i<MAXLEN; i++) buf[i] = -999;
  54         err =MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_CREATE|MPI_MODE_WRONLY,
  55                 MPI_INFO_NULL, &fh);
  56         if (err != MPI_SUCCESS) handle_error(err, "MPI_File_open");
  57         err = MPI_File_write(fh, buf, MAXLEN, MPI_INT, &status);
  58         if (err != MPI_SUCCESS) handle_error(err, "MPI_File_write");
  59         err = MPI_File_close(&fh);
  60         if (err != MPI_SUCCESS) handle_error(err, "MPI_File_close");
  61     }
  62     MPI_Barrier(MPI_COMM_WORLD);
  63 
  64     /* define a filetype with spurious leading zeros */
  65     buflen = num = 0;
  66     for (i=0; i<MAXLEN; i++) {
  67         buflen       += nelms[i];
  68         indices[num]  = i;
  69         addrs[num] = i*sizeof(int);
  70         blocklen[num] = nelms[i];
  71         types[num] = MPI_INT;
  72         num++;
  73     }
  74     switch (testcase) {
  75         case INDEXED:
  76             MPI_Type_indexed(num, blocklen, indices, MPI_INT, &filetype);
  77             break;
  78         case HINDEXED:
  79             MPI_Type_hindexed(num, blocklen, addrs, MPI_INT, &filetype);
  80             break;
  81         case STRUCT:
  82             MPI_Type_create_struct(num, blocklen, addrs, types, &filetype);
  83             break;
  84         default:
  85             fprintf(stderr, "unknown testcase!\n");
  86             return(-100);
  87 
  88     }
  89 
  90     MPI_Type_commit(&filetype);
  91 
  92     /* initialize write buffer and write to file*/
  93     for (i=0; i<MAXLEN; i++) buf[i] = 1;
  94     err =MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_WRONLY, MPI_INFO_NULL, &fh);
  95     if (err != MPI_SUCCESS) handle_error(err, "MPI_File_open");
  96     err = MPI_File_set_view(fh, 0, MPI_INT, filetype, "native", MPI_INFO_NULL);
  97     if (err != MPI_SUCCESS) handle_error(err, "MPI_File_set_view");
  98     err = MPI_File_write_all(fh, buf, buflen, MPI_INT, &status);
  99     if (err != MPI_SUCCESS) handle_error(err, "MPI_File_write_all");
 100     MPI_Type_free(&filetype);
 101     err = MPI_File_close(&fh);
 102     if (err != MPI_SUCCESS) handle_error(err, "MPI_File_close");
 103 
 104     /* read back and check */
 105     if (rank == 0) {
 106         err = MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
 107         if (err != MPI_SUCCESS) handle_error(err, "MPI_File_open");
 108         err = MPI_File_read(fh,buf, MAXLEN, MPI_INT, &status);
 109         if (err != MPI_SUCCESS) handle_error(err, "MPI_File_read");
 110         err = MPI_File_close(&fh);
 111         if (err != MPI_SUCCESS) handle_error(err, "MPI_File_close");
 112         for (i=0; i<MAXLEN; i++) {
 113             if (buf[i] < 0) {
 114                 nr_errors++;
 115                 printf("Error: unexpected value for case %d at buf[%d] == %d\n",
 116                         testcase,i,buf[i]);
 117             }
 118         }
 119     }
 120     return nr_errors;
 121 }
 122 
 123 int main(int argc, char **argv)
 124 {
 125 
 126     int nr_errors, rank, np;
 127 
 128     MPI_Init(&argc, &argv);
 129     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 130     MPI_Comm_size(MPI_COMM_WORLD, &np);
 131 
 132     if (np != 2) {
 133         if (rank == 0) fprintf(stderr,"Must run on 2 MPI processes\n");
 134         MPI_Finalize(); return 1;
 135     }
 136     nr_errors = test_indexed_with_zeros(argv[1], INDEXED);
 137     nr_errors += test_indexed_with_zeros(argv[1], HINDEXED);
 138     nr_errors += test_indexed_with_zeros(argv[1], STRUCT);
 139 
 140     if (rank == 0 && nr_errors == 0) printf(" No Errors\n");
 141 
 142     MPI_Finalize();
 143     return 0;
 144 }
 145 

/* [<][>][^][v][top][bottom][index][help] */