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, 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 && not (amode & MPI_MODE_CREATE)) ||
22 ((*fh)->size() != 0 && (amode & MPI_MODE_EXCL))){
26 if(amode & MPI_MODE_APPEND)
27 (*fh)->seek(0,MPI_SEEK_END);
31 int PMPI_File_close(MPI_File *fh){
35 int ret = simgrid::smpi::File::close(fh);
40 #define CHECK_FILE(fh) if(fh==MPI_FILE_NULL) return MPI_ERR_FILE;
41 #define CHECK_BUFFER(buf, count) if (buf==nullptr && count > 0) return MPI_ERR_BUFFER;
42 #define CHECK_COUNT(count) if (count < 0) return MPI_ERR_COUNT;
43 #define CHECK_OFFSET(offset) if (offset < 0) return MPI_ERR_DISP;
44 #define CHECK_DATATYPE(datatype, count) if (datatype == MPI_DATATYPE_NULL && count > 0) return MPI_ERR_TYPE;
45 #define CHECK_STATUS(status) if (status == nullptr) return MPI_ERR_ARG;
46 #define CHECK_FLAGS(fh) if (fh->flags() & MPI_MODE_SEQUENTIAL) return MPI_ERR_AMODE;
47 #define CHECK_RDONLY(fh) if (fh->flags() & MPI_MODE_RDONLY ) return MPI_ERR_AMODE;
49 #define PASS_ZEROCOUNT(count) if (count == 0) {\
54 int PMPI_File_seek(MPI_File fh, MPI_Offset offset, int whence){
57 int ret = fh->seek(offset,whence);
63 int PMPI_File_seek_shared(MPI_File fh, MPI_Offset offset, int whence){
66 int ret = fh->seek_shared(offset,whence);
72 int PMPI_File_get_position(MPI_File fh, MPI_Offset* offset){
76 int ret = fh->get_position(offset);
81 int PMPI_File_get_position_shared(MPI_File fh, MPI_Offset* offset){
86 int ret = fh->get_position_shared(offset);
91 int PMPI_File_read(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
93 CHECK_BUFFER(buf, count)
95 CHECK_DATATYPE(datatype, count)
100 int rank_traced = simgrid::s4u::this_actor::get_pid();
101 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));
102 int ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
103 TRACE_smpi_comm_out(rank_traced);
108 int PMPI_File_read_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
110 CHECK_BUFFER(buf, count)
112 CHECK_DATATYPE(datatype, count)
115 PASS_ZEROCOUNT(count)
117 int rank_traced = simgrid::s4u::this_actor::get_pid();
118 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_shared", static_cast<double>(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, 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", static_cast<double>(count*datatype->size())));
137 int ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);
138 TRACE_smpi_comm_out(rank_traced);
143 int PMPI_File_write_shared(MPI_File fh, 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__, new simgrid::instr::CpuTIData("IO - write_shared", static_cast<double>(count*datatype->size())));
155 int ret = simgrid::smpi::File::write_shared(fh, buf, count, datatype, status);
156 TRACE_smpi_comm_out(rank_traced);
161 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
163 CHECK_BUFFER(buf, count)
165 CHECK_DATATYPE(datatype, count)
169 int rank_traced = simgrid::s4u::this_actor::get_pid();
170 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", static_cast<double>(count*datatype->size())));
171 int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
172 TRACE_smpi_comm_out(rank_traced);
177 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
179 CHECK_BUFFER(buf, count)
181 CHECK_DATATYPE(datatype, count)
185 int rank_traced = simgrid::s4u::this_actor::get_pid();
186 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_ordered", static_cast<double>(count*datatype->size())));
187 int ret = simgrid::smpi::File::read_ordered(fh, buf, count, datatype, status);
188 TRACE_smpi_comm_out(rank_traced);
193 int PMPI_File_write_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
195 CHECK_BUFFER(buf, count)
197 CHECK_DATATYPE(datatype, count)
202 int rank_traced = simgrid::s4u::this_actor::get_pid();
203 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", static_cast<double>(count*datatype->size())));
204 int ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);
205 TRACE_smpi_comm_out(rank_traced);
210 int PMPI_File_write_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
212 CHECK_BUFFER(buf, count)
214 CHECK_DATATYPE(datatype, count)
219 int rank_traced = simgrid::s4u::this_actor::get_pid();
220 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_ordered", static_cast<double>(count*datatype->size())));
221 int ret = simgrid::smpi::File::write_ordered(fh, buf, count, datatype, status);
222 TRACE_smpi_comm_out(rank_traced);
227 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
229 CHECK_BUFFER(buf, count)
232 CHECK_DATATYPE(datatype, count)
235 PASS_ZEROCOUNT(count);
237 int rank_traced = simgrid::s4u::this_actor::get_pid();
238 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));
239 int ret = fh->seek(offset,MPI_SEEK_SET);
242 ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
243 TRACE_smpi_comm_out(rank_traced);
248 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
250 CHECK_BUFFER(buf, count)
253 CHECK_DATATYPE(datatype, count)
257 int rank_traced = simgrid::s4u::this_actor::get_pid();
258 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_at_all", static_cast<double>(count*datatype->size())));
259 int ret = fh->seek(offset,MPI_SEEK_SET);
262 ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
263 TRACE_smpi_comm_out(rank_traced);
268 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
270 CHECK_BUFFER(buf, count)
273 CHECK_DATATYPE(datatype, count)
277 PASS_ZEROCOUNT(count);
279 int rank_traced = simgrid::s4u::this_actor::get_pid();
280 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));
281 int ret = fh->seek(offset,MPI_SEEK_SET);
284 ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);
285 TRACE_smpi_comm_out(rank_traced);
290 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
292 CHECK_BUFFER(buf, count)
295 CHECK_DATATYPE(datatype, count)
300 int rank_traced = simgrid::s4u::this_actor::get_pid();
301 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_at_all", static_cast<double>(count*datatype->size())));
302 int ret = fh->seek(offset,MPI_SEEK_SET);
305 ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);
306 TRACE_smpi_comm_out(rank_traced);
311 int PMPI_File_delete(char *filename, MPI_Info info){
312 if (filename == nullptr)
315 int ret = simgrid::smpi::File::del(filename, info);
320 int PMPI_File_get_info(MPI_File fh, MPI_Info* info)
327 int PMPI_File_set_info(MPI_File fh, MPI_Info info)