gem5  v21.1.0.2
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 namespace gem5
50 {
51 
52 namespace ruby
53 {
54 
55 class MessageBuffer;
56 class Switch;
57 
58 class Throttle : public Consumer
59 {
60  public:
61  Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency,
62  int link_bandwidth_multiplier, int endpoint_bandwidth,
63  Switch *em);
64  ~Throttle() {}
65 
66  std::string name()
67  { return csprintf("Throttle-%i", m_switch_id); }
68 
69  void addLinks(const std::vector<MessageBuffer*>& in_vec,
70  const std::vector<MessageBuffer*>& out_vec);
71  void wakeup();
72 
73  // The average utilization (a fraction) since last clearStats()
76  const statistics::Vector & getMsgCount(unsigned int type) const
77  { return *(throttleStats.m_msg_counts[type]); }
78 
79  int getLinkBandwidth() const
81 
82  Cycles getLatency() const { return m_link_latency; }
83 
84  void clearStats();
85  void collateStats();
86  void regStats();
87  void print(std::ostream& out) const;
88 
89  private:
90  void init(NodeID node, Cycles link_latency, int link_bandwidth_multiplier,
91  int endpoint_bandwidth);
92  void operateVnet(int vnet, int &bw_remainin, bool &schedule_wakeup,
93  MessageBuffer *in, MessageBuffer *out);
94 
95  // Private copy constructor and assignment operator
96  Throttle(const Throttle& obj);
97  Throttle& operator=(const Throttle& obj);
98 
101  unsigned int m_vnets;
103 
104  const int m_switch_id;
107 
113 
115 
116 
118  {
119  ThrottleStats(statistics::Group *parent, const NodeID &nodeID);
120 
121  // Statistical variables
123  statistics::Vector* m_msg_counts[MessageSizeType_NUM];
124  statistics::Formula* m_msg_bytes[MessageSizeType_NUM];
125  } throttleStats;
126 };
127 
128 inline std::ostream&
129 operator<<(std::ostream& out, const Throttle& obj)
130 {
131  obj.print(out);
132  out << std::flush;
133  return out;
134 }
135 
136 } // namespace ruby
137 } // namespace gem5
138 
139 #endif // __MEM_RUBY_NETWORK_SIMPLE_THROTTLE_HH__
gem5::statistics::Scalar
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:1927
gem5::ruby::Throttle::m_link_bandwidth_multiplier
int m_link_bandwidth_multiplier
Definition: Throttle.hh:108
gem5::ruby::Throttle::wakeup
void wakeup()
Definition: Throttle.cc:154
gem5::ruby::Throttle::m_wakeups_wo_switch
int m_wakeups_wo_switch
Definition: Throttle.hh:110
gem5::ruby::operator<<
std::ostream & operator<<(std::ostream &os, const BoolVec &myvector)
Definition: BoolVec.cc:49
gem5::ruby::Throttle::operateVnet
void operateVnet(int vnet, int &bw_remainin, bool &schedule_wakeup, MessageBuffer *in, MessageBuffer *out)
Definition: Throttle.cc:98
gem5::ruby::Throttle::print
void print(std::ostream &out) const
Definition: Throttle.cc:252
gem5::ruby::Throttle::ThrottleStats::m_msg_counts
statistics::Vector * m_msg_counts[MessageSizeType_NUM]
Definition: Throttle.hh:123
gem5::ruby::Throttle::getUtilization
const statistics::Scalar & getUtilization() const
Definition: Throttle.hh:74
gem5::statistics::Vector
A vector of scalar stats.
Definition: statistics.hh:2003
gem5::statistics::Formula
A formula for statistics that is calculated when printed.
Definition: statistics.hh:2536
std::vector
STL vector class.
Definition: stl.hh:37
gem5::csprintf
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
gem5::ruby::Consumer
Definition: Consumer.hh:61
gem5::ruby::Throttle::init
void init(NodeID node, Cycles link_latency, int link_bandwidth_multiplier, int endpoint_bandwidth)
gem5::ruby::Throttle::getMsgCount
const statistics::Vector & getMsgCount(unsigned int type) const
Definition: Throttle.hh:76
gem5::ruby::Switch
Definition: Switch.hh:77
gem5::ruby::Throttle::regStats
void regStats()
Definition: Throttle.cc:210
gem5::Cycles
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:78
gem5::ruby::Throttle::addLinks
void addLinks(const std::vector< MessageBuffer * > &in_vec, const std::vector< MessageBuffer * > &out_vec)
Definition: Throttle.cc:76
gem5::ruby::Throttle::m_node
NodeID m_node
Definition: Throttle.hh:106
gem5::ruby::Throttle::m_in
std::vector< MessageBuffer * > m_in
Definition: Throttle.hh:99
gem5::ruby::Throttle::getLatency
Cycles getLatency() const
Definition: Throttle.hh:82
gem5::ruby::Throttle::clearStats
void clearStats()
Definition: Throttle.cc:236
gem5::ruby::Throttle::collateStats
void collateStats()
Definition: Throttle.cc:242
gem5::ruby::Throttle::operator=
Throttle & operator=(const Throttle &obj)
gem5::X86ISA::type
type
Definition: misc.hh:733
gem5::ruby::Throttle::m_out
std::vector< MessageBuffer * > m_out
Definition: Throttle.hh:100
gem5::ruby::Throttle::m_switch_id
const int m_switch_id
Definition: Throttle.hh:104
RubySystem.hh
gem5::ruby::Throttle::throttleStats
gem5::ruby::Throttle::ThrottleStats throttleStats
gem5::ruby::Throttle::m_link_utilization_proxy
double m_link_utilization_proxy
Definition: Throttle.hh:114
gem5::ruby::Throttle::~Throttle
~Throttle()
Definition: Throttle.hh:64
Network.hh
gem5::ruby::RubySystem
Definition: RubySystem.hh:63
gem5::ruby::Consumer::em
ClockedObject * em
Definition: Consumer.hh:92
gem5::ruby::Throttle::m_vnets
unsigned int m_vnets
Definition: Throttle.hh:101
gem5::ruby::Throttle::m_endpoint_bandwidth
int m_endpoint_bandwidth
Definition: Throttle.hh:111
gem5::ruby::Throttle::ThrottleStats::m_link_utilization
statistics::Scalar m_link_utilization
Definition: Throttle.hh:122
Consumer.hh
gem5::ruby::Throttle::getLinkBandwidth
int getLinkBandwidth() const
Definition: Throttle.hh:79
gem5::statistics::Group
Statistics container.
Definition: group.hh:93
gem5::ruby::NodeID
unsigned int NodeID
Definition: TypeDefines.hh:40
gem5::ruby::Throttle::m_link_latency
Cycles m_link_latency
Definition: Throttle.hh:109
gem5::ruby::Throttle::m_units_remaining
std::vector< int > m_units_remaining
Definition: Throttle.hh:102
gem5::ruby::Throttle::Throttle
Throttle(int sID, RubySystem *rs, NodeID node, Cycles link_latency, int link_bandwidth_multiplier, int endpoint_bandwidth, Switch *em)
Definition: Throttle.cc:55
gem5::ruby::MessageBuffer
Definition: MessageBuffer.hh:74
gem5::ruby::Throttle
Definition: Throttle.hh:58
gem5::ruby::Throttle::m_switch
Switch * m_switch
Definition: Throttle.hh:105
gem5
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
Definition: decoder.cc:40
gem5::ruby::Throttle::ThrottleStats::m_msg_bytes
statistics::Formula * m_msg_bytes[MessageSizeType_NUM]
Definition: Throttle.hh:124
gem5::ruby::Throttle::ThrottleStats
Definition: Throttle.hh:117
gem5::ruby::Throttle::name
std::string name()
Definition: Throttle.hh:66
gem5::ArmISA::rs
Bitfield< 9, 8 > rs
Definition: misc_types.hh:376
gem5::ruby::Throttle::ThrottleStats::ThrottleStats
ThrottleStats(statistics::Group *parent, const NodeID &nodeID)
Definition: Throttle.cc:273
gem5::ruby::Throttle::m_ruby_system
RubySystem * m_ruby_system
Definition: Throttle.hh:112

Generated on Tue Sep 21 2021 12:25:41 for gem5 by doxygen 1.8.17