1 /* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */
\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
6 #include "private.hpp"
\r
7 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(smpi_pmpi);
\r
9 #include "smpi_file.hpp"
\r
10 #include "smpi_datatype.hpp"
\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
19 return MPI_ERR_AMODE;
\r
21 *fh = new simgrid::smpi::File(comm, filename, amode, info);
\r
23 if (((*fh)->size() == 0 && (not amode & MPI_MODE_CREATE)) ||
\r
24 ((*fh)->size() != 0 && (amode & MPI_MODE_EXCL))){
\r
26 return MPI_ERR_AMODE;
\r
28 if(amode & MPI_MODE_APPEND)
\r
29 (*fh)->seek(0,MPI_SEEK_END);
\r
33 int PMPI_File_close(MPI_File *fh){
\r
37 int ret = simgrid::smpi::File::close(fh);
\r
38 *fh = MPI_FILE_NULL;
\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
50 #define PASS_ZEROCOUNT(count) if (count == 0) {\
\r
52 return MPI_SUCCESS;\
\r
55 int PMPI_File_seek(MPI_File fh, MPI_Offset offset, int whence){
\r
58 int ret = fh->seek(offset,whence);
\r
64 int PMPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence){
\r
67 int ret = fh->seek_shared(offset,whence);
\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
77 int ret = fh->get_position(offset);
\r
82 int PMPI_File_get_position_shared(MPI_File fh, MPI_Offset* offset){
\r
84 if (offset==nullptr)
\r
85 return MPI_ERR_DISP;
\r
87 int ret = fh->get_position_shared(offset);
\r
92 int PMPI_File_read(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
94 CHECK_BUFFER(buf, count)
\r
96 CHECK_DATATYPE(datatype, count)
\r
97 CHECK_STATUS(status)
\r
99 PASS_ZEROCOUNT(count)
\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
109 int PMPI_File_read_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
111 CHECK_BUFFER(buf, count)
\r
113 CHECK_DATATYPE(datatype, count)
\r
114 CHECK_STATUS(status)
\r
116 PASS_ZEROCOUNT(count)
\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
126 int PMPI_File_write(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
128 CHECK_BUFFER(buf, count)
\r
130 CHECK_DATATYPE(datatype, count)
\r
131 CHECK_STATUS(status)
\r
133 PASS_ZEROCOUNT(count)
\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
143 int PMPI_File_write_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
145 CHECK_BUFFER(buf, count)
\r
147 CHECK_DATATYPE(datatype, count)
\r
148 CHECK_STATUS(status)
\r
150 PASS_ZEROCOUNT(count)
\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
160 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
162 CHECK_BUFFER(buf, count)
\r
164 CHECK_DATATYPE(datatype, count)
\r
165 CHECK_STATUS(status)
\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
176 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
178 CHECK_BUFFER(buf, count)
\r
180 CHECK_DATATYPE(datatype, count)
\r
181 CHECK_STATUS(status)
\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
192 int PMPI_File_write_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
194 CHECK_BUFFER(buf, count)
\r
196 CHECK_DATATYPE(datatype, count)
\r
197 CHECK_STATUS(status)
\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
208 int PMPI_File_write_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
210 CHECK_BUFFER(buf, count)
\r
212 CHECK_DATATYPE(datatype, count)
\r
213 CHECK_STATUS(status)
\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
224 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
226 CHECK_BUFFER(buf, count)
\r
227 CHECK_OFFSET(offset)
\r
229 CHECK_DATATYPE(datatype, count)
\r
230 CHECK_STATUS(status)
\r
232 PASS_ZEROCOUNT(count);
\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
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
245 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
247 CHECK_BUFFER(buf, count)
\r
248 CHECK_OFFSET(offset)
\r
250 CHECK_DATATYPE(datatype, count)
\r
251 CHECK_STATUS(status)
\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
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
265 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
267 CHECK_BUFFER(buf, count)
\r
268 CHECK_OFFSET(offset)
\r
270 CHECK_DATATYPE(datatype, count)
\r
271 CHECK_STATUS(status)
\r
273 PASS_ZEROCOUNT(count);
\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
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
286 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
\r
288 CHECK_BUFFER(buf, count)
\r
289 CHECK_OFFSET(offset)
\r
291 CHECK_DATATYPE(datatype, count)
\r
292 CHECK_STATUS(status)
\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
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
306 int PMPI_File_delete(char *filename, MPI_Info info){
\r
307 if (filename == nullptr)
\r
308 return MPI_ERR_FILE;
\r
310 int ret = simgrid::smpi::File::del(filename, info);
\r
311 smpi_bench_begin();
\r
315 int PMPI_File_get_info(MPI_File fh, MPI_Info* info)
\r
318 *info = fh->info();
\r
319 return MPI_SUCCESS;
\r
322 int PMPI_File_set_info(MPI_File fh, MPI_Info info)
\r
325 fh->set_info(info);
\r
326 return MPI_SUCCESS;
\r