Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
factor parce_factor
authorFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 2 Sep 2016 09:46:48 +0000 (11:46 +0200)
committerFrederic Suter <frederic.suter@cc.in2p3.fr>
Fri, 2 Sep 2016 09:49:12 +0000 (11:49 +0200)
smpi_factor_multival_t becomes smpi_factor_t and is used even for
single factors

src/include/smpi/smpi_utils.hpp [new file with mode: 0644]
src/smpi/smpi_base.cpp
src/smpi/smpi_utils.cpp [new file with mode: 0644]
src/surf/network_smpi.cpp
tools/cmake/DefinePackages.cmake

diff --git a/src/include/smpi/smpi_utils.hpp b/src/include/smpi/smpi_utils.hpp
new file mode 100644 (file)
index 0000000..6d07002
--- /dev/null
@@ -0,0 +1,26 @@
+/* Copyright (c) 2016. 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. */
+
+#ifndef _SMPI_UTILS_HPP
+#define _SMPI_UTILS_HPP
+#include "xbt/base.h"
+#include <cstddef>
+#include <vector>
+
+SG_BEGIN_DECL()
+
+// Methods used to parse and store the values for timing injections in smpi
+typedef struct s_smpi_factor *smpi_os_factor_t;
+typedef struct s_smpi_factor{
+  size_t factor=0;
+  std::vector<double> values;
+} s_smpi_factor_t;
+
+XBT_PUBLIC(std::vector<s_smpi_factor_t>) parse_factor(const char *smpi_coef_string);
+
+SG_END_DECL()
+
+#endif
index bd20dac..74855e5 100644 (file)
@@ -5,7 +5,6 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <xbt/config.hpp>
-#include <boost/tokenizer.hpp>
 #include <algorithm>
 
 #include "private.h"
@@ -17,6 +16,7 @@
 #include "src/simix/smx_private.h"
 #include "surf/surf.h"
 #include "simgrid/sg_config.h"
+#include "smpi/smpi_utils.hpp"
 #include "colls/colls.h"
 
 #include "src/kernel/activity/SynchroComm.hpp"
@@ -69,17 +69,9 @@ static int match_send(void* a, void* b,smx_activity_t ignored) {
    } else return 0;
 }
 
-// Methods used to parse and store the values for timing injections in smpi
-// These are taken from surf/network.c and generalized to have more values for each factor
-typedef struct s_smpi_factor_multival *smpi_os_factor_multival_t;
-typedef struct s_smpi_factor_multival { // FIXME: this should be merged (deduplicated) with s_smpi_factor defined in network_smpi.c
-  size_t factor=0;
-  std::vector<double> values;
-} s_smpi_factor_multival_t;
-
-std::vector<s_smpi_factor_multival_t> smpi_os_values;
-std::vector<s_smpi_factor_multival_t> smpi_or_values;
-std::vector<s_smpi_factor_multival_t> smpi_ois_values;
+std::vector<s_smpi_factor_t> smpi_os_values;
+std::vector<s_smpi_factor_t> smpi_or_values;
+std::vector<s_smpi_factor_t> smpi_ois_values;
 
 static simgrid::config::Flag<double> smpi_wtime_sleep(
   "smpi/wtime", "Minimum time to inject inside a call to MPI_Wtime", 0.0);
