X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e709643ef0c5b61c6c878016c418bffa2b1b20cd..33a2dd5a405effecfbc7a26d7a84664902a2432a:/src/smpi/include/smpi_file.hpp diff --git a/src/smpi/include/smpi_file.hpp b/src/smpi/include/smpi_file.hpp index 25b917112f..3d1384b896 100644 --- a/src/smpi/include/smpi_file.hpp +++ b/src/smpi/include/smpi_file.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2020. The SimGrid Team. +/* Copyright (c) 2010-2022. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -36,12 +36,14 @@ class File : public F2C{ File(MPI_Comm comm, const char *filename, int amode, MPI_Info info); File(const File&) = delete; File& operator=(const File&) = delete; - ~File(); + ~File() override; int size() const; int get_position(MPI_Offset* offset) const; int get_position_shared(MPI_Offset* offset) const; int flags() const; MPI_Comm comm() const; + std::string name() const override {return file_ ? std::string("MPI_File: ")+ std::string(file_->get_path()): std::string("MPI_File");} + int sync(); int seek(MPI_Offset offset, int whence); int seek_shared(MPI_Offset offset, int whence); @@ -49,6 +51,7 @@ class File : public F2C{ int get_view(MPI_Offset* disp, MPI_Datatype* etype, MPI_Datatype* filetype, char* datarep) const; MPI_Info info(); void set_info( MPI_Info info); + void set_size(int size); static int read(MPI_File fh, void* buf, int count, const Datatype* datatype, MPI_Status* status); static int read_shared(MPI_File fh, void* buf, int count, const Datatype* datatype, MPI_Status* status); static int read_ordered(MPI_File fh, void* buf, int count, const Datatype* datatype, MPI_Status* status); @@ -82,10 +85,10 @@ int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* sta MPI_Offset max_offset = min_offset + count * datatype->get_extent(); // cheating, as we don't care about exact data location, we can skip extent - MPI_Offset* min_offsets = new MPI_Offset[size]; - MPI_Offset* max_offsets = new MPI_Offset[size]; - simgrid::smpi::colls::allgather(&min_offset, 1, MPI_OFFSET, min_offsets, 1, MPI_OFFSET, comm_); - simgrid::smpi::colls::allgather(&max_offset, 1, MPI_OFFSET, max_offsets, 1, MPI_OFFSET, comm_); + std::vector min_offsets(size); + std::vector max_offsets(size); + simgrid::smpi::colls::allgather(&min_offset, 1, MPI_OFFSET, min_offsets.data(), 1, MPI_OFFSET, comm_); + simgrid::smpi::colls::allgather(&max_offset, 1, MPI_OFFSET, max_offsets.data(), 1, MPI_OFFSET, comm_); MPI_Offset min = min_offset; MPI_Offset max = max_offset; MPI_Offset tot = 0; @@ -103,15 +106,12 @@ int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* sta XBT_CDEBUG(smpi_pmpi, "my offsets to read : %lld:%lld, global min and max %lld:%lld", min_offset, max_offset, min, max); if (empty == 1) { - delete[] min_offsets; - delete[] max_offsets; - status->count = 0; + if (status != MPI_STATUS_IGNORE) + status->count = 0; return MPI_SUCCESS; } MPI_Offset total = max - min; if (total == tot && (datatype->flags() & DT_FLAG_CONTIGUOUS)) { - delete[] min_offsets; - delete[] max_offsets; // contiguous. Just have each proc perform its read if (status != MPI_STATUS_IGNORE) status->count = count * datatype->size(); @@ -122,10 +122,10 @@ int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* sta MPI_Offset my_chunk_start = (max - min + 1) / size * rank; MPI_Offset my_chunk_end = ((max - min + 1) / size * (rank + 1)); XBT_CDEBUG(smpi_pmpi, "my chunks to read : %lld:%lld", my_chunk_start, my_chunk_end); - int* send_sizes = new int[size]; - int* recv_sizes = new int[size]; - int* send_disps = new int[size]; - int* recv_disps = new int[size]; + std::vector send_sizes(size); + std::vector recv_sizes(size); + std::vector send_disps(size); + std::vector recv_disps(size); int total_sent = 0; for (int i = 0; i < size; i++) { send_sizes[i] = 0; @@ -144,14 +144,13 @@ int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* sta // merge the ranges of every process std::vector> ranges; for (int i = 0; i < size; ++i) - ranges.push_back(std::make_pair(min_offsets[i], max_offsets[i])); + ranges.emplace_back(min_offsets[i], max_offsets[i]); std::sort(ranges.begin(), ranges.end()); std::vector> chunks; chunks.push_back(ranges[0]); unsigned int nchunks = 0; - unsigned int i = 1; - while (i < ranges.size()) { + for (unsigned i = 1; i < ranges.size(); i++) { if (ranges[i].second > chunks[nchunks].second) { // else range included - ignore if (ranges[i].first > chunks[nchunks].second) { @@ -163,17 +162,16 @@ int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* sta chunks[nchunks].second = ranges[i].second; } } - i++; } // what do I need to read ? MPI_Offset totreads = 0; - for (i = 0; i < chunks.size(); i++) { - if (chunks[i].second < my_chunk_start) + for (auto const& chunk : chunks) { + if (chunk.second < my_chunk_start) continue; - else if (chunks[i].first > my_chunk_end) + else if (chunk.first > my_chunk_end) continue; else - totreads += (std::min(chunks[i].second, my_chunk_end - 1) - std::max(chunks[i].first, my_chunk_start)); + totreads += (std::min(chunk.second, my_chunk_end - 1) - std::max(chunk.first, my_chunk_start)); } XBT_CDEBUG(smpi_pmpi, "will have to access %lld from my chunk", totreads); @@ -183,24 +181,18 @@ int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* sta seek(min_offset, MPI_SEEK_SET); T(this, sendbuf, totreads / datatype->size(), datatype, status); } - simgrid::smpi::colls::alltoall(send_sizes, 1, MPI_INT, recv_sizes, 1, MPI_INT, comm_); + simgrid::smpi::colls::alltoall(send_sizes.data(), 1, MPI_INT, recv_sizes.data(), 1, MPI_INT, comm_); int total_recv = 0; for (int i = 0; i < size; i++) { recv_disps[i] = total_recv; total_recv += recv_sizes[i]; } // Set buf value to avoid copying dumb data - simgrid::smpi::colls::alltoallv(sendbuf, send_sizes, send_disps, MPI_BYTE, buf, recv_sizes, recv_disps, MPI_BYTE, - comm_); + simgrid::smpi::colls::alltoallv(sendbuf, send_sizes.data(), send_disps.data(), MPI_BYTE, buf, recv_sizes.data(), + recv_disps.data(), MPI_BYTE, comm_); if (status != MPI_STATUS_IGNORE) status->count = count * datatype->size(); smpi_free_tmp_buffer(sendbuf); - delete[] send_sizes; - delete[] recv_sizes; - delete[] send_disps; - delete[] recv_disps; - delete[] min_offsets; - delete[] max_offsets; return MPI_SUCCESS; } }