X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/0b63f78dc217b79305cef05bd2200069d3e24475..4bfa8a32e0083bcd28a78689625c4806c2fbbf46:/src/smpi/mpi/smpi_comm.cpp diff --git a/src/smpi/mpi/smpi_comm.cpp b/src/smpi/mpi/smpi_comm.cpp index 4652d05c70..8eb30b58c8 100644 --- a/src/smpi/mpi/smpi_comm.cpp +++ b/src/smpi/mpi/smpi_comm.cpp @@ -1,21 +1,17 @@ -/* Copyright (c) 2010-2017. The SimGrid Team. All rights reserved. */ +/* Copyright (c) 2010-2018. 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. */ #include "smpi_comm.hpp" -#include "private.hpp" -#include "simgrid/s4u/Host.hpp" #include "smpi_coll.hpp" #include "smpi_datatype.hpp" #include "smpi_process.hpp" #include "smpi_request.hpp" -#include "smpi_status.hpp" #include "smpi_win.hpp" -#include "src/simix/smx_private.hpp" -#include +#include "src/surf/HostImpl.hpp" + #include -#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_comm, smpi, "Logging specific to SMPI (comm)"); @@ -56,8 +52,9 @@ void Comm::destroy(Comm* comm) } int Comm::dup(MPI_Comm* newcomm){ - if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables - smpi_switch_data_segment(simgrid::s4u::Actor::self()->getPid()); + if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + // we need to switch as the called function may silently touch global variables + smpi_switch_data_segment(simgrid::s4u::Actor::self()); } MPI_Group cp = new Group(this->group()); (*newcomm) = new Comm(cp, this->topo()); @@ -117,7 +114,7 @@ void Comm::get_name (char* name, int* len) return; } if(this == MPI_COMM_WORLD) { - strncpy(name, "WORLD",5); + strncpy(name, "WORLD", 6); *len = 5; } else { *len = snprintf(name, MPI_MAX_NAME_STRING, "%p", this); @@ -262,10 +259,8 @@ void Comm::cleanup_smp(){ Comm::unref(intra_comm_); if (leaders_comm_ != MPI_COMM_NULL) Comm::unref(leaders_comm_); - if (non_uniform_map_ != nullptr) - xbt_free(non_uniform_map_); - if (leaders_map_ != nullptr) - delete[] leaders_map_; + xbt_free(non_uniform_map_); + delete[] leaders_map_; } void Comm::unref(Comm* comm){ @@ -299,16 +294,17 @@ void Comm::init_smp(){ smpi_process()->set_replaying(false); } - if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables - smpi_switch_data_segment(simgrid::s4u::Actor::self()->getPid()); + if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + // we need to switch as the called function may silently touch global variables + smpi_switch_data_segment(simgrid::s4u::Actor::self()); } //identify neighbours in comm //get the indices of all processes sharing the same simix host - auto& process_list = sg_host_self()->extension()->process_list; + auto& process_list = sg_host_self()->pimpl_->process_list_; int intra_comm_size = 0; int min_index = INT_MAX; // the minimum index will be the leader for (auto& actor : process_list) { - int index = actor.pid; + int index = actor.pid_; if (this->group()->rank(actor.iface()) != MPI_UNDEFINED) { // Is this process in the current group? intra_comm_size++; if (index < min_index) @@ -335,8 +331,9 @@ void Comm::init_smp(){ Coll_allgather_mpich::allgather(&leader, 1, MPI_INT , leaders_map, 1, MPI_INT, this); - if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables - smpi_switch_data_segment(simgrid::s4u::Actor::self()->getPid()); + if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + // we need to switch as the called function may silently touch global variables + smpi_switch_data_segment(simgrid::s4u::Actor::self()); } if(leaders_map_==nullptr){ @@ -365,7 +362,7 @@ void Comm::init_smp(){ if(MPI_COMM_WORLD!=MPI_COMM_UNINITIALIZED && this!=MPI_COMM_WORLD){ //create leader_communicator for (i=0; i< leader_group_size;i++) - leaders_group->set_mapping(simgrid::s4u::Actor::byPid(leader_list[i]), i); + leaders_group->set_mapping(simgrid::s4u::Actor::by_pid(leader_list[i]), i); leader_comm = new Comm(leaders_group, nullptr); this->set_leaders_comm(leader_comm); this->set_intra_comm(comm_intra); @@ -373,7 +370,7 @@ void Comm::init_smp(){ // create intracommunicator }else{ for (i=0; i< leader_group_size;i++) - leaders_group->set_mapping(simgrid::s4u::Actor::byPid(leader_list[i]), i); + leaders_group->set_mapping(simgrid::s4u::Actor::by_pid(leader_list[i]), i); if(this->get_leaders_comm()==MPI_COMM_NULL){ leader_comm = new Comm(leaders_group, nullptr); @@ -407,8 +404,9 @@ void Comm::init_smp(){ } Coll_bcast_mpich::bcast(&(is_uniform_),1, MPI_INT, 0, comm_intra ); - if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ //we need to switch as the called function may silently touch global variables - smpi_switch_data_segment(simgrid::s4u::Actor::self()->getPid()); + if (smpi_privatize_global_variables == SmpiPrivStrategies::MMAP) { + // we need to switch as the called function may silently touch global variables + smpi_switch_data_segment(simgrid::s4u::Actor::self()); } // Are the ranks blocked ? = allocated contiguously on the SMP nodes int is_blocked=1; @@ -485,6 +483,17 @@ void Comm::finish_rma_calls(){ } } +MPI_Comm Comm::split_type(int type, int key, MPI_Info info) +{ + if(type != MPI_COMM_TYPE_SHARED){ + return MPI_COMM_NULL; + } + this->init_smp(); + this->ref(); + this->get_intra_comm()->ref(); + return this->get_intra_comm(); +} + } }