gem5  v20.1.0.0
Throttle.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met: redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer;
9  * redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution;
12  * neither the name of the copyright holders nor the names of its
13  * contributors may be used to endorse or promote products derived from
14  * this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /*
30  * The class to implement bandwidth and latency throttle. An instance
31  * of consumer class that can be woke up. It is only used to control
32  * bandwidth at output port of a switch. And the throttle is added
33  * *after* the output port, means the message is put in the output
34  * port of the PerfectSwitch (a intermediateBuffers) first, then go
35  * through the Throttle.
36  */
37 
38 #ifndef __MEM_RUBY_NETWORK_SIMPLE_THROTTLE_HH__
39 #define __MEM_RUBY_NETWORK_SIMPLE_THROTTLE_HH__
40 
41 #include <iostream>
42 #include <string>
43 #include <vector>
44 
48 
49 class MessageBuffer;
50 class Switch;
51 
52 class Throttle : public Consumer
53 {
54  public:
55  Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency,
56  int link_bandwidth_multiplier, int endpoint_bandwidth,
57  Switch *em);
58  ~Throttle() {}
59 
60  std::string name()
61  { return csprintf("Throttle-%i", m_switch_id); }
62 
63  void addLinks(const std::vector<MessageBuffer*>& in_vec,
64  const std::vector<MessageBuffer*>& out_vec);
65  void wakeup();
66 
67  // The average utilization (a fraction) since last clearStats()
68  const Stats::Scalar & getUtilization() const
69  { return m_link_utilization; }
70  const Stats::Vector & getMsgCount(unsigned int type) const
71  { return m_msg_counts[type]; }
72 
73  int getLinkBandwidth() const
75 
76  Cycles getLatency() const { return m_link_latency; }
77 
78  void clearStats();
79  void collateStats();
80  void regStats(std::string name);
81  void print(std::ostream& out) const;
82 
83  private:
84  void init(NodeID node, Cycles link_latency, int link_bandwidth_multiplier,
85  int endpoint_bandwidth);
86  void operateVnet(int vnet, int &bw_remainin, bool &schedule_wakeup,
87  MessageBuffer *in, MessageBuffer *out);
88 
89  // Private copy constructor and assignment operator
90  Throttle(const Throttle& obj);
91  Throttle& operator=(const Throttle& obj);
92 
95  unsigned int m_vnets;
97 
98  const int m_switch_id;
101 
107 
108  // Statistical variables
110  Stats::Vector m_msg_counts[MessageSizeType_NUM];
111  Stats::Formula m_msg_bytes[MessageSizeType_NUM];
112 
114 };
115 
116 inline std::ostream&
117 operator<<(std::ostream& out, const Throttle& obj)
118 {
119  obj.print(out);
120  out << std::flush;
121  return out;
122 }
123 
124 #endif // __MEM_RUBY_NETWORK_SIMPLE_THROTTLE_HH__
Throttle::m_link_latency
Cycles m_link_latency
Definition: Throttle.hh:103
Throttle::m_out
std::vector< MessageBuffer * > m_out
Definition: Throttle.hh:94
Throttle::m_endpoint_bandwidth
int m_endpoint_bandwidth
Definition: Throttle.hh:105
Throttle::getMsgCount
const Stats::Vector & getMsgCount(unsigned int type) const
Definition: Throttle.hh:70
Throttle::wakeup
void wakeup()
Definition: Throttle.cc:147
Throttle::collateStats
void collateStats()
Definition: Throttle.cc:234
Throttle::~Throttle
~Throttle()
Definition: Throttle.hh:58
Throttle::m_switch_id
const int m_switch_id
Definition: Throttle.hh:98
Throttle::m_vnets
unsigned int m_vnets
Definition: Throttle.hh:95
Throttle::m_link_utilization_proxy
double m_link_utilization_proxy
Definition: Throttle.hh:113
Throttle::m_link_bandwidth_multiplier
int m_link_bandwidth_multiplier
Definition: Throttle.hh:102
type
uint8_t type
Definition: inet.hh:421
Throttle::clearStats
void clearStats()
Definition: Throttle.cc:228
std::vector< MessageBuffer * >
Throttle::Throttle
Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency, int link_bandwidth_multiplier, int endpoint_bandwidth, Switch *em)
Definition: Throttle.cc:51
Throttle::print
void print(std::ostream &out) const
Definition: Throttle.cc:243
Switch
Definition: Switch.hh:59
Stats::Vector
A vector of scalar stats.
Definition: statistics.hh:2575
Throttle::name
std::string name()
Definition: Throttle.hh:60
Throttle::regStats
void regStats(std::string name)
Definition: Throttle.cc:203
Throttle::m_node
NodeID m_node
Definition: Throttle.hh:100
Stats::Scalar
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2533
Throttle
Definition: Throttle.hh:52
Throttle::m_msg_bytes
Stats::Formula m_msg_bytes[MessageSizeType_NUM]
Definition: Throttle.hh:111
Throttle::operator=
Throttle & operator=(const Throttle &obj)
Throttle::m_switch
Switch * m_switch
Definition: Throttle.hh:99
RubySystem
Definition: RubySystem.hh:52
Throttle::m_ruby_system
RubySystem * m_ruby_system
Definition: Throttle.hh:106
Throttle::m_wakeups_wo_switch
int m_wakeups_wo_switch
Definition: Throttle.hh:104
Consumer
Definition: Consumer.hh:43
Throttle::m_link_utilization
Stats::Scalar m_link_utilization
Definition: Throttle.hh:109
Consumer::em
ClockedObject * em
Definition: Consumer.hh:83
Throttle::getLatency
Cycles getLatency() const
Definition: Throttle.hh:76
RubySystem.hh
Network.hh
Consumer.hh
Stats::Formula
A formula for statistics that is calculated when printed.
Definition: statistics.hh:3037
Throttle::m_in
std::vector< MessageBuffer * > m_in
Definition: Throttle.hh:93
operator<<
std::ostream & operator<<(std::ostream &out, const Throttle &obj)
Definition: Throttle.hh:117
ArmISA::rs
Bitfield< 9, 8 > rs
Definition: miscregs_types.hh:372
Cycles
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:83
Throttle::addLinks
void addLinks(const std::vector< MessageBuffer * > &in_vec, const std::vector< MessageBuffer * > &out_vec)
Definition: Throttle.cc:70
NodeID
unsigned int NodeID
Definition: TypeDefines.hh:34
Throttle::getLinkBandwidth
int getLinkBandwidth() const
Definition: Throttle.hh:73
Throttle::operateVnet
void operateVnet(int vnet, int &bw_remainin, bool &schedule_wakeup, MessageBuffer *in, MessageBuffer *out)
Definition: Throttle.cc:92
MessageBuffer
Definition: MessageBuffer.hh:68
Throttle::m_units_remaining
std::vector< int > m_units_remaining
Definition: Throttle.hh:96
Throttle::m_msg_counts
Stats::Vector m_msg_counts[MessageSizeType_NUM]
Definition: Throttle.hh:110
csprintf
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:158
Throttle::getUtilization
const Stats::Scalar & getUtilization() const
Definition: Throttle.hh:68
Throttle::init
void init(NodeID node, Cycles link_latency, int link_bandwidth_multiplier, int endpoint_bandwidth)

Generated on Wed Sep 30 2020 14:02:13 for gem5 by doxygen 1.8.17