Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
[trace] avoiding key clashes on paje links
[simgrid.git] / src / instr / instr_smpi.c
index 8cddd98..b794d02 100644 (file)
@@ -5,6 +5,7 @@
   * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include "instr/instr_private.h"
+#include "mc/mc.h"
 #include <ctype.h>
 #include <wchar.h>
 
@@ -16,30 +17,30 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(instr_smpi, instr, "Tracing SMPI");
 static xbt_dict_t keys;
 
 static const char *smpi_colors[] ={
-    "recv",     "255 000 000",
-    "irecv",    "255 135 135",
-    "send",     "000 000 255",
-    "isend",    "135 135 255",
-    "sendrecv", "000 255 255",
-    "wait",     "255 255 000",
-    "waitall",  "200 200 000",
-    "waitany",  "200 200 150",
-
-    "allgather",     "255 000 000",
-    "allgatherv",    "255 135 135",
-    "allreduce",     "255 000 255",
-    "alltoall",      "135 000 255",
-    "alltoallv",     "200 135 255",
-    "barrier",       "000 200 200",
-    "bcast",         "000 200 100",
-    "gather",        "255 255 000",
-    "gatherv",       "255 255 135",
-    "reduce",        "000 255 000",
-    "reducescatter", "135 255 135",
-    "scan",          "255 150 060",
-    "scatterv",      "135 000 135",
-    "scatter",       "255 190 140",
-
+    "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",
+
+    "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",
+    "scatterv",      "0.52 0 0.52",
+    "scatter",       "1 0.74 0.54",
+    "computing",     "0 1 1",
     NULL, NULL,
 };
 
@@ -82,11 +83,15 @@ static char *TRACE_smpi_put_key(int src, int dst, char *key, int n)
   xbt_dynar_t d = xbt_dict_get_or_null(keys, aux);
   if (d == NULL) {
     d = xbt_dynar_new(sizeof(char *), &xbt_free_ref);
-    xbt_dict_set(keys, aux, d, xbt_free);
+    xbt_dict_set(keys, aux, d, NULL);
   }
   //generate the key
   static unsigned long long counter = 0;
-  snprintf(key, n, "%d%d%lld", src, dst, counter++);
+  
+  if(MC_is_active())
+    MC_ignore_data_bss(&counter, sizeof(counter));
+
+  snprintf(key, n, "%d_%d_%llu", src, dst, counter++);
 
   //push it
   char *a = (char*)xbt_strdup(key);
@@ -123,7 +128,7 @@ void TRACE_internal_smpi_set_category (const char *category)
   if (xbt_dict_get_or_null (process_category, processid))
     xbt_dict_remove (process_category, processid);
   if (category != NULL)
-    xbt_dict_set (process_category, processid, xbt_strdup(category), xbt_free);
+    xbt_dict_set (process_category, processid, xbt_strdup(category), NULL);
 }
 
 const char *TRACE_internal_smpi_get_category (void)
@@ -137,21 +142,14 @@ const char *TRACE_internal_smpi_get_category (void)
 
 void TRACE_smpi_alloc()
 {
-  keys = xbt_dict_new();
-  process_category = xbt_dict_new();
-}
-
-void TRACE_smpi_start(void)
-{
-  TRACE_start();
+  keys = xbt_dict_new_homogeneous(xbt_free);
+  process_category = xbt_dict_new_homogeneous(xbt_free);
 }
 
 void TRACE_smpi_release(void)
 {
-  if (!TRACE_smpi_is_enabled()) return;
-
-  TRACE_surf_release();
-  TRACE_end();
+  xbt_dict_free(&keys);
+  xbt_dict_free(&process_category);
 }
 
 void TRACE_smpi_init(int rank)
@@ -163,13 +161,13 @@ void TRACE_smpi_init(int rank)
 
   container_t father;
   if (TRACE_smpi_is_grouped()){
-    father = getContainer (SIMIX_host_self_get_name());
+    father = PJ_container_get (SIMIX_host_self_get_name());
   }else{
-    father = getRootContainer ();
+    father = PJ_container_get_root ();
   }
   xbt_assert(father!=NULL,
       "Could not find a parent for mpi rank %s at function %s", str, __FUNCTION__);
-  newContainer(str, INSTR_SMPI, father);
+  PJ_container_new(str, INSTR_SMPI, father);
 }
 
 void TRACE_smpi_finalize(int rank)
@@ -177,8 +175,9 @@ void TRACE_smpi_finalize(int rank)
   if (!TRACE_smpi_is_enabled()) return;
 
   char str[INSTR_DEFAULT_STR_SIZE];
-  smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
-  destroyContainer(getContainer (str));
+  container_t container = PJ_container_get(smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE));
+  PJ_container_remove_from_parent (container);
+  PJ_container_free (container);
 }
 
 void TRACE_smpi_collective_in(int rank, int root, const char *operation)
@@ -187,11 +186,10 @@ void TRACE_smpi_collective_in(int rank, int root, const char *operation)
 
   char str[INSTR_DEFAULT_STR_SIZE];
   smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
-  container_t container = getContainer (str);
-  type_t type = getType ("MPI_STATE", container->type);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
   const char *color = instr_find_color (operation);
