X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/351f4d5661f46713d2ea8c5939144334402369a0..83da75eb42a4600ed26bfa3eed98f0678b2b8507:/src/smpi/mpi/smpi_file.cpp diff --git a/src/smpi/mpi/smpi_file.cpp b/src/smpi/mpi/smpi_file.cpp index b832510aef..01c8a92d35 100644 --- a/src/smpi/mpi/smpi_file.cpp +++ b/src/smpi/mpi/smpi_file.cpp @@ -49,9 +49,12 @@ File::File(MPI_Comm comm, const char* filename, int amode, MPI_Info info) : comm fullname.insert(0, mount); } } - + XBT_DEBUG("Opening %s", fullname.c_str()); file_ = simgrid::s4u::File::open(fullname, nullptr); list_ = nullptr; + disp_ = 0; + etype_ = MPI_BYTE; + atomicity_ = true; if (comm_->rank() == 0) { int size = comm_->size() + FP_SIZE; list_ = new char[size]; @@ -108,14 +111,14 @@ int File::del(const char* filename, const Info*) int File::get_position(MPI_Offset* offset) const { - *offset = file_->tell(); + *offset = file_->tell()/etype_->get_extent(); return MPI_SUCCESS; } int File::get_position_shared(MPI_Offset* offset) const { shared_mutex_->lock(); - *offset = *shared_file_pointer_; + *offset = *shared_file_pointer_/etype_->get_extent(); shared_mutex_->unlock(); return MPI_SUCCESS; } @@ -156,9 +159,9 @@ int File::read(MPI_File fh, void* /*buf*/, int count, const Datatype* datatype, MPI_Offset position = fh->file_->tell(); MPI_Offset movesize = datatype->get_extent() * count; MPI_Offset readsize = datatype->size() * count; - XBT_DEBUG("Position before read in MPI_File %s : %llu", fh->file_->get_path(), fh->file_->tell()); + XBT_DEBUG("Position before read in MPI_File %s : %llu, size %llu", fh->file_->get_path(), fh->file_->tell(), fh->file_->size()); MPI_Offset read = fh->file_->read(readsize); - XBT_VERB("Read in MPI_File %s, %lld bytes read, readsize %lld bytes, movesize %lld", fh->file_->get_path(), read, + XBT_VERB("Read in MPI_File %s, %lld bytes read, count %d, readsize %lld bytes, movesize %lld", fh->file_->get_path(), read, count, readsize, movesize); if (readsize != movesize) { fh->file_->seek(position + movesize, SEEK_SET); @@ -182,10 +185,13 @@ int File::read(MPI_File fh, void* /*buf*/, int count, const Datatype* datatype, int File::read_shared(MPI_File fh, void* buf, int count, const Datatype* datatype, MPI_Status* status) { fh->shared_mutex_->lock(); + XBT_VERB("before read shared, shared pointer is %llu, pointer is %llu",*(fh->shared_file_pointer_) , fh->file_->tell()); fh->seek(*(fh->shared_file_pointer_), MPI_SEEK_SET); read(fh, buf, count, datatype, status); *(fh->shared_file_pointer_) = fh->file_->tell(); + XBT_VERB("after read shared, shared pointer is %llu, pointer is %llu",*(fh->shared_file_pointer_) , fh->file_->tell()); fh->shared_mutex_->unlock(); + fh->seek(*(fh->shared_file_pointer_), MPI_SEEK_SET); return MPI_SUCCESS; } @@ -201,6 +207,8 @@ int File::read_ordered(MPI_File fh, void* buf, int count, const Datatype* dataty MPI_Offset result; simgrid::smpi::colls::scan(&val, &result, 1, MPI_OFFSET, MPI_SUM, fh->comm_); + MPI_Offset prev; + fh->get_position(&prev); fh->seek(result, MPI_SEEK_SET); int ret = fh->op_all(buf, count, datatype, status); if (fh->comm_->rank() == fh->comm_->size() - 1) { @@ -210,6 +218,7 @@ int File::read_ordered(MPI_File fh, void* buf, int count, const Datatype* dataty } char c; simgrid::smpi::colls::bcast(&c, 1, MPI_BYTE, fh->comm_->size() - 1, fh->comm_); + fh->seek(prev, MPI_SEEK_SET); return ret; } @@ -219,10 +228,10 @@ int File::write(MPI_File fh, void* /*buf*/, int count, const Datatype* datatype, MPI_Offset position = fh->file_->tell(); MPI_Offset movesize = datatype->get_extent() * count; MPI_Offset writesize = datatype->size() * count; - XBT_DEBUG("Position before write in MPI_File %s : %llu", fh->file_->get_path(), fh->file_->tell()); + XBT_DEBUG("Position before write in MPI_File %s : %llu, size %llu", fh->file_->get_path(), fh->file_->tell(), fh->file_->size()); MPI_Offset write = fh->file_->write(writesize, true); - XBT_VERB("Write in MPI_File %s, %lld bytes written, readsize %lld bytes, movesize %lld", fh->file_->get_path(), write, - writesize, movesize); + XBT_VERB("Write in MPI_File %s, %lld bytes written, count %d, writesize %lld bytes, movesize %lld", fh->file_->get_path(), write, + count, writesize, movesize); if (writesize != movesize) { fh->file_->seek(position + movesize, SEEK_SET); } @@ -240,6 +249,7 @@ int File::write_shared(MPI_File fh, const void* buf, int count, const Datatype* write(fh, const_cast(buf), count, datatype, status); *(fh->shared_file_pointer_) = fh->file_->tell(); XBT_DEBUG("Write shared on %s - Shared ptr after : %lld", fh->file_->get_path(), *(fh->shared_file_pointer_)); + fh->seek(*(fh->shared_file_pointer_), MPI_SEEK_SET); fh->shared_mutex_->unlock(); return MPI_SUCCESS; } @@ -255,6 +265,8 @@ int File::write_ordered(MPI_File fh, const void* buf, int count, const Datatype* } MPI_Offset result; simgrid::smpi::colls::scan(&val, &result, 1, MPI_OFFSET, MPI_SUM, fh->comm_); + MPI_Offset prev; + fh->get_position(&prev); fh->seek(result, MPI_SEEK_SET); int ret = fh->op_all(const_cast(buf), count, datatype, status); if (fh->comm_->rank() == fh->comm_->size() - 1) { @@ -264,6 +276,7 @@ int File::write_ordered(MPI_File fh, const void* buf, int count, const Datatype* } char c; simgrid::smpi::colls::bcast(&c, 1, MPI_BYTE, fh->comm_->size() - 1, fh->comm_); + fh->seek(prev, MPI_SEEK_SET); return ret; } @@ -299,6 +312,11 @@ int File::flags() const return flags_; } +MPI_Datatype File::etype() const +{ + return etype_; +} + int File::sync() { // no idea @@ -344,4 +362,13 @@ File* File::f2c(int id) { return static_cast(F2C::f2c(id)); } + +void File::set_atomicity(bool a){ + atomicity_ = a; +} + +bool File::get_atomicity(){ + return atomicity_; +} + } // namespace simgrid::smpi