/* * example for MPI-2 I/O : * 2d-array in file is distributed in column blocks * * assumes: test data in IN2, as created with create_files */ #include <stdio.h> #include <stdlib.h> #include <mpi.h> #include "DistMatrix.h" #define FILE "IN2" #define SIZE 100 void check(DistMatrix a) { int myId; int value; int i,j; MPI_Comm_rank(MPI_COMM_WORLD, &myId); for (i=0; i<a.ly; i++) { for (j=0; j<a.lx; j++) { value = 1000*i + (j + a.dx); if (INDEX(a,i,j) != value) { printf("Task %d: error in data: a(%d,%d) = %d, should be %d\n", myId, i, j, INDEX(a,i,j), value); return; } } } printf("Task %d: check ok\n", myId); return; } void create_array1d_type(DistMatrix a, MPI_Datatype *array1d_type) { /* creates type for file view */ int size, length, offset; size = a.nx; length = a.lx; offset = a.dx; MPI_Type_create_subarray(1, &size, &length, &offset, MPI_ORDER_C, MPI_INT, array1d_type); MPI_Type_commit(array1d_type); } void main(int argc, char *argv[]) { MPI_File fh; MPI_Datatype fileType; MPI_Status status; DistMatrix a; MPI_Init(&argc, &argv); newDistMatrix(&a, SIZE, SIZE); create_array1d_type(a, &fileType); MPI_File_open(MPI_COMM_WORLD, FILE, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh); MPI_File_set_view(fh, 0, MPI_INT, fileType, "native", MPI_INFO_NULL); MPI_File_read_all(fh, a.data, a.lx*a.ly, MPI_INT, &status); check(a); MPI_File_close(&fh); MPI_Finalize(); }