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", 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__,
118 new simgrid::instr::CpuTIData("IO - read_shared", count * datatype->size()));
119 int ret = simgrid::smpi::File::read_shared(fh, buf, count, datatype, status);
120 TRACE_smpi_comm_out(rank_traced);
125 int PMPI_File_write(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
127 CHECK_BUFFER(buf, count)
129 CHECK_DATATYPE(datatype, count)
133 PASS_ZEROCOUNT(count)
135 int rank_traced = simgrid::s4u::this_actor::get_pid();
136 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", count * datatype->size()));
137 int ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
138 TRACE_smpi_comm_out(rank_traced);
143 int PMPI_File_write_shared(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
145 CHECK_BUFFER(buf, count)
147 CHECK_DATATYPE(datatype, count)
151 PASS_ZEROCOUNT(count)
153 int rank_traced = simgrid::s4u::this_actor::get_pid();
154 TRACE_smpi_comm_in(rank_traced, __func__,
155 new simgrid::instr::CpuTIData("IO - write_shared", count * datatype->size()));
156 int ret = simgrid::smpi::File::write_shared(fh, buf, count, datatype, status);
157 TRACE_smpi_comm_out(rank_traced);
162 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
164 CHECK_BUFFER(buf, count)
166 CHECK_DATATYPE(datatype, count)
170 int rank_traced = simgrid::s4u::this_actor::get_pid();
171 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", count * datatype->size()));
172 int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
173 TRACE_smpi_comm_out(rank_traced);
178 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
180 CHECK_BUFFER(buf, count)
182 CHECK_DATATYPE(datatype, count)
186 int rank_traced = simgrid::s4u::this_actor::get_pid();
187 TRACE_smpi_comm_in(rank_traced, __func__,
188 new simgrid::instr::CpuTIData("IO - read_ordered", count * datatype->size()));
189 int ret = simgrid::smpi::File::read_ordered(fh, buf, count, datatype, status);
190 TRACE_smpi_comm_out(rank_traced);
195 int PMPI_File_write_all(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
197 CHECK_BUFFER(buf, count)
199 CHECK_DATATYPE(datatype, count)
204 int rank_traced = simgrid::s4u::this_actor::get_pid();
205 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", count * datatype->size()));
206 int ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
207 TRACE_smpi_comm_out(rank_traced);
212 int PMPI_File_write_ordered(MPI_File fh, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
214 CHECK_BUFFER(buf, count)
216 CHECK_DATATYPE(datatype, count)
221 int rank_traced = simgrid::s4u::this_actor::get_pid();
222 TRACE_smpi_comm_in(rank_traced, __func__,
223 new simgrid::instr::CpuTIData("IO - write_ordered", count * datatype->size()));
224 int ret = simgrid::smpi::File::write_ordered(fh, buf, count, datatype, status);
225 TRACE_smpi_comm_out(rank_traced);
230 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
232 CHECK_BUFFER(buf, count)
235 CHECK_DATATYPE(datatype, count)
238 PASS_ZEROCOUNT(count);
240 int rank_traced = simgrid::s4u::this_actor::get_pid();
241 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", count * datatype->size()));
242 int ret = fh->seek(offset,MPI_SEEK_SET);
245 ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
246 TRACE_smpi_comm_out(rank_traced);
251 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
253 CHECK_BUFFER(buf, count)
256 CHECK_DATATYPE(datatype, count)
260 int rank_traced = simgrid::s4u::this_actor::get_pid();
261 TRACE_smpi_comm_in(rank_traced, __func__,
262 new simgrid::instr::CpuTIData("IO - read_at_all", count * datatype->size()));
263 int ret = fh->seek(offset,MPI_SEEK_SET);
266 ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
267 TRACE_smpi_comm_out(rank_traced);
272 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
274 CHECK_BUFFER(buf, count)
277 CHECK_DATATYPE(datatype, count)
281 PASS_ZEROCOUNT(count);
283 int rank_traced = simgrid::s4u::this_actor::get_pid();
284 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", count * datatype->size()));
285 int ret = fh->seek(offset,MPI_SEEK_SET);
288 ret = simgrid::smpi::File::write(fh, const_cast<void*>(buf), count, datatype, status);
289 TRACE_smpi_comm_out(rank_traced);
294 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, const void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
296 CHECK_BUFFER(buf, count)
299 CHECK_DATATYPE(datatype, count)
304 int rank_traced = simgrid::s4u::this_actor::get_pid();
305 TRACE_smpi_comm_in(rank_traced, __func__,
306 new simgrid::instr::CpuTIData("IO - write_at_all", count * datatype->size()));
307 int ret = fh->seek(offset,MPI_SEEK_SET);
310 ret = fh->op_all<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
311 TRACE_smpi_comm_out(rank_traced);
316 int PMPI_File_delete(const char *filename, MPI_Info info){
317 if (filename == nullptr)
320 int ret = simgrid::smpi::File::del(filename, info);
325 int PMPI_File_get_info(MPI_File fh, MPI_Info* info)
332 int PMPI_File_set_info(MPI_File fh, MPI_Info info)
339 int PMPI_File_get_size(MPI_File fh, MPI_Offset* size)
346 int PMPI_File_get_amode(MPI_File fh, int* amode)
349 *amode = fh->flags();
353 int PMPI_File_get_group(MPI_File fh, MPI_Group* group)
356 *group = fh->comm()->group();
360 int PMPI_File_sync(MPI_File fh)