X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/cdc88d00bfd00a5c819f01f97161dafbecf571d5..1ba3b199ce47dca5644315bf6009a795d3816ffd:/docs/source/tuto_network_calibration/dahu_platform_ckmeans.cpp diff --git a/docs/source/tuto_network_calibration/dahu_platform_ckmeans.cpp b/docs/source/tuto_network_calibration/dahu_platform_ckmeans.cpp new file mode 100644 index 0000000000..d645ffaa39 --- /dev/null +++ b/docs/source/tuto_network_calibration/dahu_platform_ckmeans.cpp @@ -0,0 +1,141 @@ +/* Copyright (c) 2006-2021. 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 "Utils.hpp" +#include +#include +#include +#include +#include +#include +#include +namespace sg4 = simgrid::s4u; + +class NormalMixture : public Sampler { + std::vector> mixture_; + std::vector prob_; + std::mt19937& gen_; + +public: + NormalMixture(std::mt19937& gen) : gen_(gen) {} + void append(double mean, double stddev, double prob) + { + mixture_.push_back(std::normal_distribution(mean, stddev)); + prob_.push_back(prob); + } + double sample() + { + std::discrete_distribution<> d(prob_.begin(), prob_.end()); + int index = d(gen_); + auto& normal = mixture_[index]; + double value = normal(gen_); + return value; + } +}; + +/** + * @brief Callback to set latency factor for a communication + * + * @param latency_base The base latency for this calibration (user-defined) + * @param seg Segmentation (user-defined) + * @param size Message size (simgrid) + */ +static double latency_factor_cb(double latency_base, const SegmentedRegression& seg, double size, + const sg4::Host* /*src*/, const sg4::Host* /*dst*/, + const std::vector& /*links*/, + const std::unordered_set& /*netzones*/) +{ + if (size < 63305) + return 0.0; // no calibration for small messages + + return seg.sample(size) / latency_base; +} + +/** + * @brief Callback to set bandwidth factor for a communication + * + * @param bw_base The base bandwidth for this calibration (user-defined) + * @param seg Segmentation (user-defined) + * @param size Message size (simgrid) + */ +static double bw_factor_cb(double bw_base, const SegmentedRegression& seg, double size, const sg4::Host* /*src*/, + const sg4::Host* /*dst*/, const std::vector& /*links*/, + const std::unordered_set& /*netzones*/) +{ + if (size < 63305) + return 1.0; // no calibration for small messages + double est_bw = 1.0 / seg.get_coef(size); + return est_bw / bw_base; +} + +static double smpi_cost_cb(const SegmentedRegression& seg, double size, sg4::Host* /*src*/, sg4::Host* /*dst*/) +{ + return seg.sample(size); +} + +static SegmentedRegression read_json_file(const std::string& jsonFile, std::mt19937& gen, bool read_coef = true) +{ + boost::property_tree::ptree pt; + boost::property_tree::read_json(jsonFile, pt); + std::unordered_map> mixtures; + std::unordered_map coefs; + printf("Starting parsing file: %s\n", jsonFile.c_str()); + pt = pt.get_child("seg"); // go to segments part + SegmentedRegression seg(read_coef); + for (const auto& it : pt) { + double max = it.second.get_child("max_x").get_value(); + coefs[max] = it.second.get_child("coefficient").get_value(); + auto& mixture = mixtures[max]; + if (!mixture) + mixture = std::make_shared(gen); + mixture->append(it.second.get_child("mean").get_value(), it.second.get_child("sd").get_value(), + it.second.get_child("prob").get_value()); + } + for (const auto& i : mixtures) { + seg.append(i.first, coefs[i.first], i.second); + } + return seg; +} + +/** @brief Programmatic version of dahu */ +extern "C" void load_platform(const sg4::Engine& e); +void load_platform(const sg4::Engine& e) +{ + // setting threshold sync/async modes + e.set_config("smpi/async-small-thresh", 63305); + e.set_config("smpi/send-is-detached-thresh", 63305); + + /* reading bandwidth and latency base value. It is the same for all regressions, get from first file */ + boost::property_tree::ptree pt; + boost::property_tree::read_json("pingpong_ckmeans.json", pt); + double bw_base = pt.get_child("bandwidth_base").get_value(); + double lat_base = pt.get_child("latency_base").get_value(); + printf("Read bandwidth_base: %e latency_base: %e\n", bw_base, lat_base); + + load_dahu_platform(e, bw_base, lat_base); + + static std::mt19937 gen(42); // remove it from stack, since we need it after this this load_platform function is over + + /* setting network factors callbacks */ + simgrid::kernel::resource::NetworkModelIntf* model = e.get_netzone_root()->get_network_model(); + + SegmentedRegression seg = read_json_file("pingpong_ckmeans.json", gen, false); + model->set_lat_factor_cb(std::bind(&latency_factor_cb, lat_base, seg, std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3, std::placeholders::_4, std::placeholders::_5)); + + model->set_bw_factor_cb(std::bind(&bw_factor_cb, bw_base, seg, std::placeholders::_1, std::placeholders::_2, + std::placeholders::_3, std::placeholders::_4, std::placeholders::_5)); + + seg = read_json_file("send_ckmeans.json", gen); + smpi_register_op_cost_callback(SmpiOperation::SEND, std::bind(&smpi_cost_cb, seg, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + + seg = read_json_file("isend_ckmeans.json", gen); + smpi_register_op_cost_callback(SmpiOperation::ISEND, std::bind(&smpi_cost_cb, seg, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + seg = read_json_file("recv_ckmeans.json", gen); + smpi_register_op_cost_callback(SmpiOperation::RECV, std::bind(&smpi_cost_cb, seg, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); +} \ No newline at end of file