Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
607ce16303223b3e0fb27fa2d939c0a01477a461
[simgrid.git] / src / smpi / bindings / smpi_pmpi_file.cpp
1 /* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved.          */\r
2 \r
3 /* This program is free software; you can redistribute it and/or modify it\r
4  * under the terms of the license (GNU LGPL) which comes with this package. */\r
5 \r
6 #include "private.hpp"\r
7 #include "smpi_file.hpp"\r
8 #include "smpi_datatype.hpp"\r
9 \r
10 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);\r
11 \r
12 int PMPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh){\r
13   if (comm == MPI_COMM_NULL) {\r
14     return MPI_ERR_COMM;\r
15   } else if (filename == nullptr) {\r
16     return MPI_ERR_FILE;\r
17   } else if (amode < 0) {\r
18     return MPI_ERR_AMODE;\r
19   } else {\r
20     smpi_bench_end();\r
21     *fh =  new simgrid::smpi::File(comm, filename, amode, info);\r
22     smpi_bench_begin();\r
23     if (((*fh)->size() == 0 && (not amode & MPI_MODE_CREATE)) ||\r
24        ((*fh)->size() != 0 && (amode & MPI_MODE_EXCL))){\r
25       delete fh;\r
26       return MPI_ERR_AMODE;\r
27     }\r
28     if(amode & MPI_MODE_APPEND)\r
29       (*fh)->seek(0,MPI_SEEK_END);\r
30     return MPI_SUCCESS;\r
31   }\r
32 }\r
33 \r
34 int PMPI_File_close(MPI_File *fh){\r
35   if (fh==nullptr){\r
36     return MPI_ERR_ARG;\r
37   } else {\r
38     smpi_bench_end();\r
39     int ret = simgrid::smpi::File::close(fh);\r
40     *fh = MPI_FILE_NULL;\r
41     smpi_bench_begin();\r
42     return ret;\r
43   }\r
44 }\r
45 #define CHECK_FILE(fh) if(fh==MPI_FILE_NULL) return MPI_ERR_FILE\r
46 #define CHECK_BUFFER(buf, count)  else if (buf==nullptr && count > 0) return MPI_ERR_BUFFER\r
47 #define CHECK_COUNT(count)  else if ( count < 0) return MPI_ERR_COUNT\r
48 #define CHECK_OFFSET(offset)  else if ( offset < 0) return MPI_ERR_DISP\r
49 #define PASS_ZEROCOUNT(count)  else if ( count == 0) return MPI_SUCCESS\r
50 #define CHECK_DATATYPE(datatype, count) else if ( datatype == MPI_DATATYPE_NULL && count > 0) return MPI_ERR_TYPE\r
51 #define CHECK_STATUS(status) else if (status == nullptr) return MPI_ERR_ARG\r
52 #define CHECK_FLAGS(fh) else if (fh->flags() & MPI_MODE_SEQUENTIAL) return MPI_ERR_AMODE\r
53 \r
54 int PMPI_File_seek(MPI_File fh, MPI_Offset offset, int whence){\r
55   CHECK_FILE(fh);
56   else {\r
57     smpi_bench_end();\r
58     int ret = fh->seek(offset,whence);\r
59     smpi_bench_begin();\r
60     return ret;\r
61   }\r
62 }\r
63 \r
64 int PMPI_File_read(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
65   CHECK_FILE(fh);
66   CHECK_BUFFER(buf, count);\r
67   CHECK_COUNT(count);\r
68   PASS_ZEROCOUNT(count);\r
69   CHECK_DATATYPE(datatype, count);\r
70   CHECK_STATUS(status);\r
71   CHECK_FLAGS(fh);\r
72   else {\r
73     smpi_bench_end();\r
74     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
75     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));\r
76     int ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);\r
77     TRACE_smpi_comm_out(rank_traced);\r
78     smpi_bench_begin();\r
79     return ret;\r
80   }\r
81 }\r
82 \r
83 int PMPI_File_write(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
84   CHECK_FILE(fh);
85   CHECK_BUFFER(buf, count);\r
86   CHECK_COUNT(count);\r
87   PASS_ZEROCOUNT(count);\r
88   CHECK_DATATYPE(datatype, count);\r
89   CHECK_STATUS(status);\r
90   CHECK_FLAGS(fh);\r
91   else {\r
92     smpi_bench_end();\r
93     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
94     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));\r
95     int ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);\r
96     TRACE_smpi_comm_out(rank_traced);\r
97     smpi_bench_begin();\r
98     return ret;\r
99   }\r
100 }\r
101 \r
102 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
103   CHECK_FILE(fh);
104   CHECK_BUFFER(buf, count);\r
105   CHECK_COUNT(count);\r
106   CHECK_DATATYPE(datatype, count);\r
107   CHECK_STATUS(status);\r
108   CHECK_FLAGS(fh);\r
109   else {\r
110     smpi_bench_end();\r
111     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
112     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", static_cast<double>(count*datatype->size())));\r
113     int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);\r
114     TRACE_smpi_comm_out(rank_traced);\r
115     smpi_bench_begin();\r
116     return ret;\r
117   }\r
118 }\r
119 \r
120 int PMPI_File_write_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
121   CHECK_FILE(fh);
122   CHECK_BUFFER(buf, count);\r
123   CHECK_COUNT(count);\r
124   CHECK_DATATYPE(datatype, count);\r
125   CHECK_STATUS(status);\r
126   CHECK_FLAGS(fh);\r
127   else {\r
128     smpi_bench_end();\r
129     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
130     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", static_cast<double>(count*datatype->size())));\r
131     int ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);\r
132     TRACE_smpi_comm_out(rank_traced);\r
133     smpi_bench_begin();\r
134     return ret;\r
135   }\r
136 }\r
137 \r
138 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
139   CHECK_FILE(fh);
140   CHECK_BUFFER(buf, count);\r
141   CHECK_OFFSET(offset);\r
142   CHECK_COUNT(count);\r
143   PASS_ZEROCOUNT(count);\r
144   CHECK_DATATYPE(datatype, count);\r
145   CHECK_STATUS(status);\r
146   CHECK_FLAGS(fh);\r
147   else {\r
148     smpi_bench_end();\r
149     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
150     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));\r
151     int ret = fh->seek(offset,SEEK_SET);\r
152     if(ret!=MPI_SUCCESS)\r
153       return ret;\r
154     ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);\r
155     TRACE_smpi_comm_out(rank_traced);\r
156     smpi_bench_begin();\r
157     return ret;\r
158   }\r
159 }\r
160 \r
161 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
162   CHECK_FILE(fh);
163   CHECK_BUFFER(buf, count);\r
164   CHECK_OFFSET(offset);\r
165   CHECK_COUNT(count);\r
166   CHECK_DATATYPE(datatype, count);\r
167   CHECK_STATUS(status);\r
168   CHECK_FLAGS(fh);\r
169   else {\r
170     smpi_bench_end();\r
171     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
172     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_at_all", static_cast<double>(count*datatype->size())));\r
173     int ret = fh->seek(offset,SEEK_SET);\r
174     if(ret!=MPI_SUCCESS)\r
175       return ret;\r
176     ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);\r
177     TRACE_smpi_comm_out(rank_traced);\r
178     smpi_bench_begin();\r
179     return ret;\r
180   }\r
181 }\r
182 \r
183 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
184   CHECK_FILE(fh);
185   CHECK_BUFFER(buf, count);\r
186   CHECK_OFFSET(offset);\r
187   CHECK_COUNT(count);\r
188   PASS_ZEROCOUNT(count);\r
189   CHECK_DATATYPE(datatype, count);\r
190   CHECK_STATUS(status);\r
191   CHECK_FLAGS(fh);\r
192   else {\r
193     smpi_bench_end();\r
194     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
195     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));\r
196     int ret = fh->seek(offset,SEEK_SET);\r
197     if(ret!=MPI_SUCCESS)\r
198       return ret;\r
199     ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);\r
200     TRACE_smpi_comm_out(rank_traced);\r
201     smpi_bench_begin();\r
202     return ret;\r
203   }\r
204 }\r
205 \r
206 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
207   CHECK_FILE(fh);
208   CHECK_BUFFER(buf, count);\r
209   CHECK_OFFSET(offset);\r
210   CHECK_COUNT(count);\r
211   CHECK_DATATYPE(datatype, count);\r
212   CHECK_STATUS(status);\r
213   CHECK_FLAGS(fh);\r
214   else {\r
215     smpi_bench_end();\r
216     int rank_traced = simgrid::s4u::this_actor::get_pid();\r
217     TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_at_all", static_cast<double>(count*datatype->size())));\r
218     int ret = fh->seek(offset,SEEK_SET);\r
219     if(ret!=MPI_SUCCESS)\r
220       return ret;\r
221     ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);\r
222     TRACE_smpi_comm_out(rank_traced);\r
223     smpi_bench_begin();\r
224     return ret;\r
225   }\r
226 }\r
227 \r
228 int PMPI_File_delete(char *filename, MPI_Info info){\r
229   if (filename == nullptr) {\r
230     return MPI_ERR_FILE;\r
231   } else {\r
232     smpi_bench_end();\r
233     int ret = simgrid::smpi::File::del(filename, info);\r
234     smpi_bench_begin();\r
235     return ret;\r
236   }\r
237 }\r
238 \r