1 /* Copyright (c) 2007-2019. The SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
8 #include "smpi_file.hpp"
9 #include "smpi_datatype.hpp"
11 int PMPI_File_open(MPI_Comm comm, const char *filename, int amode, MPI_Info info, MPI_File *fh){
12 if (comm == MPI_COMM_NULL)
14 if (filename == nullptr)
19 *fh = new simgrid::smpi::File(comm, filename, amode, info);
21 if ((*fh)->size() != 0 && (amode & MPI_MODE_EXCL)){
25 if(amode & MPI_MODE_APPEND)
26 (*fh)->seek(0,MPI_SEEK_END);
30 int PMPI_File_close(MPI_File *fh){
34 int ret = simgrid::smpi::File::close(fh);
39 #define CHECK_FILE(fh) if(fh==MPI_FILE_NULL) return MPI_ERR_FILE;
40 #define CHECK_BUFFER(buf, count) if (buf==nullptr && count > 0) return MPI_ERR_BUFFER;
41 #define CHECK_COUNT(count) if (count < 0) return MPI_ERR_COUNT;
42 #define CHECK_OFFSET(offset) if (offset < 0) return MPI_ERR_DISP;
43 #define CHECK_DATATYPE(datatype, count) if (datatype == MPI_DATATYPE_NULL && count > 0) return MPI_ERR_TYPE;
44 #define CHECK_STATUS(status) if (status == nullptr) return MPI_ERR_ARG;
45 #define CHECK_FLAGS(fh) if (fh->flags() & MPI_MODE_SEQUENTIAL) return MPI_ERR_AMODE;
46 #define CHECK_RDONLY(fh) if (fh->flags() & MPI_MODE_RDONLY ) return MPI_ERR_AMODE;
48 #define PASS_ZEROCOUNT(count) if (count == 0) {\
53 int PMPI_File_seek(MPI_File fh, MPI_Offset offset, int whence){
56 int ret = fh->seek(offset,whence);
62 int PMPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence){
65 int ret = fh->seek_shared(offset,whence);
71 int PMPI_File_get_position(MPI_File fh, MPI_Offset* offset){
75 int ret = fh->get_position(offset);
80 int PMPI_File_get_position_shared(MPI_File fh, MPI_Offset* offset){
85 int ret = fh->get_position_shared(offset);
90 int PMPI_File_read(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
92 CHECK_BUFFER(buf, count)
94 CHECK_DATATYPE(datatype, count)
99 int rank_traced = simgrid::s4u::this_actor::get_pid();
100 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));
101 int ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
102 TRACE_smpi_comm_out(rank_traced);
107 int PMPI_File_read_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
109 CHECK_BUFFER(buf, count)
111 CHECK_DATATYPE(datatype, count)
114 PASS_ZEROCOUNT(count)
116 int rank_traced = simgrid::s4u::this_actor::get_pid();
117 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_shared", static_cast<double>(count*datatype->size())));
118 int ret = simgrid::smpi::File::read_shared(fh, buf, count, datatype, status);
119 TRACE_smpi_comm_out(rank_traced);
124 int PMPI_File_write(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
126 CHECK_BUFFER(buf, count)
128 CHECK_DATATYPE(datatype, count)
132 PASS_ZEROCOUNT(count)
134 int rank_traced = simgrid::s4u::this_actor::get_pid();
135 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));
136 int ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
137 TRACE_smpi_comm_out(rank_traced);
142 int PMPI_File_write_shared(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
144 CHECK_BUFFER(buf, count)
146 CHECK_DATATYPE(datatype, count)
150 PASS_ZEROCOUNT(count)
152 int rank_traced = simgrid::s4u::this_actor::get_pid();
153 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_shared", static_cast<double>(count*datatype->size())));
154 int ret = simgrid::smpi::File::write_shared(fh, buf, count, datatype, status);
155 TRACE_smpi_comm_out(rank_traced);
160 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
162 CHECK_BUFFER(buf, count)
164 CHECK_DATATYPE(datatype, count)
168 int rank_traced = simgrid::s4u::this_actor::get_pid();
169 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", static_cast<double>(count*datatype->size())));
170 int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
171 TRACE_smpi_comm_out(rank_traced);
176 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
178 CHECK_BUFFER(buf, count)
180 CHECK_DATATYPE(datatype, count)
184 int rank_traced = simgrid::s4u::this_actor::get_pid();
185 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_ordered", static_cast<double>(count*datatype->size())));
186 int ret = simgrid::smpi::File::read_ordered(fh, buf, count, datatype, status);
187 TRACE_smpi_comm_out(rank_traced);
192 int PMPI_File_write_all(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
194 CHECK_BUFFER(buf, count)
196 CHECK_DATATYPE(datatype, count)
201 int rank_traced = simgrid::s4u::this_actor::get_pid();
202 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", static_cast<double>(count*datatype->size())));
203 int ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
204 TRACE_smpi_comm_out(rank_traced);
209 int PMPI_File_write_ordered(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
211 CHECK_BUFFER(buf, count)
213 CHECK_DATATYPE(datatype, count)
218 int rank_traced = simgrid::s4u::this_actor::get_pid();
219 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_ordered", static_cast<double>(count*datatype->size())));
220 int ret = simgrid::smpi::File::write_ordered(fh, buf, count, datatype, status);
221 TRACE_smpi_comm_out(rank_traced);
226 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
228 CHECK_BUFFER(buf, count)
231 CHECK_DATATYPE(datatype, count)
234 PASS_ZEROCOUNT(count);
236 int rank_traced = simgrid::s4u::this_actor::get_pid();
237 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));
238 int ret = fh->seek(offset,MPI_SEEK_SET);
241 ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
242 TRACE_smpi_comm_out(rank_traced);
247 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
249 CHECK_BUFFER(buf, count)
252 CHECK_DATATYPE(datatype, count)
256 int rank_traced = simgrid::s4u::this_actor::get_pid();
257 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_at_all", static_cast<double>(count*datatype->size())));
258 int ret = fh->seek(offset,MPI_SEEK_SET);
261 ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
262 TRACE_smpi_comm_out(rank_traced);
267 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
269 CHECK_BUFFER(buf, count)
272 CHECK_DATATYPE(datatype, count)
276 PASS_ZEROCOUNT(count);
278 int rank_traced = simgrid::s4u::this_actor::get_pid();
279 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));
280 int ret = fh->seek(offset,MPI_SEEK_SET);
283 ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
284 TRACE_smpi_comm_out(rank_traced);
289 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
291 CHECK_BUFFER(buf, count)
294 CHECK_DATATYPE(datatype, count)
299 int rank_traced = simgrid::s4u::this_actor::get_pid();
300 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_at_all", static_cast<double>(count*datatype->size())));
301 int ret = fh->seek(offset,MPI_SEEK_SET);
304 ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
305 TRACE_smpi_comm_out(rank_traced);
310 int PMPI_File_delete(const char *filename, MPI_Info info){
311 if (filename == nullptr)
314 int ret = simgrid::smpi::File::del(filename, info);
319 int PMPI_File_get_info(MPI_File fh, MPI_Info* info)
326 int PMPI_File_set_info(MPI_File fh, MPI_Info info)
333 int PMPI_File_get_size(MPI_File fh, MPI_Offset* size)
340 int PMPI_File_get_amode(MPI_File fh, int* amode)
343 *amode = fh->flags();
347 int PMPI_File_get_group(MPI_File fh, MPI_Group* group)
350 *group = fh->comm()->group();
354 int PMPI_File_sync(MPI_File fh)