From 6d3a11c0eb39811cd3aafb3193a909bd2413dfff Mon Sep 17 00:00:00 2001 From: Frederic Suter Date: Fri, 2 Sep 2016 11:46:48 +0200 Subject: [PATCH 1/1] factor parce_factor smpi_factor_multival_t becomes smpi_factor_t and is used even for single factors --- src/include/smpi/smpi_utils.hpp | 26 ++++++++++++ src/smpi/smpi_base.cpp | 72 ++------------------------------ src/smpi/smpi_utils.cpp | 66 +++++++++++++++++++++++++++++ src/surf/network_smpi.cpp | 68 +++++------------------------- tools/cmake/DefinePackages.cmake | 2 + 5 files changed, 109 insertions(+), 125 deletions(-) create mode 100644 src/include/smpi/smpi_utils.hpp create mode 100644 src/smpi/smpi_utils.cpp diff --git a/src/include/smpi/smpi_utils.hpp b/src/include/smpi/smpi_utils.hpp new file mode 100644 index 0000000000..6d07002246 --- /dev/null +++ b/src/include/smpi/smpi_utils.hpp @@ -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 +#include + +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 values; +} s_smpi_factor_t; + +XBT_PUBLIC(std::vector) parse_factor(const char *smpi_coef_string); + +SG_END_DECL() + +#endif diff --git a/src/smpi/smpi_base.cpp b/src/smpi/smpi_base.cpp index bd20dacbc0..74855e5d93 100644 --- a/src/smpi/smpi_base.cpp +++ b/src/smpi/smpi_base.cpp @@ -5,7 +5,6 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include -#include #include #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 values; -} s_smpi_factor_multival_t; - -std::vector smpi_os_values; -std::vector smpi_or_values; -std::vector smpi_ois_values; +std::vector smpi_os_values; +std::vector smpi_or_values; +std::vector smpi_ois_values; static simgrid::config::Flag 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 smpi_iprobe_sleep( static simgrid::config::Flag smpi_test_sleep( "smpi/test", "Minimum time to inject inside a call to MPI_Test", 1e-4); -static std::vector parse_factor(const char *smpi_coef_string) -{ - std::vector smpi_factor; - - /** Setup the tokenizer that parses the string **/ - typedef boost::tokenizer> Tokenizer; - boost::char_separator sep(";"); - boost::char_separator 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 index 0000000000..10e4efb9c2 --- /dev/null +++ b/src/smpi/smpi_utils.cpp @@ -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 + +XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_utils, smpi, "Logging specific to SMPI (utils)"); + +std::vector parse_factor(const char *smpi_coef_string) +{ + std::vector smpi_factor; + + /** Setup the tokenizer that parses the string **/ + typedef boost::tokenizer> Tokenizer; + boost::char_separator sep(";"); + boost::char_separator 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; +} diff --git a/src/surf/network_smpi.cpp b/src/surf/network_smpi.cpp index 298d06c25e..3575a83c38 100644 --- a/src/surf/network_smpi.cpp +++ b/src/surf/network_smpi.cpp @@ -5,24 +5,18 @@ * under the terms of the license (GNU LGPL) which comes with this package. */ #include - #include #include #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 smpi_bw_factor; +std::vector 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; } diff --git a/tools/cmake/DefinePackages.cmake b/tools/cmake/DefinePackages.cmake index d2d4821a66..8e154e6bb8 100644 --- a/tools/cmake/DefinePackages.cmake +++ b/tools/cmake/DefinePackages.cmake @@ -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 ) -- 2.20.1