X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/af0238ea66e865c08a50d41d7380eb3beb2a3d7e..9bcd28fb0c558fbaa23ee46416f96baef5279045:/src/surf/network_ib.hpp diff --git a/src/surf/network_ib.hpp b/src/surf/network_ib.hpp index b7d17157c5..f130d1c9fd 100644 --- a/src/surf/network_ib.hpp +++ b/src/surf/network_ib.hpp @@ -1,4 +1,4 @@ -/* Copyright (c) 2014. The SimGrid Team. +/* Copyright (c) 2014-2022. The SimGrid Team. * All rights reserved. */ /* This program is free software; you can redistribute it and/or modify it @@ -7,37 +7,57 @@ #ifndef SURF_NETWORK_IB_HPP_ #define SURF_NETWORK_IB_HPP_ -class NetworkIBModel : public NetworkModel { -private: -public: - NetworkIBModel(); - NetworkIBModel(const char *name); - ~NetworkModel(); - virtual ActionPtr communicate(RoutingEdgePtr src, RoutingEdgePtr dst, - double size, double rate); - virtual NetworkLinkPtr createNetworkLink(const char *name, - double bw_initial, - tmgr_trace_t bw_trace, - double lat_initial, - tmgr_trace_t lat_trace, - e_surf_resource_state_t state_initial, - tmgr_trace_t state_trace, - e_surf_link_sharing_policy_t policy, - xbt_dict_t properties); +#include "src/surf/network_smpi.hpp" +#include "xbt/base.h" + +#include +#include + +namespace simgrid { +namespace kernel { +namespace resource { + +class XBT_PRIVATE IBNode; + +struct XBT_PRIVATE ActiveComm { + IBNode* destination = nullptr; + NetworkAction* action = nullptr; + double init_rate = -1; }; -class NetworkIBLink : public NetworkLink { -private: +class IBNode { public: - NetworkIBLink(NetworkModelPtr model, const char *name, xbt_dict_t props); - NetworkIBLink(NetworkModelPtr model, const char *name, xbt_dict_t props, - lmm_constraint_t constraint, - tmgr_history_t history, - tmgr_trace_t state_trace); - ~NetworkIBLink(); - virtual void updateLatency(double value, double date=surf_get_clock()); - virtual void updateBandwidth(double value, double date=surf_get_clock()); + int id_; + // store related links, to ease computation of the penalties + std::vector active_comms_up_; + // store the number of comms received from each node + std::map active_comms_down_; + // number of comms the node is receiving + int nb_active_comms_down_ = 0; + explicit IBNode(int id) : id_(id){}; +}; + +class XBT_PRIVATE NetworkIBModel : public NetworkSmpiModel { + std::unordered_map active_nodes; + std::unordered_map> active_comms; + double Bs_; + double Be_; + double ys_; + void update_IB_factors_rec(IBNode* root, std::vector& updatedlist) const; + void compute_IB_factors(IBNode* root) const; + +public: + explicit NetworkIBModel(const std::string& name); + NetworkIBModel(const NetworkIBModel&) = delete; + NetworkIBModel& operator=(const NetworkIBModel&) = delete; + void update_IB_factors(NetworkAction* action, IBNode* from, IBNode* to, int remove) const; + static void IB_create_host_callback(s4u::Host const& host); + static void IB_action_state_changed_callback(NetworkAction& action, Action::State /*previous*/); + static void IB_comm_start_callback(const activity::CommImpl& comm); }; +} // namespace resource +} // namespace kernel +} // namespace simgrid #endif