Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add io test in mpich testsuite.
[simgrid.git] / teshsuite / smpi / mpich3-test / io / i_setviewcur.c
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 #include "mpi.h"
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include "mpitest.h"
10
11 /*
12 static char MTEST_Descrip[] = "Test set_view with DISPLACEMENT_CURRENT";
13 */
14
15 int main(int argc, char *argv[])
16 {
17     int errs = 0, err;
18     int size, rank, *buf;
19     MPI_Offset offset;
20     MPI_File fh;
21     MPI_Comm comm;
22     MPI_Status status;
23     MPI_Request request;
24
25     MTest_Init(&argc, &argv);
26
27     /* This test reads a header then sets the view to every "size" int,
28      * using set view and current displacement.  The file is first written
29      * using a combination of collective and ordered writes */
30
31     comm = MPI_COMM_WORLD;
32     err = MPI_File_open(comm, (char *) "test.ord",
33                         MPI_MODE_WRONLY | MPI_MODE_CREATE, MPI_INFO_NULL, &fh);
34     if (err) {
35         errs++;
36         MTestPrintErrorMsg("Open(1)", err);
37     }
38     MPI_Comm_size(comm, &size);
39     MPI_Comm_rank(comm, &rank);
40     buf = (int *) malloc(size * sizeof(int));
41     buf[0] = size;
42     err = MPI_File_iwrite_all(fh, buf, 1, MPI_INT, &request);
43     if (err) {
44         errs++;
45         MTestPrintErrorMsg("Iwrite_all", err);
46     }
47     err = MPI_Wait(&request, &status);
48     if (err) {
49         errs++;
50         MTestPrintErrorMsg("Wait", err);
51     }
52
53     err = MPI_File_get_position(fh, &offset);
54     if (err) {
55         errs++;
56         MTestPrintErrorMsg("Get_position", err);
57     }
58     err = MPI_File_seek_shared(fh, offset, MPI_SEEK_SET);
59     if (err) {
60         errs++;
61         MTestPrintErrorMsg("Seek_shared", err);
62     }
63     buf[0] = rank;
64     err = MPI_File_write_ordered(fh, buf, 1, MPI_INT, &status);
65     if (err) {
66         errs++;
67         MTestPrintErrorMsg("Write_ordered", err);
68     }
69     err = MPI_File_close(&fh);
70     if (err) {
71         errs++;
72         MTestPrintErrorMsg("Close(1)", err);
73     }
74
75     /* Reopen the file as sequential */
76     err = MPI_File_open(comm, (char *) "test.ord",
77                         MPI_MODE_RDONLY | MPI_MODE_SEQUENTIAL |
78                         MPI_MODE_DELETE_ON_CLOSE, MPI_INFO_NULL, &fh);
79     if (err) {
80         errs++;
81         MTestPrintErrorMsg("Open(Read)", err);
82     }
83
84     if (rank == 0) {
85         err = MPI_File_read_shared(fh, buf, 1, MPI_INT, &status);
86         if (err) {
87             errs++;
88             MTestPrintErrorMsg("Read_all", err);
89         }
90         if (buf[0] != size) {
91             errs++;
92             fprintf(stderr, "Unexpected value for the header = %d, should be %d\n", buf[0], size);
93             fflush(stderr);
94         }
95     }
96     MPI_Barrier(comm);
97     /* All processes must provide the same file view for MODE_SEQUENTIAL */
98     /* See MPI 2.1, 13.3 - DISPLACEMENT_CURRENT is *required* for
99      * MODE_SEQUENTIAL files */
100     err = MPI_File_set_view(fh, MPI_DISPLACEMENT_CURRENT, MPI_INT,
101                             MPI_INT, (char *) "native", MPI_INFO_NULL);
102     if (err) {
103         errs++;
104         MTestPrintErrorMsg("Set_view (DISPLACEMENT_CURRENT)", err);
105     }
106     buf[0] = -1;
107     err = MPI_File_read_ordered(fh, buf, 1, MPI_INT, &status);
108     if (err) {
109         errs++;
110         MTestPrintErrorMsg("Read_all", err);
111     }
112     if (buf[0] != rank) {
113         errs++;
114         fprintf(stderr, "%d: buf[0] = %d\n", rank, buf[0]);
115         fflush(stderr);
116     }
117
118     free(buf);
119     err = MPI_File_close(&fh);
120     if (err) {
121         errs++;
122         MTestPrintErrorMsg("Close(2)", err);
123     }
124
125     MTest_Finalize(errs);
126     MPI_Finalize();
127     return 0;
128 }