@@ -90,62 +82,6 @@ static simgrid::config::Flag<double> smpi_iprobe_sleep(
 static simgrid::config::Flag<double> smpi_test_sleep(
   "smpi/test", "Minimum time to inject inside a call to MPI_Test", 1e-4);
 
-static std::vector<s_smpi_factor_multival_t> parse_factor(const char *smpi_coef_string)
-{
-  std::vector<s_smpi_factor_multival_t> smpi_factor;
-
-  /** Setup the tokenizer that parses the string **/
-  typedef boost::tokenizer<boost::char_separator<char>> Tokenizer;
-  boost::char_separator<char> sep(";");
-  boost::char_separator<char> factor_separator(":");
-  std::string tmp_string(smpi_coef_string);
-  Tokenizer tokens(tmp_string, sep);
-
-  /** 
-   * Iterate over patterns like A:B:C:D;E:F;G:H
-   * These will be broken down into:
-   * A --> B, C, D
-   * E --> F
-   * G --> H
-   */
-  for (Tokenizer::iterator token_iter = tokens.begin();
-         token_iter != tokens.end(); token_iter++) {
-XBT_DEBUG("token : %s", token_iter->c_str());
-    Tokenizer factor_values(*token_iter, factor_separator);
-    s_smpi_factor_multival_t fact;
-    if (factor_values.begin() == factor_values.end()) {
-      xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string);
-    }
-    unsigned int iteration = 0;
-    for (Tokenizer::iterator factor_iter = factor_values.begin();
-         factor_iter != factor_values.end(); factor_iter++, iteration++) {
-      char *errmsg;
-
-      if (factor_iter == factor_values.begin()) { /* first element */
-        errmsg = bprintf("Invalid factor in chunk #%zu: %%s", smpi_factor.size()+1);
-        fact.factor = xbt_str_parse_int(factor_iter->c_str(), errmsg);
-      }
-      else {
-        errmsg = bprintf("Invalid factor value %d in chunk #%zu: %%s", iteration, smpi_factor.size()+1);
-        fact.values.push_back(xbt_str_parse_double(factor_iter->c_str(), errmsg));
-      }
-      xbt_free(errmsg);
-    }
-
-    smpi_factor.push_back(fact);
-    XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]);
-  }
-  std::sort(smpi_factor.begin(), smpi_factor.end(),
-            [](const s_smpi_factor_multival_t &pa,
-               const s_smpi_factor_multival_t &pb) {
-              return (pa.factor < pb.factor);
-            });
-  for (auto& fact : smpi_factor) {
-    XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size() ,fact.values[0]);
-  }
-
-  return smpi_factor;
-}
 
 static double smpi_os(size_t size)
 {
diff --git a/src/smpi/smpi_utils.cpp b/src/smpi/smpi_utils.cpp
new file mode 100644 (file)
index 0000000..10e4efb
--- /dev/null
@@ -0,0 +1,66 @@
+/* Copyright (c) 2016. 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/smpi_utils.hpp"
+#include "xbt/sysdep.h"
+#include "xbt/log.h"
+#include "xbt/str.h"
+#include <boost/tokenizer.hpp>
+
+XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_utils, smpi, "Logging specific to SMPI (utils)");
+
+std::vector<s_smpi_factor_t> parse_factor(const char *smpi_coef_string)
+{
+  std::vector<s_smpi_factor_t> smpi_factor;
+
+  /** Setup the tokenizer that parses the string **/
+  typedef boost::tokenizer<boost::char_separator<char>> Tokenizer;
+  boost::char_separator<char> sep(";");
+  boost::char_separator<char> factor_separator(":");
+  std::string tmp_string(smpi_coef_string);
+  Tokenizer tokens(tmp_string, sep);
+
+  /**
+   * Iterate over patterns like A:B:C:D;E:F;G:H
+   * These will be broken down into:
+   * A --> B, C, D
+   * E --> F
+   * G --> H
+   */
+  for (Tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); token_iter++) {
+    XBT_DEBUG("token : %s", token_iter->c_str());
+    Tokenizer factor_values(*token_iter, factor_separator);
+    s_smpi_factor_t fact;
+    if (factor_values.begin() == factor_values.end()) {
+      xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string);
+    }
+    unsigned int iteration = 0;
+    for (Tokenizer::iterator factor_iter = factor_values.begin();
+         factor_iter != factor_values.end(); factor_iter++, iteration++) {
+      char *errmsg;
+
+      if (factor_iter == factor_values.begin()) { /* first element */
+        errmsg = bprintf("Invalid factor in chunk #%zu: %%s", smpi_factor.size()+1);
+        fact.factor = xbt_str_parse_int(factor_iter->c_str(), errmsg);
+      }
+      else {
+        errmsg = bprintf("Invalid factor value %d in chunk #%zu: %%s", iteration, smpi_factor.size()+1);
+        fact.values.push_back(xbt_str_parse_double(factor_iter->c_str(), errmsg));
+      }
+      xbt_free(errmsg);
+    }
+
+    smpi_factor.push_back(fact);
+    XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]);
+  }
+  std::sort(smpi_factor.begin(), smpi_factor.end(),
+      [](const s_smpi_factor_t &pa, const s_smpi_factor_t &pb) {return (pa.factor < pb.factor);});
+  for (auto& fact : smpi_factor) {
+    XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size() ,fact.values[0]);
+  }
+
+  return smpi_factor;
+}
index 298d06c..3575a83 100644 (file)
@@ -5,24 +5,18 @@
  * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <cstddef>
-
 #include <algorithm>
 
 #include <xbt/log.h>
 
 #include "network_smpi.hpp"
 #include "simgrid/sg_config.h"
+#include "smpi/smpi_utils.hpp"
 
 XBT_LOG_EXTERNAL_DEFAULT_CATEGORY(surf_network);
 
-xbt_dynar_t smpi_bw_factor = nullptr;
-xbt_dynar_t smpi_lat_factor = nullptr;
-
-typedef struct s_smpi_factor *smpi_factor_t;
-typedef struct s_smpi_factor { // FIXME: s_smpi_factor_multival (defined in smpi_base) should be used instead to dedupplicate this code
-  long factor;
-  double value;
-} s_smpi_factor_t;
+std::vector<s_smpi_factor_t> smpi_bw_factor;
+std::vector<s_smpi_factor_t> smpi_lat_factor;
 
 xbt_dict_t gap_lookup = nullptr;
 
