gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
mem_dep_unit.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012, 2014, 2020 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 2004-2006 The Regents of The University of Michigan
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
41 #ifndef __CPU_O3_MEM_DEP_UNIT_HH__
42 #define __CPU_O3_MEM_DEP_UNIT_HH__
43 
44 #include <list>
45 #include <memory>
46 #include <set>
47 #include <unordered_map>
48 #include <unordered_set>
49 
50 #include "base/statistics.hh"
51 #include "cpu/inst_seq.hh"
52 #include "debug/MemDepUnit.hh"
53 
54 struct SNHash {
55  size_t operator() (const InstSeqNum &seq_num) const {
56  unsigned a = (unsigned)seq_num;
57  unsigned hash = (((a >> 14) ^ ((a >> 2) & 0xffff))) & 0x7FFFFFFF;
58 
59  return hash;
60  }
61 };
62 
63 struct DerivO3CPUParams;
64 
65 template <class Impl>
66 class InstructionQueue;
67 
79 template <class MemDepPred, class Impl>
81 {
82  protected:
83  std::string _name;
84 
85  public:
86  typedef typename Impl::DynInstPtr DynInstPtr;
87  typedef typename Impl::DynInstConstPtr DynInstConstPtr;
88 
90  MemDepUnit();
91 
93  MemDepUnit(DerivO3CPUParams *params);
94 
96  ~MemDepUnit();
97 
99  std::string name() const { return _name; }
100 
102  void init(DerivO3CPUParams *params, ThreadID tid);
103 
105  void regStats();
106 
108  bool isDrained() const;
109 
111  void drainSanityCheck() const;
112 
114  void takeOverFrom();
115 
117  void setIQ(InstructionQueue<Impl> *iq_ptr);
118 
120  void insert(const DynInstPtr &inst);
121 
123  void insertNonSpec(const DynInstPtr &inst);
124 
126  void insertBarrier(const DynInstPtr &barr_inst);
127 
129  void regsReady(const DynInstPtr &inst);
130 
132  void nonSpecInstReady(const DynInstPtr &inst);
133 
135  void reschedule(const DynInstPtr &inst);
136 
140  void replay();
141 
143  void completeInst(const DynInstPtr &inst);
144 
148  void squash(const InstSeqNum &squashed_num, ThreadID tid);
149 
151  void violation(const DynInstPtr &store_inst,
152  const DynInstPtr &violating_load);
153 
155  void issue(const DynInstPtr &inst);
156 
158  void dumpLists();
159 
160  private:
161 
163  void completed(const DynInstPtr &inst);
164 
166  void wakeDependents(const DynInstPtr &inst);
167 
169 
170  class MemDepEntry;
171 
172  typedef std::shared_ptr<MemDepEntry> MemDepEntryPtr;
173 
178  class MemDepEntry {
179  public:
181  MemDepEntry(const DynInstPtr &new_inst)
182  : inst(new_inst), regsReady(false), memDeps(0),
183  completed(false), squashed(false)
184  {
185 #ifdef DEBUG
186  ++memdep_count;
187 
188  DPRINTF(MemDepUnit, "Memory dependency entry created. "
189  "memdep_count=%i %s\n", memdep_count, inst->pcState());
190 #endif
191  }
192 
195  {
196  for (int i = 0; i < dependInsts.size(); ++i) {
197  dependInsts[i] = NULL;
198  }
199 #ifdef DEBUG
200  --memdep_count;
201 
202  DPRINTF(MemDepUnit, "Memory dependency entry deleted. "
203  "memdep_count=%i %s\n", memdep_count, inst->pcState());
204 #endif
205  }
206 
208  std::string name() const { return "memdepentry"; }
209 
211  DynInstPtr inst;
212 
214  ListIt listIt;
215 
218 
220  bool regsReady;
222  int memDeps;
224  bool completed;
226  bool squashed;
227 
229 #ifdef DEBUG
230  static int memdep_count;
231  static int memdep_insert;
232  static int memdep_erase;
233 #endif
234  };
235 
237  inline MemDepEntryPtr &findInHash(const DynInstConstPtr& inst);
238 
240  inline void moveToReady(MemDepEntryPtr &ready_inst_entry);
241 
242  typedef std::unordered_map<InstSeqNum, MemDepEntryPtr, SNHash> MemDepHash;
243 
244  typedef typename MemDepHash::iterator MemDepHashIt;
245 
247  MemDepHash memDepHash;
248 
250  std::list<DynInstPtr> instList[Impl::MaxThreads];
251 
254 
260  MemDepPred depPred;
261 
263  std::unordered_set<InstSeqNum> loadBarrierSNs;
264 
266  std::unordered_set<InstSeqNum> storeBarrierSNs;
267 
269  bool hasLoadBarrier() const { return !loadBarrierSNs.empty(); }
270 
272  bool hasStoreBarrier() const { return !storeBarrierSNs.empty(); }
273 
275  void insertBarrierSN(const DynInstPtr &barr_inst);
276 
279 
281  int id;
282 
291 };
292 
293 #endif // __CPU_O3_MEM_DEP_UNIT_HH__
#define DPRINTF(x,...)
Definition: trace.hh:222
MemDepHash memDepHash
A hash map of all memory dependence entries.
std::unordered_set< InstSeqNum > storeBarrierSNs
Sequence numbers of outstanding store barriers.
std::shared_ptr< MemDepEntry > MemDepEntryPtr
Bitfield< 7 > i
bool hasLoadBarrier() const
Is there an outstanding load barrier that loads must wait on.
std::list< DynInstPtr >::iterator ListIt
ListIt listIt
The iterator to the instruction&#39;s location inside the list.
size_t operator()(const InstSeqNum &seq_num) const
Definition: mem_dep_unit.hh:55
Bitfield< 8 > a
void takeOverFrom(ThreadContext &ntc, ThreadContext &otc)
Copy state between thread contexts in preparation for CPU handover.
~MemDepEntry()
Frees any pointers.
int id
The thread id of this memory dependence unit.
int memDeps
Number of memory dependencies that need to be satisfied.
Impl::DynInstConstPtr DynInstConstPtr
Definition: mem_dep_unit.hh:87
std::vector< MemDepEntryPtr > dependInsts
A vector of any dependent instructions.
Declaration of Statistics objects.
std::unordered_set< InstSeqNum > loadBarrierSNs
Sequence numbers of outstanding load barriers.
This is a simple scalar statistic, like a counter.
Definition: statistics.hh:2505
MemDepEntry(const DynInstPtr &new_inst)
Constructs a memory dependence entry.
Stats::Scalar insertedLoads
Stat for number of inserted loads.
bool squashed
If the instruction is squashed.
InstructionQueue< Impl > * iqPtr
Pointer to the IQ.
Impl::DynInstPtr DynInstPtr
Definition: mem_dep_unit.hh:86
bool regsReady
If the registers are ready or not.
Stats::Scalar conflictingStores
Stat for number of conflicting stores that had to wait for a store.
Stats::Scalar conflictingLoads
Stat for number of conflicting loads that had to wait for a store.
bool completed
If the instruction is completed.
uint64_t InstSeqNum
Definition: inst_seq.hh:37
Memory dependence entries that track memory operations, marking when the instruction is ready to exec...
STL list class.
Definition: stl.hh:51
Stats::Scalar insertedStores
Stat for number of inserted stores.
bool hasStoreBarrier() const
Is there an outstanding store barrier that loads must wait on.
MemDepPred depPred
The memory dependence predictor.
Memory dependency unit class.
Definition: mem_dep_unit.hh:80
int16_t ThreadID
Thread index/ID type.
Definition: types.hh:225
std::string name() const
Returns the name of the memory dependence entry.
std::list< DynInstPtr > instsToReplay
A list of all instructions that are going to be replayed.
std::string name() const
Returns the name of the memory dependence unit.
Definition: mem_dep_unit.hh:99
std::unordered_map< InstSeqNum, MemDepEntryPtr, SNHash > MemDepHash
A standard instruction queue class.
Definition: inst_queue.hh:81
const FlagsType init
This Stat is Initialized.
Definition: info.hh:45
std::string _name
Definition: mem_dep_unit.hh:83
DynInstPtr inst
The instruction being tracked.
MemDepHash::iterator MemDepHashIt

Generated on Mon Jun 8 2020 15:45:08 for gem5 by doxygen 1.8.13