Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[SMPI] Add several functions for the LB stuff.
[simgrid.git] / src / smpi / internals / instr_smpi.cpp
index 1ce8ac6..b267dbb 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010, 2012-2018. The SimGrid Team.
+/* Copyright (c) 2010-2018. The SimGrid Team.
  * All rights reserved.                                                     */
 
 /* This program is free software; you can redistribute it and/or modify it
 
 #include "private.hpp"
 #include <boost/algorithm/string.hpp>
+#include <simgrid/s4u/Actor.hpp>
 #include <cctype>
 #include <cstdarg>
 #include <cwchar>
 #include <deque>
 #include <simgrid/sg_config.hpp>
+#include <simgrid/s4u/Host.hpp>
 #include <string>
+#include <vector>
 
 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_smpi, instr, "Tracing SMPI");
 
 static std::unordered_map<std::string, std::deque<std::string>*> keys;
 
-static const char* smpi_colors[] = {
-    "recv",      "1 0 0",       "irecv",         "1 0.52 0.52",    "send",       "0 0 1",
-    "isend",     "0.52 0.52 1", "sendrecv",      "0 1 1",          "wait",       "1 1 0",
-    "waitall",   "0.78 0.78 0", "waitany",       "0.78 0.78 0.58", "test",       "0.52 0.52 0",
-
-    "allgather", "1 0 0",       "allgatherv",    "1 0.52 0.52",    "allreduce",  "1 0 1",
-    "alltoall",  "0.52 0 1",    "alltoallv",     "0.78 0.52 1",    "barrier",    "0 0.78 0.78",
-    "bcast",     "0 0.78 0.39", "gather",        "1 1 0",          "gatherv",    "1 1 0.52",
-    "reduce",    "0 1 0",       "reducescatter", "0.52 1 0.52",    "scan",       "1 0.58 0.23",
-    "exscan",    "1 0.54 0.25", "scatterv",      "0.52 0 0.52",    "scatter",    "1 0.74 0.54",
-
-    "computing", "0 1 1",       "sleeping",      "0 0.5 0.5",
-
-    "init",      "0 1 0",       "finalize",      "0 1 0",
-
-    "put",       "0.3 1 0",     "get",           "0 1 0.3",        "accumulate", "1 0.3 0",
-    "rput",       "0.3 1 0",     "rget",           "0 1 0.3",        "raccumulate", "1 0.3 0",
-    "compare_and_swap",       "0.3 1 0",     "get_accumulate",           "0 1 0.3",        "rget_accumulate", "1 0.3 0",
-    "win_fence", "1 0 0.3",     "win_post",      "1 0 0.8",        "win_wait",   "1 0.8 0",
-    "win_start", "0.8 0 1",     "win_complete",  "0.8 1 0",        "win_lock", "1 0 0.3",     
-    "win_unlock", "1 0 0.3",     "win_lock_all",      "1 0 0.8",        "win_unlock_all",   "1 0.8 0",
-    "win_flush", "1 0 0.3",     "win_flush_local",      "1 0 0.8",        "win_flush_all",   "1 0.8 0",
-    "win_flush_local_all", "1 0 0.3", ""  , ""
-};
+static const char* smpi_colors[] = {"recv",
+                                    "1 0 0",
+                                    "irecv",
+                                    "1 0.52 0.52",
+                                    "send",
+                                    "0 0 1",
+                                    "isend",
+                                    "0.52 0.52 1",
+                                    "sendrecv",
+                                    "0 1 1",
+                                    "wait",
+                                    "1 1 0",
+                                    "waitall",
+                                    "0.78 0.78 0",
+                                    "waitany",
+                                    "0.78 0.78 0.58",
+                                    "test",
+                                    "0.52 0.52 0",
+
+                                    "allgather",
+                                    "1 0 0",
+                                    "allgatherv",
+                                    "1 0.52 0.52",
+                                    "allreduce",
+                                    "1 0 1",
+                                    "alltoall",
+                                    "0.52 0 1",
+                                    "alltoallv",
+                                    "0.78 0.52 1",
+                                    "barrier",
+                                    "0 0.78 0.78",
+                                    "bcast",
+                                    "0 0.78 0.39",
+                                    "gather",
+                                    "1 1 0",
+                                    "gatherv",
+                                    "1 1 0.52",
+                                    "reduce",
+                                    "0 1 0",
+                                    "reducescatter",
+                                    "0.52 1 0.52",
+                                    "scan",
+                                    "1 0.58 0.23",
+                                    "exscan",
+                                    "1 0.54 0.25",
+                                    "scatterv",
+                                    "0.52 0 0.52",
+                                    "scatter",
+                                    "1 0.74 0.54",
+
+                                    "computing",
+                                    "0 1 1",
+                                    "sleeping",
+                                    "0 0.5 0.5",
+
+                                    "init",
+                                    "0 1 0",
+                                    "finalize",
+                                    "0 1 0",
+
+                                    "put",
+                                    "0.3 1 0",
+                                    "get",
+                                    "0 1 0.3",
+                                    "accumulate",
+                                    "1 0.3 0",
+                                    "migration",
+                                    "0.2 0.5 0.2",
+                                    "rput",
+                                    "0.3 1 0",
+                                    "rget",
+                                    "0 1 0.3",
+                                    "raccumulate",
+                                    "1 0.3 0",
+                                    "compare_and_swap",
+                                    "0.3 1 0",
+                                    "get_accumulate",
+                                    "0 1 0.3",
+                                    "rget_accumulate",
+                                    "1 0.3 0",
+                                    "win_fence",
+                                    "1 0 0.3",
+                                    "win_post",
+                                    "1 0 0.8",
+                                    "win_wait",
+                                    "1 0.8 0",
+                                    "win_start",
+                                    "0.8 0 1",
+                                    "win_complete",
+                                    "0.8 1 0",
+                                    "win_lock",
+                                    "1 0 0.3",
+                                    "win_unlock",
+                                    "1 0 0.3",
+                                    "win_lock_all",
+                                    "1 0 0.8",
+                                    "win_unlock_all",
+                                    "1 0.8 0",
+                                    "win_flush",
+                                    "1 0 0.3",
+                                    "win_flush_local",
+                                    "1 0 0.8",
+                                    "win_flush_all",
+                                    "1 0.8 0",
+                                    "win_flush_local_all",
+                                    "1 0 0.3",
+                                    "",
+                                    ""};
 
 static const char* instr_find_color(const char* state)
 {
@@ -61,9 +148,14 @@ static const char* instr_find_color(const char* state)
   return ret;
 }
 
+XBT_PRIVATE std::string smpi_container_key(int rank)
+{
+  return std::string("rank-") + std::to_string(rank);
+}
+
 XBT_PRIVATE container_t smpi_container(int rank)
 {
-  return simgrid::instr::Container::byName(std::string("rank-") + std::to_string(rank));
+  return simgrid::instr::Container::byName(smpi_container_key(rank));
 }
 
 static std::string TRACE_smpi_put_key(int src, int dst, int tag, int send)
@@ -131,32 +223,32 @@ const char *TRACE_internal_smpi_get_category ()
   return (it == process_category.end()) ? nullptr : it->second.c_str();
 }
 
-void TRACE_smpi_alloc()
-{
-  // for symmetry
-}
-
 void TRACE_smpi_release()
 {
   for (auto const& elm : keys)
     delete elm.second;
 }
 
-void TRACE_smpi_init(int rank)
+void TRACE_smpi_setup_container(int rank, sg_host_t host)
 {
-  if (not TRACE_smpi_is_enabled())
-    return;
-
-  std::string str = std::string("rank-") + std::to_string(rank);
+  std::string str = smpi_container_key(rank);
 
   container_t father;
   if (TRACE_smpi_is_grouped()){
-    father = simgrid::instr::Container::byNameOrNull(sg_host_self_get_name());
+    father = simgrid::instr::Container::byNameOrNull(host->get_name());
   }else{
     father = simgrid::instr::Container::getRoot();
   }
-  xbt_assert(father != nullptr, "Could not find a parent for mpi rank %s at function %s", str.c_str(), __FUNCTION__);
-  father->createChild(str, "MPI");
+  xbt_assert(father != nullptr, "Could not find a parent for mpi rank %s at function %s", str.c_str(), __func__);
+  father->createChild(str, "MPI"); // This container is of type MPI
+}
+
+void TRACE_smpi_init(int rank)
+{
+  if (not TRACE_smpi_is_enabled())
+    return;
+
+  TRACE_smpi_setup_container(rank, sg_host_self());
 #if HAVE_PAPI
   container_t container   = simgrid::instr::Container::byName(str);
   papi_counter_t counters = smpi_process()->papi_counters();
@@ -272,3 +364,44 @@ void TRACE_smpi_recv(int src, int dst, int tag)
   XBT_DEBUG("Recv tracing from %d to %d, tag %d, with key %s", src, dst, tag, key.c_str());
   simgrid::instr::Container::getRoot()->getLink("MPI_LINK")->endEvent(smpi_container(dst), "PTP", key);
 }
+
+/**************** Functions to trace the migration of tasks. *****************/
+void TRACE_smpi_send_process_data_in(int rank)
+{
+  if (!TRACE_smpi_is_enabled()) return;
+
+  smpi_container(rank)->getState("MIGRATE_STATE")->addEntityValue("migration", instr_find_color("migration"));
+  smpi_container(rank)->getState("MIGRATE_STATE")->pushEvent("migration");
+}
+
+void TRACE_smpi_send_process_data_out(int rank)
+{
+  if (!TRACE_smpi_is_enabled()) return; 
+
+  /* Clean the process state. */
+  smpi_container(rank)->getState("MIGRATE_STATE")->popEvent();
+}
+
+void TRACE_smpi_process_change_host(int rank, sg_host_t new_host)
+{
+  if (!TRACE_smpi_is_enabled()) return;
+
+  /** The key is (most likely) used to match the events in the trace */
+  static long long int counter = 0;
+  std::string key              = std::to_string(counter);
+  counter++;
+
+  // start link (= tell the trace that this rank moves from A to B)
+  container_t cont = smpi_container(rank);
+  simgrid::instr::Container::getRoot()->getLink("MIGRATE_LINK")->startEvent(cont, "M", key);
+
+  // Destroy container of this rank on this host
+  cont->removeFromParent();
+
+  // Setup container on new host
+  TRACE_smpi_setup_container(rank, new_host);
+
+  // end link
+  cont = smpi_container(rank); // This points to the newly created container
+  simgrid::instr::Container::getRoot()->getLink("MIGRATE_LINK")->endEvent(cont, "M", key);
+}