@@ -33,40 +27,6 @@ static int factor_cmp(const void *pa, const void *pb)
 }
 
 #include "src/surf/xml/platf.hpp" // FIXME: move that back to the parsing area
-static xbt_dynar_t parse_factor(const char *smpi_coef_string)
-{
-  char *value = nullptr;
-  unsigned int iter = 0;
-  s_smpi_factor_t fact;
-  xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = nullptr;
-
-  smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), nullptr);
-  radical_elements = xbt_str_split(smpi_coef_string, ";");
-  xbt_dynar_foreach(radical_elements, iter, value) {
-
-    radical_elements2 = xbt_str_split(value, ":");
-    surf_parse_assert(xbt_dynar_length(radical_elements2) == 2,
-        "Malformed radical '%s' for smpi factor. I was expecting something like 'a:b'", value);
-
-    char *errmsg = bprintf("Invalid factor in chunk #%d: %%s", iter+1);
-    fact.factor = xbt_str_parse_int(xbt_dynar_get_as(radical_elements2, 0, char *), errmsg);
-    xbt_free(errmsg);
-    fact.value = xbt_str_parse_double(xbt_dynar_get_as(radical_elements2, 1, char *), errmsg);
-    errmsg = bprintf("Invalid factor value in chunk #%d: %%s", iter+1);
-    xbt_free(errmsg);
-
-    xbt_dynar_push_as(smpi_factor, s_smpi_factor_t, fact);
-    XBT_DEBUG("smpi_factor:\t%ld : %f", fact.factor, fact.value);
-    xbt_dynar_free(&radical_elements2);
-  }
-  xbt_dynar_free(&radical_elements);
-  xbt_dynar_sort(smpi_factor, &factor_cmp);
-  xbt_dynar_foreach(smpi_factor, iter, fact) {
-    XBT_DEBUG("ordered smpi_factor:\t%ld : %f", fact.factor, fact.value);
-
-  }
-  return smpi_factor;
-}
 
 /*********
  * Model *
@@ -104,8 +64,6 @@ namespace simgrid {
 
     NetworkSmpiModel::~NetworkSmpiModel(){
       xbt_dict_free(&gap_lookup);
-      xbt_dynar_free(&smpi_bw_factor);
-      xbt_dynar_free(&smpi_lat_factor);
     }
 
     void NetworkSmpiModel::gapAppend(double size, Link* link, NetworkAction *act)
@@ -170,40 +128,36 @@ namespace simgrid {
 
     double NetworkSmpiModel::bandwidthFactor(double size)
     {
-      if (!smpi_bw_factor)
+      if (smpi_bw_factor.empty())
         smpi_bw_factor = parse_factor(xbt_cfg_get_string("smpi/bw-factor"));
 
-      unsigned int iter = 0;
-      s_smpi_factor_t fact;
       double current=1.0;
-      xbt_dynar_foreach(smpi_bw_factor, iter, fact) {
+      for (auto fact: smpi_bw_factor) {
         if (size <= fact.factor) {
           XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
           return current;
         }else
-          current=fact.value;
+          current=fact.values.front();
       }
-      XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
+      XBT_DEBUG("%f > %ld return %f", size, smpi_bw_factor.back().factor, current);
 
       return current;
     }
 
     double NetworkSmpiModel::latencyFactor(double size)
     {
-      if (!smpi_lat_factor)
+      if (smpi_lat_factor.empty())
         smpi_lat_factor = parse_factor(xbt_cfg_get_string("smpi/lat-factor"));
 
-      unsigned int iter = 0;
-      s_smpi_factor_t fact;
       double current=1.0;
-      xbt_dynar_foreach(smpi_lat_factor, iter, fact) {
+      for (auto fact: smpi_lat_factor) {
         if (size <= fact.factor) {
           XBT_DEBUG("%f <= %ld return %f", size, fact.factor, current);
           return current;
         }else
-          current=fact.value;
+          current=fact.values.front();
       }
-      XBT_DEBUG("%f > %ld return %f", size, fact.factor, current);
+      XBT_DEBUG("%f > %ld return %f", size, smpi_lat_factor.back().factor, current);
 
       return current;
     }
index d2d4821..8e154e6 100644 (file)
@@ -10,6 +10,7 @@ set(EXTRA_DIST
   src/mc/mc_record.h
   src/include/simgrid/sg_config.h
   src/include/smpi/smpi_interface.h
+  src/include/smpi/smpi_utils.hpp
   src/include/surf/datatypes.h
   src/include/surf/maxmin.h
   src/include/surf/surf.h
@@ -239,6 +240,7 @@ set(SMPI_SRC
   src/smpi/smpi_replay.cpp
   src/smpi/smpi_rma.cpp
   src/smpi/smpi_topo.cpp
+  src/smpi/smpi_utils.cpp
   src/smpi/smpi_f77.cpp
   )