A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[sonar] initialization lists and co.
[simgrid.git]
/
src
/
smpi
/
mpi
/
smpi_comm.cpp
diff --git
a/src/smpi/mpi/smpi_comm.cpp
b/src/smpi/mpi/smpi_comm.cpp
index
c404c1b
..
b9cee01
100644
(file)
--- a/
src/smpi/mpi/smpi_comm.cpp
+++ b/
src/smpi/mpi/smpi_comm.cpp
@@
-30,16
+30,10
@@
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, int 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;
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;
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;
//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;
@@
-48,10
+42,10
@@
Comm::Comm(MPI_Group group, MPI_Topology topo, int smp, int in_id) : group_(grou
id=global_id_;
global_id_++;
}
id=global_id_;
global_id_++;
}
-
C
olls::bcast(&id, 1, MPI_INT, 0, this);
+
c
olls::bcast(&id, 1, MPI_INT, 0, this);
XBT_DEBUG("Communicator %p has id %d", this, id);
id_=id;//only set here, as we don't want to change it in the middle of the bcast
XBT_DEBUG("Communicator %p has id %d", this, id);
id_=id;//only set here, as we don't want to change it in the middle of the bcast
-
C
olls::barrier(this);
+
c
olls::barrier(this);
}
}
}
}
@@
-61,12
+55,11
@@
void Comm::destroy(Comm* comm)
Comm::destroy(smpi_process()->comm_world());
return;
}
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){
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());
}
// we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(s4u::Actor::self());
}
@@
-121,6
+114,7
@@
int Comm::dup_with_info(MPI_Info info, MPI_Comm* newcomm){
(*newcomm)->info_=MPI_INFO_NULL;
}
if(info != MPI_INFO_NULL){
(*newcomm)->info_=MPI_INFO_NULL;
}
if(info != MPI_INFO_NULL){
+ info->ref();
(*newcomm)->info_=info;
}
return ret;
(*newcomm)->info_=info;
}
return ret;
@@
-250,7
+244,7
@@
MPI_Comm Comm::split(int color, int key)
} else {
recvbuf = nullptr;
}
} else {
recvbuf = nullptr;
}
-
Coll_gather_default::gather
(sendbuf, 2, MPI_INT, recvbuf, 2, MPI_INT, 0, this);
+
gather__default
(sendbuf, 2, MPI_INT, recvbuf, 2, MPI_INT, 0, this);
xbt_free(sendbuf);
/* Do the actual job */
if (myrank == 0) {
xbt_free(sendbuf);
/* Do the actual job */
if (myrank == 0) {
@@
-334,16
+328,21
@@
void Comm::unref(Comm* comm){
if(comm->refcount_==0){
comm->cleanup_smp();
comm->cleanup_attr<Comm>();
if(comm->refcount_==0){
comm->cleanup_smp();
comm->cleanup_attr<Comm>();
+ 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;
}
}
MPI_Comm Comm::find_intra_comm(int * leader){
//get the indices of all processes sharing the same simix host
delete comm;
}
}
MPI_Comm Comm::find_intra_comm(int * leader){
//get the indices of all processes sharing the same simix host
- auto&
process_list = sg_host_self()->pimpl_->process
_list_;
+ auto&
actor_list = sg_host_self()->pimpl_->actor
_list_;
int intra_comm_size = 0;
int min_index = INT_MAX; // the minimum index will be the leader
int intra_comm_size = 0;
int min_index = INT_MAX; // the minimum index will be the leader
- for (auto& actor :
process
_list) {
+ for (auto& actor :
actor
_list) {
int index = actor.get_pid();
if (this->group()->rank(actor.ciface()) != MPI_UNDEFINED) { // Is this process in the current group?
intra_comm_size++;
int index = actor.get_pid();
if (this->group()->rank(actor.ciface()) != MPI_UNDEFINED) { // Is this process in the current group?
intra_comm_size++;
@@
-354,7
+353,7
@@
MPI_Comm Comm::find_intra_comm(int * leader){
XBT_DEBUG("number of processes deployed on my node : %d", intra_comm_size);
MPI_Group group_intra = new Group(intra_comm_size);
int i = 0;
XBT_DEBUG("number of processes deployed on my node : %d", intra_comm_size);
MPI_Group group_intra = new Group(intra_comm_size);
int i = 0;
- for (auto& actor :
process
_list) {
+ for (auto& actor :
actor
_list) {
if (this->group()->rank(actor.ciface()) != MPI_UNDEFINED) {
group_intra->set_mapping(actor.ciface(), i);
i++;
if (this->group()->rank(actor.ciface()) != MPI_UNDEFINED) {
group_intra->set_mapping(actor.ciface(), i);
i++;
@@
-380,7
+379,7
@@
void Comm::init_smp(){
smpi_process()->set_replaying(false);
}
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());
}
// we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(s4u::Actor::self());
}
@@
-393,9
+392,9
@@
void Comm::init_smp(){
std::fill_n(leaders_map, comm_size, 0);
std::fill_n(leader_list, comm_size, -1);
std::fill_n(leaders_map, comm_size, 0);
std::fill_n(leader_list, comm_size, -1);
-
Coll_allgather_ring::allgather
(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this);
+
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());
}
// we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(s4u::Actor::self());
}
@@
-418,6
+417,7
@@
void Comm::init_smp(){
leader_group_size++;
}
}
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);
std::sort(leader_list, leader_list + leader_group_size);
MPI_Group leaders_group = new Group(leader_group_size);
@@
-451,7
+451,7
@@
void Comm::init_smp(){
if(comm_intra->rank()==0) {
int is_uniform = 1;
int* non_uniform_map = xbt_new0(int,leader_group_size);
if(comm_intra->rank()==0) {
int is_uniform = 1;
int* non_uniform_map = xbt_new0(int,leader_group_size);
-
Coll_allgather_ring::allgather
(&my_local_size, 1, MPI_INT,
+
allgather__ring
(&my_local_size, 1, MPI_INT,
non_uniform_map, 1, MPI_INT, leader_comm);
for(i=0; i < leader_group_size; i++) {
if(non_uniform_map[0] != non_uniform_map[i]) {
non_uniform_map, 1, MPI_INT, leader_comm);
for(i=0; i < leader_group_size; i++) {
if(non_uniform_map[0] != non_uniform_map[i]) {
@@
-466,9
+466,9
@@
void Comm::init_smp(){
}
is_uniform_=is_uniform;
}
}
is_uniform_=is_uniform;
}
-
Coll_bcast_scatter_LR_allgather::bcast
(&(is_uniform_),1, MPI_INT, 0, comm_intra );
+
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());
}
// we need to switch as the called function may silently touch global variables
smpi_switch_data_segment(s4u::Actor::self());
}
@@
-485,7
+485,7
@@
void Comm::init_smp(){
}
int global_blocked;
}
int global_blocked;
-
Coll_allreduce_default::allreduce
(&is_blocked, &(global_blocked), 1, MPI_INT, MPI_LAND, this);
+
allreduce__default
(&is_blocked, &(global_blocked), 1, MPI_INT, MPI_LAND, this);
if(MPI_COMM_WORLD==MPI_COMM_UNINITIALIZED || this==MPI_COMM_WORLD){
if(this->rank()==0){
if(MPI_COMM_WORLD==MPI_COMM_UNINITIALIZED || this==MPI_COMM_WORLD){
if(this->rank()==0){
@@
-537,27
+537,37
@@
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_;
}
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->ref();
- info_=info;
}
}
-MPI_Errhandler Comm::errhandler(){
+MPI_Errhandler Comm::errhandler()
+{
+ if (errhandler_ != MPI_ERRHANDLER_NULL)
+ errhandler_->ref();
return errhandler_;
}
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*/, MPI_Info)
@@
-571,6
+581,7
@@
MPI_Comm Comm::split_type(int type, int /*key*/, MPI_Info)
if(type != MPI_UNDEFINED)
return res;
else{
if(type != MPI_UNDEFINED)
return res;
else{
+ xbt_assert(res->refcount_ == 1); // ensure the next call to Comm::destroy really frees the comm
Comm::destroy(res);
return MPI_COMM_NULL;
}
Comm::destroy(res);
return MPI_COMM_NULL;
}