From: Christian Heinrich Date: Thu, 11 Jan 2018 23:17:43 +0000 (+0100) Subject: [SMPI] Move process_data to map X-Git-Tag: v3.19~312^2~48 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/f685334597e6b8bcdfe353d69be908914eed4dd6?ds=inline [SMPI] Move process_data to map --- diff --git a/src/smpi/include/private.hpp b/src/smpi/include/private.hpp index ade674e6fb..2112269d7b 100644 --- a/src/smpi/include/private.hpp +++ b/src/smpi/include/private.hpp @@ -62,7 +62,7 @@ typedef SMPI_Graph_topology* MPIR_Graph_Topology; typedef SMPI_Dist_Graph_topology* MPIR_Dist_Graph_Topology; XBT_PRIVATE SMPI_Process* smpi_process(); -XBT_PRIVATE SMPI_Process* smpi_process_remote(int index); +XBT_PRIVATE SMPI_Process* smpi_process_remote(simgrid::s4u::ActorPtr actor); XBT_PRIVATE int smpi_process_count(); XBT_PRIVATE void smpi_deployment_register_process(const char* instance_id, int rank, int index); diff --git a/src/smpi/internals/smpi_global.cpp b/src/smpi/internals/smpi_global.cpp index 70dc1e3406..fa1605beb0 100644 --- a/src/smpi/internals/smpi_global.cpp +++ b/src/smpi/internals/smpi_global.cpp @@ -8,6 +8,7 @@ #include "private.hpp" #include "simgrid/s4u/Host.hpp" #include "simgrid/s4u/Mailbox.hpp" +#include "simgrid/s4u/forward.hpp" #include "smpi_coll.hpp" #include "smpi_comm.hpp" #include "smpi_group.hpp" @@ -54,7 +55,7 @@ using simgrid::s4u::Actor; using simgrid::s4u::ActorPtr; std::unordered_map location2speedup; -static std::map process_data; +static std::map process_data; int process_count = 0; int smpi_universe_size = 0; extern double smpi_total_benched_time; @@ -85,8 +86,8 @@ void (*smpi_comm_copy_data_callback) (smx_activity_t, void*, size_t) = &smpi_com void smpi_add_process(ActorPtr actor) { - process_data.insert( - {actor->getPid()-1, new simgrid::smpi::Process(actor, nullptr)}); + process_data.insert({actor, new simgrid::smpi::Process(actor, nullptr)}); + // smpi_deployment_register_process("master_mpi", 0, actor); } int smpi_process_count() @@ -103,9 +104,9 @@ simgrid::smpi::Process* smpi_process() return static_cast(msgExt->data); } -simgrid::smpi::Process* smpi_process_remote(int index) +simgrid::smpi::Process* smpi_process_remote(ActorPtr actor) { - return process_data.at(index); + return process_data.at(actor); } MPI_Comm smpi_process_comm_self(){ @@ -481,6 +482,9 @@ int smpi_main(const char* executable, int argc, char *argv[]) SMPI_switch_data_segment = &smpi_switch_data_segment; + // TODO This will not be executed in the case where smpi_main is not called, + // e.g., not for smpi_msg_masterslave. This should be moved to another location + // that is always called -- maybe close to Actor::onCreation? simgrid::s4u::Host::onCreation.connect([](simgrid::s4u::Host& host) { host.extension_set(new simgrid::smpi::SmpiHost(&host)); }); @@ -490,7 +494,6 @@ int smpi_main(const char* executable, int argc, char *argv[]) SIMIX_comm_set_copy_data_callback(smpi_comm_copy_buffer_callback); smpi_init_options(); - if (smpi_privatize_global_variables == SMPI_PRIVATIZE_DLOPEN) { std::string executable_copy = executable; @@ -611,9 +614,10 @@ int smpi_main(const char* executable, int argc, char *argv[]) } } int ret = 0; - for (int i = 0, count = smpi_process_count(); i < count; i++) { - if (process_data.at(i)->return_value() != 0) { - ret = process_data.at(i)->return_value(); // return first non 0 value + for (auto& pair : process_data) { + auto& smpi_process = pair.second; + if (smpi_process->return_value() != 0) { + ret = smpi_process->return_value(); // return first non 0 value break; } } diff --git a/src/smpi/internals/smpi_memory.cpp b/src/smpi/internals/smpi_memory.cpp index 62bac67f99..3556def61b 100644 --- a/src/smpi/internals/smpi_memory.cpp +++ b/src/smpi/internals/smpi_memory.cpp @@ -117,7 +117,7 @@ void smpi_really_switch_data_segment(int dest) #if HAVE_PRIVATIZATION // FIXME, cross-process support (mmap across process when necessary) - simgrid::smpi::Process* process = smpi_process_remote(dest); + simgrid::smpi::Process* process = smpi_process_remote(simgrid::s4u::Actor::byPid(dest+1)); int current = process->privatized_region()->file_descriptor; XBT_DEBUG("Switching data frame to the one of process %d", dest); void* tmp = diff --git a/src/smpi/internals/smpi_process.cpp b/src/smpi/internals/smpi_process.cpp index 184b4e664b..d5ff121741 100644 --- a/src/smpi/internals/smpi_process.cpp +++ b/src/smpi/internals/smpi_process.cpp @@ -6,6 +6,7 @@ #include "smpi_process.hpp" #include "mc/mc.h" #include "private.hpp" +#include "simgrid/s4u/forward.hpp" #include "smpi_comm.hpp" #include "smpi_group.hpp" #include "src/mc/mc_replay.hpp" @@ -289,7 +290,7 @@ void Process::init(int *argc, char ***argv){ // cheinrich: I'm not sure what the impact of the SMPI_switch_data_segment on this call is. I moved // this up here so that I can set the privatized region before the switch. - Process* process = smpi_process_remote(index); + Process* process = smpi_process_remote(proc); if(smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP){ /* Now using the segment index of this process */ index = proc->getImpl()->segment_index; diff --git a/src/smpi/mpi/smpi_request.cpp b/src/smpi/mpi/smpi_request.cpp index e0f5aed182..0f31243fb5 100644 --- a/src/smpi/mpi/smpi_request.cpp +++ b/src/smpi/mpi/smpi_request.cpp @@ -333,7 +333,7 @@ void Request::start() if ((flags_ & RECV) != 0) { this->print_request("New recv"); - simgrid::smpi::Process* process = smpi_process_remote(dst_); + simgrid::smpi::Process* process = smpi_process_remote(simgrid::s4u::Actor::byPid(dst_+1)); int async_small_thresh = xbt_cfg_get_int("smpi/async-small-thresh"); @@ -385,7 +385,7 @@ void Request::start() if (async_small_thresh != 0 || (flags_ & RMA) != 0 ) xbt_mutex_release(mut); } else { /* the RECV flag was not set, so this is a send */ - simgrid::smpi::Process* process = smpi_process_remote(dst_); + simgrid::smpi::Process* process = smpi_process_remote(simgrid::s4u::Actor::byPid(dst_+1)); int rank = src_; if (TRACE_smpi_view_internals()) { TRACE_smpi_send(rank, rank, dst_, tag_, size_);