- /* Read_all, Write_all : loosely based on */
- /* @article{Thakur:1996:ETM:245875.245879,*/
- /* author = {Thakur, Rajeev and Choudhary, Alok},*/
- /* title = {An Extended Two-phase Method for Accessing Sections of Out-of-core Arrays},*/
- /* journal = {Sci. Program.},*/
- /* issue_date = {Winter 1996},*/
- /* pages = {301--317},*/
- /* }*/
- template <int (*T)(MPI_File, void*, int, const Datatype*, MPI_Status*)>
- int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* status)
- {
- //get min and max offsets from everyone.
- int size = comm_->size();
- int rank = comm_-> rank();
- MPI_Offset min_offset = file_->tell();
- 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_);
- MPI_Offset min=min_offset;
- MPI_Offset max=max_offset;
- MPI_Offset tot= 0;
- int empty=1;
- for(int i=0;i<size;i++){
- if(min_offsets[i]!=max_offsets[i])
- empty=0;
- tot+=(max_offsets[i]-min_offsets[i]);
- if(min_offsets[i]<min)
- min=min_offsets[i];
- if(max_offsets[i]>max)
- max=max_offsets[i];
- }
-
- 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;
- 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();
- return T(this,buf,count,datatype, status);
- }
+/* Read_all, Write_all : loosely based on */
+/* @article{Thakur:1996:ETM:245875.245879,*/
+/* author = {Thakur, Rajeev and Choudhary, Alok},*/
+/* title = {An Extended Two-phase Method for Accessing Sections of Out-of-core Arrays},*/
+/* journal = {Sci. Program.},*/
+/* issue_date = {Winter 1996},*/
+/* pages = {301--317},*/
+/* }*/
+template <int (*T)(MPI_File, void*, int, const Datatype*, MPI_Status*)>
+int File::op_all(void* buf, int count, const Datatype* datatype, MPI_Status* status)
+{
+ // get min and max offsets from everyone.
+ int size = comm_->size();
+ int rank = comm_->rank();
+ MPI_Offset min_offset = file_->tell();
+ MPI_Offset max_offset =
+ min_offset +
+ count * datatype->get_extent(); // cheating, as we don't care about exact data location, we can skip extent
+ std::vector<MPI_Offset> min_offsets(size);
+ std::vector<MPI_Offset> 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;
+ int empty = 1;
+ for (int i = 0; i < size; i++) {
+ if (min_offsets[i] != max_offsets[i])
+ empty = 0;
+ tot += (max_offsets[i] - min_offsets[i]);
+ if (min_offsets[i] < min)
+ min = min_offsets[i];
+ if (max_offsets[i] > max)
+ max = max_offsets[i];
+ }