X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/efa1f86e31adca3c57e9d0135b2f6ebdbabb0878..7cd237f9659b2df47fca65a4340ca7b5407f46a0:/src/smpi/mpi/smpi_comm.cpp diff --git a/src/smpi/mpi/smpi_comm.cpp b/src/smpi/mpi/smpi_comm.cpp index 3507333c9c..c35d2f1c21 100644 --- a/src/smpi/mpi/smpi_comm.cpp +++ b/src/smpi/mpi/smpi_comm.cpp @@ -28,18 +28,10 @@ namespace smpi{ std::unordered_map Comm::keyvals_; int Comm::keyval_id_=0; -Comm::Comm(MPI_Group group, MPI_Topology topo, int smp, int in_id) : group_(group), topo_(topo),is_smp_comm_(smp), id_(in_id) +Comm::Comm(MPI_Group group, MPI_Topology topo, bool smp, int in_id) + : group_(group), topo_(topo), is_smp_comm_(smp), id_(in_id) { - refcount_ = 1; - topoType_ = MPI_INVALID_TOPO; - intra_comm_ = MPI_COMM_NULL; - leaders_comm_ = MPI_COMM_NULL; - is_uniform_ = 1; - non_uniform_map_ = nullptr; - leaders_map_ = nullptr; - is_blocked_ = 0; - info_ = MPI_INFO_NULL; - errhandler_ = MPI_ERRORS_ARE_FATAL; + errhandler_->ref(); //First creation of comm is done before SIMIX_run, so only do comms for others if(in_id==MPI_UNDEFINED && smp==0 && this->rank()!=MPI_UNDEFINED ){ int id; @@ -61,12 +53,11 @@ void Comm::destroy(Comm* comm) Comm::destroy(smpi_process()->comm_world()); return; } - delete comm->topo_; // there's no use count on topos Comm::unref(comm); } int Comm::dup(MPI_Comm* newcomm){ - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -121,6 +112,7 @@ int Comm::dup_with_info(MPI_Info info, MPI_Comm* newcomm){ (*newcomm)->info_=MPI_INFO_NULL; } if(info != MPI_INFO_NULL){ + info->ref(); (*newcomm)->info_=info; } return ret; @@ -211,19 +203,22 @@ MPI_Comm Comm::get_intra_comm(){ else return intra_comm_; } -int Comm::is_uniform(){ +bool Comm::is_uniform() +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->is_uniform(); - return is_uniform_; + return is_uniform_ != 0; } -int Comm::is_blocked(){ +bool Comm::is_blocked() +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->is_blocked(); - return is_blocked_; + return is_blocked_ != 0; } -int Comm::is_smp_comm(){ +bool Comm::is_smp_comm() +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->is_smp_comm(); return is_smp_comm_; @@ -334,6 +329,11 @@ void Comm::unref(Comm* comm){ if(comm->refcount_==0){ comm->cleanup_smp(); comm->cleanup_attr(); + if (comm->info_ != MPI_INFO_NULL) + simgrid::smpi::Info::unref(comm->info_); + if (comm->errhandler_ != MPI_ERRHANDLER_NULL) + simgrid::smpi::Errhandler::unref(comm->errhandler_); + delete comm->topo_; // there's no use count on topos delete comm; } } @@ -380,7 +380,7 @@ void Comm::init_smp(){ smpi_process()->set_replaying(false); } - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -395,7 +395,7 @@ void Comm::init_smp(){ allgather__ring(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this); - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -418,6 +418,7 @@ void Comm::init_smp(){ leader_group_size++; } } + xbt_assert(leader_group_size > 0); std::sort(leader_list, leader_list + leader_group_size); MPI_Group leaders_group = new Group(leader_group_size); @@ -459,7 +460,7 @@ void Comm::init_smp(){ break; } } - if(is_uniform==0 && this->is_uniform()!=0){ + if (is_uniform == 0 && this->is_uniform()) { non_uniform_map_ = non_uniform_map; }else{ xbt_free(non_uniform_map); @@ -468,7 +469,7 @@ void Comm::init_smp(){ } bcast__scatter_LR_allgather(&(is_uniform_),1, MPI_INT, 0, comm_intra ); - if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + if (smpi_cfg_privatization() == SmpiPrivStrategies::MMAP) { // we need to switch as the called function may silently touch global variables smpi_switch_data_segment(s4u::Actor::self()); } @@ -537,30 +538,40 @@ void Comm::finish_rma_calls(){ } } -MPI_Info Comm::info(){ - if(info_== MPI_INFO_NULL) +MPI_Info Comm::info() +{ + if (info_ == MPI_INFO_NULL) info_ = new Info(); info_->ref(); return info_; } -void Comm::set_info(MPI_Info info){ - if(info_!= MPI_INFO_NULL) +void Comm::set_info(MPI_Info info) +{ + if (info_ != MPI_INFO_NULL) + simgrid::smpi::Info::unref(info); + info_ = info; + if (info_ != MPI_INFO_NULL) info->ref(); - info_=info; } -MPI_Errhandler Comm::errhandler(){ +MPI_Errhandler Comm::errhandler() +{ + if (errhandler_ != MPI_ERRHANDLER_NULL) + errhandler_->ref(); return errhandler_; } -void Comm::set_errhandler(MPI_Errhandler errhandler){ - errhandler_=errhandler; - if(errhandler_!= MPI_ERRHANDLER_NULL) - errhandler->ref(); +void Comm::set_errhandler(MPI_Errhandler errhandler) +{ + if (errhandler_ != MPI_ERRHANDLER_NULL) + simgrid::smpi::Errhandler::unref(errhandler_); + errhandler_ = errhandler; + if (errhandler_ != MPI_ERRHANDLER_NULL) + errhandler_->ref(); } -MPI_Comm Comm::split_type(int type, int /*key*/, MPI_Info) +MPI_Comm Comm::split_type(int type, int /*key*/, const Info*) { //MPI_UNDEFINED can be given to some nodes... but we need them to still perform the smp part which is collective if(type != MPI_COMM_TYPE_SHARED && type != MPI_UNDEFINED){