bar_ = new s4u::Barrier(comm_size);
}
mode_=0;
-
+ errhandler_=MPI_ERRORS_ARE_FATAL;
comm->add_rma_win(this);
comm->ref();
- Colls::allgather(&(connected_wins_[rank_]), sizeof(MPI_Win), MPI_BYTE, connected_wins_, sizeof(MPI_Win),
- MPI_BYTE, comm);
+ colls::allgather(&(connected_wins_[rank_]), sizeof(MPI_Win), MPI_BYTE, connected_wins_, sizeof(MPI_Win), MPI_BYTE,
+ comm);
- Colls::bcast(&(bar_), sizeof(s4u::Barrier*), MPI_BYTE, 0, comm);
+ colls::bcast(&(bar_), sizeof(s4u::Barrier*), MPI_BYTE, 0, comm);
- Colls::barrier(comm);
+ colls::barrier(comm);
}
Win::~Win(){
comm_->remove_rma_win(this);
- Colls::barrier(comm_);
+ colls::barrier(comm_);
Comm::unref(comm_);
if (rank_ == 0)
return MPI_SUCCESS;
}
-int Win::detach(void* /*base*/)
+int Win::detach(const void* /*base*/)
{
base_=MPI_BOTTOM;
size_=-1;
info_=info;
}
-void Win::set_name(char* name){
+void Win::set_name(const char* name){
name_ = xbt_strdup(name);
}
bar_->wait();
mut_->lock();
// This (simulated) mutex ensures that no process pushes to the vector of requests during the waitall.
- // Without this, the vector could get redimensionned when another process pushes.
+ // Without this, the vector could get redimensioned when another process pushes.
// This would result in the array used by Request::waitall() to be invalidated.
// Another solution would be to copy the data and cleanup the vector *before* Request::waitall
std::vector<MPI_Request> *reqs = requests_;
return MPI_SUCCESS;
}
-int Win::put( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+int Win::put(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Request* request)
{
//get receiver pointer
}
-int Win::accumulate( void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
+int Win::accumulate(const void *origin_addr, int origin_count, MPI_Datatype origin_datatype, int target_rank,
MPI_Aint target_disp, int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Request* request)
{
XBT_DEBUG("Entering MPI_Win_Accumulate");
void* recv_addr = static_cast<void*>(static_cast<char*>(recv_win->base_) + target_disp * recv_win->disp_unit_);
XBT_DEBUG("Entering MPI_Accumulate to %d", target_rank);
- //As the tag will be used for ordering of the operations, substract count from it (to avoid collisions with other SMPI tags, SMPI_RMA_TAG is set below all the other ones we use )
- //prepare send_request
+ // As the tag will be used for ordering of the operations, subtract count from it (to avoid collisions with other
+ // SMPI tags, SMPI_RMA_TAG is set below all the other ones we use)
+ // prepare send_request
MPI_Request sreq = Request::rma_send_init(origin_addr, origin_count, origin_datatype, comm_->rank(), target_rank,
SMPI_RMA_TAG - 3 - count_, comm_, op);
return MPI_SUCCESS;
}
-int Win::get_accumulate(void* origin_addr, int origin_count, MPI_Datatype origin_datatype, void* result_addr,
+int Win::get_accumulate(const void* origin_addr, int origin_count, MPI_Datatype origin_datatype, void* result_addr,
int result_count, MPI_Datatype result_datatype, int target_rank, MPI_Aint target_disp,
int target_count, MPI_Datatype target_datatype, MPI_Op op, MPI_Request*)
{
}
-int Win::compare_and_swap(void *origin_addr, void *compare_addr,
+int Win::compare_and_swap(const void *origin_addr, void *compare_addr,
void *result_addr, MPI_Datatype datatype, int target_rank,
MPI_Aint target_disp){
//get sender pointer
}
return MPI_SUCCESS;
}
+
+MPI_Errhandler Win::errhandler(){
+ return errhandler_;
+}
+
+void Win::set_errhandler(MPI_Errhandler errhandler){
+ errhandler_=errhandler;
+ if(errhandler_!= MPI_ERRHANDLER_NULL)
+ errhandler->ref();
+}
+
}
}