-  val_t value = getValue (operation, color, type);
-
+  val_t value = PJ_value_get_or_new (operation, color, type);
   new_pajePushState (SIMIX_get_clock(), container, type, value);
 }
 
@@ -201,9 +199,48 @@ void TRACE_smpi_collective_out(int rank, int root, const char *operation)
 
   char str[INSTR_DEFAULT_STR_SIZE];
   smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
-  container_t container = getContainer (str);
-  type_t type = getType ("MPI_STATE", container->type);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
+
+  new_pajePopState (SIMIX_get_clock(), container, type);
+}
+
+void TRACE_smpi_computing_init(int rank)
+{
+ //first use, initialize the color in the trace
+ //TODO : check with lucas and Pierre how to generalize this approach
+  //to avoid unnecessary access to the color array
+  if (!TRACE_smpi_is_enabled() || !TRACE_smpi_is_computing()) return;
+
+  char str[INSTR_DEFAULT_STR_SIZE];
+  smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
+  const char *color = instr_find_color ("computing");
+  val_t value = PJ_value_get_or_new ("computing", color, type);
+  new_pajePushState (SIMIX_get_clock(), container, type, value);
+}
 
+void TRACE_smpi_computing_in(int rank)
+{
+  //do not forget to set the color first, otherwise this will explode
+  if (!TRACE_smpi_is_enabled()|| !TRACE_smpi_is_computing()) return;
+
+  char str[INSTR_DEFAULT_STR_SIZE];
+  smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
+  val_t value = PJ_value_get_or_new ("computing", NULL, type);
+  new_pajePushState (SIMIX_get_clock(), container, type, value);
+}
+
+void TRACE_smpi_computing_out(int rank)
+{
+  if (!TRACE_smpi_is_enabled()|| !TRACE_smpi_is_computing()) return;
+  char str[INSTR_DEFAULT_STR_SIZE];
+  smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
   new_pajePopState (SIMIX_get_clock(), container, type);
 }
 
@@ -214,11 +251,10 @@ void TRACE_smpi_ptp_in(int rank, int src, int dst, const char *operation)
 
   char str[INSTR_DEFAULT_STR_SIZE];
   smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
-  container_t container = getContainer (str);
-  type_t type = getType ("MPI_STATE", container->type);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
   const char *color = instr_find_color (operation);
-  val_t value = getValue (operation, color, type);
-
+  val_t value = PJ_value_get_or_new (operation, color, type);
   new_pajePushState (SIMIX_get_clock(), container, type, value);
 }
 
@@ -228,8 +264,8 @@ void TRACE_smpi_ptp_out(int rank, int src, int dst, const char *operation)
 
   char str[INSTR_DEFAULT_STR_SIZE];
   smpi_container(rank, str, INSTR_DEFAULT_STR_SIZE);
-  container_t container = getContainer (str);
-  type_t type = getType ("MPI_STATE", container->type);
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_STATE", container->type);
 
   new_pajePopState (SIMIX_get_clock(), container, type);
 }
@@ -239,14 +275,15 @@ void TRACE_smpi_send(int rank, int src, int dst)
   if (!TRACE_smpi_is_enabled()) return;
 
   char key[INSTR_DEFAULT_STR_SIZE];
+  bzero (key, INSTR_DEFAULT_STR_SIZE);
   TRACE_smpi_put_key(src, dst, key, INSTR_DEFAULT_STR_SIZE);
 
   char str[INSTR_DEFAULT_STR_SIZE];
   smpi_container(src, str, INSTR_DEFAULT_STR_SIZE);
-  container_t container = getContainer (str);
-  type_t type = getType ("MPI_LINK", getRootType());
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_LINK", PJ_type_get_root());
 
-  new_pajeStartLink (SIMIX_get_clock(), getRootContainer(), type, container, "PTP", key);
+  new_pajeStartLink (SIMIX_get_clock(), PJ_container_get_root(), type, container, "PTP", key);
 }
 
 void TRACE_smpi_recv(int rank, int src, int dst)
@@ -254,13 +291,14 @@ void TRACE_smpi_recv(int rank, int src, int dst)
   if (!TRACE_smpi_is_enabled()) return;
 
   char key[INSTR_DEFAULT_STR_SIZE];
+  bzero (key, INSTR_DEFAULT_STR_SIZE);
   TRACE_smpi_get_key(src, dst, key, INSTR_DEFAULT_STR_SIZE);
 
   char str[INSTR_DEFAULT_STR_SIZE];
   smpi_container(dst, str, INSTR_DEFAULT_STR_SIZE);
-  container_t container = getContainer (str);
-  type_t type = getType ("MPI_LINK", getRootType());
+  container_t container = PJ_container_get (str);
+  type_t type = PJ_type_get ("MPI_LINK", PJ_type_get_root());
 
-  new_pajeEndLink (SIMIX_get_clock(), getRootContainer(), type, container, "PTP", key);
+  new_pajeEndLink (SIMIX_get_clock(), PJ_container_get_root(), type, container, "PTP", key);
 }
 #endif /* HAVE_TRACING */