MPI_Errhandler SMPI_default_File_Errhandler = _smpi_cfg_default_errhandler_is_error ? MPI_ERRORS_ARE_FATAL : MPI_ERRORS_RETURN;;
-namespace simgrid{
-namespace smpi{
+namespace simgrid::smpi {
File::File(MPI_Comm comm, const char* filename, int amode, MPI_Info info) : comm_(comm), flags_(amode), info_(info)
{
xbt_assert(not simgrid::s4u::Host::current()->get_disks().empty(),
"SMPI/IO : Trying to open file on a diskless host ! Add one to your platform file");
- size_t found = fullname.find('/');
// in case no fullpath is provided ... just pick the first mountpoint.
- if (found == std::string::npos || fullname.rfind("./", 1) != std::string::npos) {
- auto disk = simgrid::s4u::Host::current()->get_disks().front();
+ if (size_t found = fullname.find('/'); found == std::string::npos || fullname.rfind("./", 1) != std::string::npos) {
+ const auto* disk = simgrid::s4u::Host::current()->get_disks().front();
std::string mount;
if (disk->get_host() != simgrid::s4u::Host::current())
mount = disk->extension<simgrid::s4u::FileSystemDiskExt>()->get_mount_point(disk->get_host());
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];
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;
}
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);
read(fh, buf, count, datatype, status);
*(fh->shared_file_pointer_) = fh->file_->tell();
fh->shared_mutex_->unlock();
+ fh->seek(*(fh->shared_file_pointer_), MPI_SEEK_SET);
return MPI_SUCCESS;
}
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<simgrid::smpi::File::read>(buf, count, datatype, status);
if (fh->comm_->rank() == fh->comm_->size() - 1) {
}
char c;
simgrid::smpi::colls::bcast(&c, 1, MPI_BYTE, fh->comm_->size() - 1, fh->comm_);
+ fh->seek(prev, MPI_SEEK_SET);
return ret;
}
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);
}
write(fh, const_cast<void*>(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;
}
}
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<simgrid::smpi::File::write>(const_cast<void*>(buf), count, datatype, status);
if (fh->comm_->rank() == fh->comm_->size() - 1) {
}
char c;
simgrid::smpi::colls::bcast(&c, 1, MPI_BYTE, fh->comm_->size() - 1, fh->comm_);
+ fh->seek(prev, MPI_SEEK_SET);
return ret;
}
-int File::set_view(MPI_Offset /*disp*/, MPI_Datatype etype, MPI_Datatype filetype, const char* datarep, const Info*)
+int File::set_view(MPI_Offset disp, MPI_Datatype etype, MPI_Datatype filetype, const char* datarep, const Info*)
{
etype_ = etype;
filetype_ = filetype;
datarep_ = std::string(datarep);
- seek_shared(0, MPI_SEEK_SET);
+ disp_ = disp;
+ if (comm_->rank() == 0){
+ if(disp != MPI_DISPLACEMENT_CURRENT)
+ seek_shared(disp, MPI_SEEK_SET);
+ else
+ seek_shared(0, MPI_SEEK_CUR);
+ }
+ sync();
return MPI_SUCCESS;
}
-int File::get_view(MPI_Offset* /*disp*/, MPI_Datatype* etype, MPI_Datatype* filetype, char* datarep) const
+int File::get_view(MPI_Offset* disp, MPI_Datatype* etype, MPI_Datatype* filetype, char* datarep) const
{
+ *disp = disp_;
*etype = etype_;
*filetype = filetype_;
snprintf(datarep, MPI_MAX_NAME_STRING + 1, "%s", datarep_.c_str());
return flags_;
}
+MPI_Datatype File::etype() const
+{
+ return etype_;
+}
+
int File::sync()
{
// no idea
{
return static_cast<File*>(F2C::f2c(id));
}
-} // namespace smpi
-} // namespace simgrid
+
+void File::set_atomicity(bool a){
+ atomicity_ = a;
+}
+
+bool File::get_atomicity(){
+ return atomicity_;
+}
+
+} // namespace simgrid::smpi