Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
dc03edffbaa1511fad856086638ee0f5b1545935
[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 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);\r
8 \r
9 #include "smpi_file.hpp"\r
10 #include "smpi_datatype.hpp"\r
11 \r
12 \r
13 int PMPI_File_open(MPI_Comm comm, char *filename, int amode, MPI_Info info, MPI_File *fh){\r
14   if (comm == MPI_COMM_NULL)\r
15     return MPI_ERR_COMM;\r
16   if (filename == nullptr)\r
17     return MPI_ERR_FILE;\r
18   if (amode < 0)\r
19     return MPI_ERR_AMODE;\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 int PMPI_File_close(MPI_File *fh){\r
34   if (fh==nullptr)\r
35     return MPI_ERR_ARG;\r
36   smpi_bench_end();\r
37   int ret = simgrid::smpi::File::close(fh);\r
38   *fh = MPI_FILE_NULL;\r
39   smpi_bench_begin();\r
40   return ret;\r
41 }\r
42 #define CHECK_FILE(fh) if(fh==MPI_FILE_NULL) return MPI_ERR_FILE;\r
43 #define CHECK_BUFFER(buf, count)  if (buf==nullptr && count > 0) return MPI_ERR_BUFFER;\r
44 #define CHECK_COUNT(count)  if (count < 0) return MPI_ERR_COUNT;\r
45 #define CHECK_OFFSET(offset)  if (offset < 0) return MPI_ERR_DISP;\r
46 #define CHECK_DATATYPE(datatype, count) if (datatype == MPI_DATATYPE_NULL && count > 0) return MPI_ERR_TYPE;\r
47 #define CHECK_STATUS(status) if (status == nullptr) return MPI_ERR_ARG;\r
48 #define CHECK_FLAGS(fh) if (fh->flags() & MPI_MODE_SEQUENTIAL) return MPI_ERR_AMODE;\r
49 \r
50 #define PASS_ZEROCOUNT(count) if (count == 0) {\\r
51 status->count=0;\\r
52 return MPI_SUCCESS;\\r
53 }\r
54 \r
55 int PMPI_File_seek(MPI_File fh, MPI_Offset offset, int whence){\r
56   CHECK_FILE(fh);
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_seek_shared(MPI_File fh, MPI_Offset offset, int whence){\r
65   CHECK_FILE(fh)\r
66   smpi_bench_end();\r
67   int ret = fh->seek_shared(offset,whence);\r
68   smpi_bench_begin();\r
69   return ret;\r
70 \r
71 }\r
72 \r
73 int PMPI_File_get_position(MPI_File fh, MPI_Offset* offset){\r
74   if (offset==nullptr)\r
75     return MPI_ERR_DISP;\r
76   smpi_bench_end();\r
77   int ret = fh->get_position(offset);\r
78   smpi_bench_begin();\r
79   return ret;\r
80 }\r
81 \r
82 int PMPI_File_get_position_shared(MPI_File fh, MPI_Offset* offset){\r
83   CHECK_FILE(fh)\r
84   if (offset==nullptr)\r
85     return MPI_ERR_DISP;\r
86   smpi_bench_end();\r
87   int ret = fh->get_position_shared(offset);\r
88   smpi_bench_begin();\r
89   return ret;\r
90 }\r
91 \r
92 int PMPI_File_read(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
93   CHECK_FILE(fh)
94   CHECK_BUFFER(buf, count)\r
95   CHECK_COUNT(count)\r
96   CHECK_DATATYPE(datatype, count)\r
97   CHECK_STATUS(status)\r
98   CHECK_FLAGS(fh)\r
99   PASS_ZEROCOUNT(count)\r
100   smpi_bench_end();\r
101   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
102   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));\r
103   int ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);\r
104   TRACE_smpi_comm_out(rank_traced);\r
105   smpi_bench_begin();\r
106   return ret;\r
107 }\r
108 \r
109 int PMPI_File_read_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
110   CHECK_FILE(fh)\r
111   CHECK_BUFFER(buf, count)\r
112   CHECK_COUNT(count)\r
113   CHECK_DATATYPE(datatype, count)\r
114   CHECK_STATUS(status)\r
115   CHECK_FLAGS(fh)\r
116   PASS_ZEROCOUNT(count)\r
117   smpi_bench_end();\r
118   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
119   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_shared", static_cast<double>(count*datatype->size())));\r
120   int ret = simgrid::smpi::File::read_shared(fh, buf, count, datatype, status);\r
121   TRACE_smpi_comm_out(rank_traced);\r
122   smpi_bench_begin();\r
123   return ret;\r
124 }\r
125 \r
126 int PMPI_File_write(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
127   CHECK_FILE(fh)
128   CHECK_BUFFER(buf, count)\r
129   CHECK_COUNT(count)\r
130   CHECK_DATATYPE(datatype, count)\r
131   CHECK_STATUS(status)\r
132   CHECK_FLAGS(fh)\r
133   PASS_ZEROCOUNT(count)\r
134   smpi_bench_end();\r
135   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
136   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));\r
137   int ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);\r
138   TRACE_smpi_comm_out(rank_traced);\r
139   smpi_bench_begin();\r
140   return ret;\r
141 }\r
142 \r
143 int PMPI_File_write_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
144   CHECK_FILE(fh)\r
145   CHECK_BUFFER(buf, count)\r
146   CHECK_COUNT(count)\r
147   CHECK_DATATYPE(datatype, count)\r
148   CHECK_STATUS(status)\r
149   CHECK_FLAGS(fh)\r
150   PASS_ZEROCOUNT(count)\r
151   smpi_bench_end();\r
152   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
153   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_shared", static_cast<double>(count*datatype->size())));\r
154   int ret = simgrid::smpi::File::write_shared(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 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
161   CHECK_FILE(fh)
162   CHECK_BUFFER(buf, count)\r
163   CHECK_COUNT(count)\r
164   CHECK_DATATYPE(datatype, count)\r
165   CHECK_STATUS(status)\r
166   CHECK_FLAGS(fh)\r
167   smpi_bench_end();\r
168   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
169   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", static_cast<double>(count*datatype->size())));\r
170   int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);\r
171   TRACE_smpi_comm_out(rank_traced);\r
172   smpi_bench_begin();\r
173   return ret;\r
174 }\r
175 \r
176 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
177   CHECK_FILE(fh)\r
178   CHECK_BUFFER(buf, count)\r
179   CHECK_COUNT(count)\r
180   CHECK_DATATYPE(datatype, count)\r
181   CHECK_STATUS(status)\r
182   CHECK_FLAGS(fh)\r
183   smpi_bench_end();\r
184   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
185   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_ordered", static_cast<double>(count*datatype->size())));\r
186   int ret = simgrid::smpi::File::read_ordered(fh, buf, count, datatype, status);\r
187   TRACE_smpi_comm_out(rank_traced);\r
188   smpi_bench_begin();\r
189   return ret;\r
190 }\r
191 \r
192 int PMPI_File_write_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
193   CHECK_FILE(fh)
194   CHECK_BUFFER(buf, count)\r
195   CHECK_COUNT(count)\r
196   CHECK_DATATYPE(datatype, count)\r
197   CHECK_STATUS(status)\r
198   CHECK_FLAGS(fh)\r
199   smpi_bench_end();\r
200   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
201   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", static_cast<double>(count*datatype->size())));\r
202   int ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);\r
203   TRACE_smpi_comm_out(rank_traced);\r
204   smpi_bench_begin();\r
205   return ret;\r
206 }\r
207 \r
208 int PMPI_File_write_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
209   CHECK_FILE(fh)\r
210   CHECK_BUFFER(buf, count)\r
211   CHECK_COUNT(count)\r
212   CHECK_DATATYPE(datatype, count)\r
213   CHECK_STATUS(status)\r
214   CHECK_FLAGS(fh)\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_ordered", static_cast<double>(count*datatype->size())));\r
218   int ret = simgrid::smpi::File::write_ordered(fh, buf, count, datatype, status);\r
219   TRACE_smpi_comm_out(rank_traced);\r
220   smpi_bench_begin();\r
221   return ret;\r
222 }\r
223 \r
224 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
225   CHECK_FILE(fh)
226   CHECK_BUFFER(buf, count)\r
227   CHECK_OFFSET(offset)\r
228   CHECK_COUNT(count)\r
229   CHECK_DATATYPE(datatype, count)\r
230   CHECK_STATUS(status)\r
231   CHECK_FLAGS(fh)\r
232   PASS_ZEROCOUNT(count);\r
233   smpi_bench_end();\r
234   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
235   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));\r
236   int ret = fh->seek(offset,MPI_SEEK_SET);\r
237   if(ret!=MPI_SUCCESS)\r
238     return ret;\r
239   ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);\r
240   TRACE_smpi_comm_out(rank_traced);\r
241   smpi_bench_begin();\r
242   return ret;\r
243 }\r
244 \r
245 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
246   CHECK_FILE(fh)
247   CHECK_BUFFER(buf, count)\r
248   CHECK_OFFSET(offset)\r
249   CHECK_COUNT(count)\r
250   CHECK_DATATYPE(datatype, count)\r
251   CHECK_STATUS(status)\r
252   CHECK_FLAGS(fh)\r
253   smpi_bench_end();\r
254   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
255   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_at_all", static_cast<double>(count*datatype->size())));\r
256   int ret = fh->seek(offset,MPI_SEEK_SET);\r
257   if(ret!=MPI_SUCCESS)\r
258     return ret;\r
259   ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);\r
260   TRACE_smpi_comm_out(rank_traced);\r
261   smpi_bench_begin();\r
262   return ret;\r
263 }\r
264 \r
265 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
266   CHECK_FILE(fh)
267   CHECK_BUFFER(buf, count)\r
268   CHECK_OFFSET(offset)\r
269   CHECK_COUNT(count)\r
270   CHECK_DATATYPE(datatype, count)\r
271   CHECK_STATUS(status)\r
272   CHECK_FLAGS(fh)\r
273   PASS_ZEROCOUNT(count);\r
274   smpi_bench_end();\r
275   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
276   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));\r
277   int ret = fh->seek(offset,MPI_SEEK_SET);\r
278   if(ret!=MPI_SUCCESS)\r
279     return ret;\r
280   ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);\r
281   TRACE_smpi_comm_out(rank_traced);\r
282   smpi_bench_begin();\r
283   return ret;\r
284 }\r
285 \r
286 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){\r
287   CHECK_FILE(fh)
288   CHECK_BUFFER(buf, count)\r
289   CHECK_OFFSET(offset)\r
290   CHECK_COUNT(count)\r
291   CHECK_DATATYPE(datatype, count)\r
292   CHECK_STATUS(status)\r
293   CHECK_FLAGS(fh)\r
294   smpi_bench_end();\r
295   int rank_traced = simgrid::s4u::this_actor::get_pid();\r
296   TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_at_all", static_cast<double>(count*datatype->size())));\r
297   int ret = fh->seek(offset,MPI_SEEK_SET);\r
298   if(ret!=MPI_SUCCESS)\r
299     return ret;\r
300   ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);\r
301   TRACE_smpi_comm_out(rank_traced);\r
302   smpi_bench_begin();\r
303   return ret;\r
304 }\r
305 \r
306 int PMPI_File_delete(char *filename, MPI_Info info){\r
307   if (filename == nullptr)\r
308     return MPI_ERR_FILE;\r
309   smpi_bench_end();\r
310   int ret = simgrid::smpi::File::del(filename, info);\r
311   smpi_bench_begin();\r
312   return ret;\r
313 }\r
314 \r
315 int PMPI_File_get_info(MPI_File  fh, MPI_Info* info)\r
316 {\r
317   CHECK_FILE(fh)\r
318   *info = fh->info();\r
319   return MPI_SUCCESS;\r
320 }\r
321 \r
322 int PMPI_File_set_info(MPI_File  fh, MPI_Info info)\r
323 {\r
324   CHECK_FILE(fh)\r
325   fh->set_info(info);\r
326   return MPI_SUCCESS;\r
327 }