This source file includes following definitions.
- handle_error
- test_indexed_with_zeros
- main
1
2
3
4
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
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
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
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
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
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