|
Packit |
0848f5 |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
* (C) 2014 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
* See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
*/
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#include <stdio.h>
|
|
Packit |
0848f5 |
#include <stdlib.h>
|
|
Packit |
0848f5 |
#include <unistd.h>
|
|
Packit |
0848f5 |
#include <fcntl.h>
|
|
Packit |
0848f5 |
#include <sys/types.h>
|
|
Packit |
0848f5 |
#include <sys/uio.h>
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#include <mpi.h>
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MAXLEN 9
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
static void handle_error(int errcode, const char *str)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
char msg[MPI_MAX_ERROR_STRING];
|
|
Packit |
0848f5 |
int resultlen;
|
|
Packit |
0848f5 |
MPI_Error_string(errcode, msg, &resultlen);
|
|
Packit |
0848f5 |
fprintf(stderr, "%s: %s\n", str, msg);
|
|
Packit |
0848f5 |
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
enum {
|
|
Packit |
0848f5 |
INDEXED,
|
|
Packit |
0848f5 |
HINDEXED,
|
|
Packit |
0848f5 |
STRUCT
|
|
Packit |
0848f5 |
} testcases;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
static int test_indexed_with_zeros(char *filename, int testcase)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
int i, rank, np, buflen, num, err, nr_errors=0;
|
|
Packit |
0848f5 |
int nelms[MAXLEN], buf[MAXLEN], indices[MAXLEN], blocklen[MAXLEN];
|
|
Packit |
0848f5 |
MPI_File fh;
|
|
Packit |
0848f5 |
MPI_Status status;
|
|
Packit |
0848f5 |
MPI_Datatype filetype;
|
|
Packit |
0848f5 |
MPI_Datatype types[MAXLEN];
|
|
Packit |
0848f5 |
MPI_Aint addrs[MAXLEN];
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Comm_rank(MPI_COMM_WORLD, &rank;;
|
|
Packit |
0848f5 |
MPI_Comm_size(MPI_COMM_WORLD, &np);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* set up the number of integers to write in each iteration */
|
|
Packit |
0848f5 |
for (i=0; i
|
|
Packit |
0848f5 |
if (rank == 0) nelms[4]=nelms[5]=nelms[7]=1;
|
|
Packit |
0848f5 |
if (rank == 1) nelms[0]=nelms[1]=nelms[2]=nelms[3]=nelms[6]=nelms[8]=1;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* pre-fill the file with integers -999 */
|
|
Packit |
0848f5 |
if (rank == 0) {
|
|
Packit |
0848f5 |
for (i=0; i
|
|
Packit |
0848f5 |
err =MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_CREATE|MPI_MODE_WRONLY,
|
|
Packit |
0848f5 |
MPI_INFO_NULL, &fh;;
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_open");
|
|
Packit |
0848f5 |
err = MPI_File_write(fh, buf, MAXLEN, MPI_INT, &status);
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_write");
|
|
Packit |
0848f5 |
err = MPI_File_close(&fh;;
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_close");
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
MPI_Barrier(MPI_COMM_WORLD);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* define a filetype with spurious leading zeros */
|
|
Packit |
0848f5 |
buflen = num = 0;
|
|
Packit |
0848f5 |
for (i=0; i
|
|
Packit |
0848f5 |
buflen += nelms[i];
|
|
Packit |
0848f5 |
indices[num] = i;
|
|
Packit |
0848f5 |
addrs[num] = i*sizeof(int);
|
|
Packit |
0848f5 |
blocklen[num] = nelms[i];
|
|
Packit |
0848f5 |
types[num] = MPI_INT;
|
|
Packit |
0848f5 |
num++;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
switch (testcase) {
|
|
Packit |
0848f5 |
case INDEXED:
|
|
Packit |
0848f5 |
MPI_Type_indexed(num, blocklen, indices, MPI_INT, &filetype);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case HINDEXED:
|
|
Packit |
0848f5 |
MPI_Type_hindexed(num, blocklen, addrs, MPI_INT, &filetype);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
case STRUCT:
|
|
Packit |
0848f5 |
MPI_Type_create_struct(num, blocklen, addrs, types, &filetype);
|
|
Packit |
0848f5 |
break;
|
|
Packit |
0848f5 |
default:
|
|
Packit |
0848f5 |
fprintf(stderr, "unknown testcase!\n");
|
|
Packit |
0848f5 |
return(-100);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Type_commit(&filetype);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* initialize write buffer and write to file*/
|
|
Packit |
0848f5 |
for (i=0; i
|
|
Packit |
0848f5 |
err =MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_WRONLY, MPI_INFO_NULL, &fh;;
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_open");
|
|
Packit |
0848f5 |
err = MPI_File_set_view(fh, 0, MPI_INT, filetype, "native", MPI_INFO_NULL);
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_set_view");
|
|
Packit |
0848f5 |
err = MPI_File_write_all(fh, buf, buflen, MPI_INT, &status);
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_write_all");
|
|
Packit |
0848f5 |
MPI_Type_free(&filetype);
|
|
Packit |
0848f5 |
err = MPI_File_close(&fh;;
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_close");
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* read back and check */
|
|
Packit |
0848f5 |
if (rank == 0) {
|
|
Packit |
0848f5 |
err = MPI_File_open(MPI_COMM_SELF, filename, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh;;
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_open");
|
|
Packit |
0848f5 |
err = MPI_File_read(fh,buf, MAXLEN, MPI_INT, &status);
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_read");
|
|
Packit |
0848f5 |
err = MPI_File_close(&fh;;
|
|
Packit |
0848f5 |
if (err != MPI_SUCCESS) handle_error(err, "MPI_File_close");
|
|
Packit |
0848f5 |
for (i=0; i
|
|
Packit |
0848f5 |
if (buf[i] < 0) {
|
|
Packit |
0848f5 |
nr_errors++;
|
|
Packit |
0848f5 |
printf("Error: unexpected value for case %d at buf[%d] == %d\n",
|
|
Packit |
0848f5 |
testcase,i,buf[i]);
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
return nr_errors;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
int main(int argc, char **argv)
|
|
Packit |
0848f5 |
{
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
int nr_errors, rank, np;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Init(&argc, &argv);
|
|
Packit |
0848f5 |
MPI_Comm_rank(MPI_COMM_WORLD, &rank;;
|
|
Packit |
0848f5 |
MPI_Comm_size(MPI_COMM_WORLD, &np);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (np != 2) {
|
|
Packit |
0848f5 |
if (rank == 0) fprintf(stderr,"Must run on 2 MPI processes\n");
|
|
Packit |
0848f5 |
MPI_Finalize(); return 1;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
nr_errors = test_indexed_with_zeros(argv[1], INDEXED);
|
|
Packit |
0848f5 |
nr_errors += test_indexed_with_zeros(argv[1], HINDEXED);
|
|
Packit |
0848f5 |
nr_errors += test_indexed_with_zeros(argv[1], STRUCT);
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
if (rank == 0 && nr_errors == 0) printf(" No Errors\n");
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
MPI_Finalize();
|
|
Packit |
0848f5 |
return 0;
|
|
Packit |
0848f5 |
}
|
|
Packit |
0848f5 |
|