X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/2f3c9cf811c7c608eb49a3ee14411a887b6a99c8..4b90ce2abff77ca7898fd9292a122440df739916:/src/smpi/mpi/smpi_comm.cpp diff --git a/src/smpi/mpi/smpi_comm.cpp b/src/smpi/mpi/smpi_comm.cpp index d6ca527e3f..b72ab97504 100644 --- a/src/smpi/mpi/smpi_comm.cpp +++ b/src/smpi/mpi/smpi_comm.cpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2019. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2020. The SimGrid Team. All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it * under the terms of the license (GNU LGPL) which comes with this package. */ @@ -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; @@ -133,26 +125,26 @@ MPI_Group Comm::group() return group_; } -int Comm::size() +int Comm::size() const { if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->size(); return group_->size(); } -int Comm::rank() +int Comm::rank() const { if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->rank(); return group_->rank(s4u::Actor::self()); } -int Comm::id() +int Comm::id() const { return id_; } -void Comm::get_name (char* name, int* len) +void Comm::get_name(char* name, int* len) const { if (this == MPI_COMM_UNINITIALIZED){ smpi_process()->comm_world()->get_name(name, len); @@ -187,43 +179,50 @@ void Comm::set_leaders_comm(MPI_Comm leaders){ leaders_comm_=leaders; } -int* Comm::get_non_uniform_map(){ +int* Comm::get_non_uniform_map() const +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->get_non_uniform_map(); return non_uniform_map_; } -int* Comm::get_leaders_map(){ +int* Comm::get_leaders_map() const +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->get_leaders_map(); return leaders_map_; } -MPI_Comm Comm::get_leaders_comm(){ +MPI_Comm Comm::get_leaders_comm() const +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->get_leaders_comm(); return leaders_comm_; } -MPI_Comm Comm::get_intra_comm(){ +MPI_Comm Comm::get_intra_comm() const +{ if (this == MPI_COMM_UNINITIALIZED || this==MPI_COMM_WORLD) return smpi_process()->comm_intra(); else return intra_comm_; } -int Comm::is_uniform(){ +bool Comm::is_uniform() const +{ 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() const +{ 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() const +{ if (this == MPI_COMM_UNINITIALIZED) return smpi_process()->comm_world()->is_smp_comm(); return is_smp_comm_; @@ -302,7 +301,7 @@ MPI_Comm Comm::split(int color, int key) Request::recv(&group_out, 1, MPI_PTR, 0, system_tag, this, MPI_STATUS_IGNORE); } /* otherwise, exit with group_out == nullptr */ } - return group_out!=nullptr ? new Comm(group_out, nullptr) : MPI_COMM_NULL; + return group_out!=nullptr ? new Comm(group_out, topo_) : MPI_COMM_NULL; } void Comm::ref(){ @@ -336,7 +335,8 @@ void Comm::unref(Comm* comm){ comm->cleanup_attr(); if (comm->info_ != MPI_INFO_NULL) simgrid::smpi::Info::unref(comm->info_); - delete comm->topo_; // there's no use count on topos + if (comm->errhandler_ != MPI_ERRHANDLER_NULL) + simgrid::smpi::Errhandler::unref(comm->errhandler_); delete comm; } } @@ -364,7 +364,7 @@ MPI_Comm Comm::find_intra_comm(int * leader){ } } *leader=min_index; - return new Comm(group_intra, nullptr, 1); + return new Comm(group_intra, nullptr, true); } void Comm::init_smp(){ @@ -421,6 +421,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); @@ -430,7 +431,7 @@ void Comm::init_smp(){ //create leader_communicator for (i=0; i< leader_group_size;i++) leaders_group->set_mapping(s4u::Actor::by_pid(leader_list[i]).get(), i); - leader_comm = new Comm(leaders_group, nullptr,1); + leader_comm = new Comm(leaders_group, nullptr, true); this->set_leaders_comm(leader_comm); this->set_intra_comm(comm_intra); @@ -440,7 +441,7 @@ void Comm::init_smp(){ leaders_group->set_mapping(s4u::Actor::by_pid(leader_list[i]).get(), i); if(this->get_leaders_comm()==MPI_COMM_NULL){ - leader_comm = new Comm(leaders_group, nullptr,1); + leader_comm = new Comm(leaders_group, nullptr, true); this->set_leaders_comm(leader_comm); }else{ leader_comm=this->get_leaders_comm(); @@ -462,7 +463,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); @@ -557,17 +558,23 @@ void Comm::set_info(MPI_Info info) info->ref(); } -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){