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;
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, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
126 CHECK_BUFFER(buf, count)
128 CHECK_DATATYPE(datatype, count)
131 PASS_ZEROCOUNT(count)
133 int rank_traced = simgrid::s4u::this_actor::get_pid();
134 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));
135 int ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);
136 TRACE_smpi_comm_out(rank_traced);
141 int PMPI_File_write_shared(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
143 CHECK_BUFFER(buf, count)
145 CHECK_DATATYPE(datatype, count)
148 PASS_ZEROCOUNT(count)
150 int rank_traced = simgrid::s4u::this_actor::get_pid();
151 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_shared", static_cast<double>(count*datatype->size())));
152 int ret = simgrid::smpi::File::write_shared(fh, buf, count, datatype, status);
153 TRACE_smpi_comm_out(rank_traced);
158 int PMPI_File_read_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
160 CHECK_BUFFER(buf, count)
162 CHECK_DATATYPE(datatype, count)
166 int rank_traced = simgrid::s4u::this_actor::get_pid();
167 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_all", static_cast<double>(count*datatype->size())));
168 int ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
169 TRACE_smpi_comm_out(rank_traced);
174 int PMPI_File_read_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
176 CHECK_BUFFER(buf, count)
178 CHECK_DATATYPE(datatype, count)
182 int rank_traced = simgrid::s4u::this_actor::get_pid();
183 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_ordered", static_cast<double>(count*datatype->size())));
184 int ret = simgrid::smpi::File::read_ordered(fh, buf, count, datatype, status);
185 TRACE_smpi_comm_out(rank_traced);
190 int PMPI_File_write_all(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
192 CHECK_BUFFER(buf, count)
194 CHECK_DATATYPE(datatype, count)
198 int rank_traced = simgrid::s4u::this_actor::get_pid();
199 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_all", static_cast<double>(count*datatype->size())));
200 int ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);
201 TRACE_smpi_comm_out(rank_traced);
206 int PMPI_File_write_ordered(MPI_File fh, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
208 CHECK_BUFFER(buf, count)
210 CHECK_DATATYPE(datatype, count)
214 int rank_traced = simgrid::s4u::this_actor::get_pid();
215 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_ordered", static_cast<double>(count*datatype->size())));
216 int ret = simgrid::smpi::File::write_ordered(fh, buf, count, datatype, status);
217 TRACE_smpi_comm_out(rank_traced);
222 int PMPI_File_read_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
224 CHECK_BUFFER(buf, count)
227 CHECK_DATATYPE(datatype, count)
230 PASS_ZEROCOUNT(count);
232 int rank_traced = simgrid::s4u::this_actor::get_pid();
233 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read", static_cast<double>(count*datatype->size())));
234 int ret = fh->seek(offset,MPI_SEEK_SET);
237 ret = simgrid::smpi::File::read(fh, buf, count, datatype, status);
238 TRACE_smpi_comm_out(rank_traced);
243 int PMPI_File_read_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
245 CHECK_BUFFER(buf, count)
248 CHECK_DATATYPE(datatype, count)
252 int rank_traced = simgrid::s4u::this_actor::get_pid();
253 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - read_at_all", static_cast<double>(count*datatype->size())));
254 int ret = fh->seek(offset,MPI_SEEK_SET);
257 ret = fh->op_all<simgrid::smpi::File::read>(buf, count, datatype, status);
258 TRACE_smpi_comm_out(rank_traced);
263 int PMPI_File_write_at(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
265 CHECK_BUFFER(buf, count)
268 CHECK_DATATYPE(datatype, count)
271 PASS_ZEROCOUNT(count);
273 int rank_traced = simgrid::s4u::this_actor::get_pid();
274 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write", static_cast<double>(count*datatype->size())));
275 int ret = fh->seek(offset,MPI_SEEK_SET);
278 ret = simgrid::smpi::File::write(fh, buf, count, datatype, status);
279 TRACE_smpi_comm_out(rank_traced);
284 int PMPI_File_write_at_all(MPI_File fh, MPI_Offset offset, void *buf, int count,MPI_Datatype datatype, MPI_Status *status){
286 CHECK_BUFFER(buf, count)
289 CHECK_DATATYPE(datatype, count)
293 int rank_traced = simgrid::s4u::this_actor::get_pid();
294 TRACE_smpi_comm_in(rank_traced, __func__, new simgrid::instr::CpuTIData("IO - write_at_all", static_cast<double>(count*datatype->size())));
295 int ret = fh->seek(offset,MPI_SEEK_SET);
298 ret = fh->op_all<simgrid::smpi::File::write>(buf, count, datatype, status);
299 TRACE_smpi_comm_out(rank_traced);
304 int PMPI_File_delete(char *filename, MPI_Info info){
305 if (filename == nullptr)
308 int ret = simgrid::smpi::File::del(filename, info);
313 int PMPI_File_get_info(MPI_File fh, MPI_Info* info)
320 int PMPI_File_set_info(MPI_File fh, MPI_Info info)