gem5  v20.1.0.0
misc.hh
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2017 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * For use for simulation and test purposes only
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from this
19  * software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef __MISC_HH__
35 #define __MISC_HH__
36 
37 #include <bitset>
38 #include <limits>
39 #include <memory>
40 
41 #include "base/logging.hh"
42 #include "sim/clocked_object.hh"
43 
44 class GPUDynInst;
45 
46 typedef std::bitset<std::numeric_limits<unsigned long long>::digits>
47  VectorMask;
48 typedef std::shared_ptr<GPUDynInst> GPUDynInstPtr;
49 
50 enum InstMemoryHop : int {
51  Initiate = 0,
54  GMEnqueue = 3,
55  Complete = 4,
57 };
58 
59 enum BlockMemoryHop : int {
60  BlockSend = 0,
62 };
63 
64 class WaitClass
65 {
66  public:
68 
69  WaitClass(ClockedObject *_clockedObject, uint64_t _numStages=0)
70  : nxtAvail(0), lookAheadAvail(0), clockedObject(_clockedObject),
71  numStages(_numStages) { }
72 
73  void init(ClockedObject *_clockedObject, uint64_t _numStages=0)
74  {
75  clockedObject = _clockedObject;
76  numStages = _numStages;
77  }
78 
79  void set(uint64_t i)
80  {
82  "Can't allocate resource because it is busy!!!");
84  }
85  void preset(uint64_t delay)
86  {
87  lookAheadAvail = std::max(lookAheadAvail, delay +
89  }
90  bool rdy(Cycles cycles = Cycles(0)) const
91  {
92  return clockedObject->clockEdge(cycles) >= nxtAvail;
93  }
94  bool prerdy() const
95  {
97  }
98 
99  private:
100  // timestamp indicating when resource will be available
101  uint64_t nxtAvail;
102  // timestamp indicating when resource will be available including
103  // pending uses of the resource (when there is a cycle gap between
104  // rdy() and set()
105  uint64_t lookAheadAvail;
106  // clockedObject for current timestamp
108  // number of stages between checking if a resource is ready and
109  // setting the resource's utilization
110  uint64_t numStages;
111 };
112 
113 class Float16
114 {
115  public:
116  uint16_t val;
117 
118  Float16() { val = 0; }
119 
120  Float16(const Float16 &x) : val(x.val) { }
121 
122  Float16(float x)
123  {
124  uint32_t ai = *(reinterpret_cast<uint32_t *>(&x));
125 
126  uint32_t s = (ai >> 31) & 0x1;
127  uint32_t exp = (ai >> 23) & 0xff;
128  uint32_t mant = (ai >> 0) & 0x7fffff;
129 
130  if (exp == 0 || exp <= 0x70) {
131  exp = 0;
132  mant = 0;
133  } else if (exp == 0xff) {
134  exp = 0x1f;
135  } else if (exp >= 0x8f) {
136  exp = 0x1f;
137  mant = 0;
138  } else {
139  exp = exp - 0x7f + 0x0f;
140  }
141 
142  mant = mant >> 13;
143 
144  val = 0;
145  val |= (s << 15);
146  val |= (exp << 10);
147  val |= (mant << 0);
148  }
149 
150  operator float() const
151  {
152  uint32_t s = (val >> 15) & 0x1;
153  uint32_t exp = (val >> 10) & 0x1f;
154  uint32_t mant = (val >> 0) & 0x3ff;
155 
156  if (!exp) {
157  exp = 0;
158  mant = 0;
159  } else if (exp == 0x1f) {
160  exp = 0xff;
161  } else {
162  exp = exp - 0x0f + 0x7f;
163  }
164 
165  uint32_t val1 = 0;
166  val1 |= (s << 31);
167  val1 |= (exp << 23);
168  val1 |= (mant << 13);
169 
170  return *(reinterpret_cast<float *>(&val1));
171  }
172 };
173 
174 #endif // __MISC_HH__
X86ISA::s
Bitfield< 44 > s
Definition: misc.hh:927
WaitClass::numStages
uint64_t numStages
Definition: misc.hh:110
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
GPUDynInst
Definition: gpu_dyn_inst.hh:76
InstMemoryHopMax
@ InstMemoryHopMax
Definition: misc.hh:56
Float16
Definition: misc.hh:113
WaitClass
Definition: misc.hh:64
WaitClass::preset
void preset(uint64_t delay)
Definition: misc.hh:85
ClockedObject
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Definition: clocked_object.hh:231
WaitClass::rdy
bool rdy(Cycles cycles=Cycles(0)) const
Definition: misc.hh:90
Float16::Float16
Float16(float x)
Definition: misc.hh:122
WaitClass::clockedObject
ClockedObject * clockedObject
Definition: misc.hh:107
WaitClass::set
void set(uint64_t i)
Definition: misc.hh:79
Clocked::clockEdge
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
Definition: clocked_object.hh:174
InstMemoryHop
InstMemoryHop
Definition: misc.hh:50
Float16::Float16
Float16()
Definition: misc.hh:118
WaitClass::init
void init(ClockedObject *_clockedObject, uint64_t _numStages=0)
Definition: misc.hh:73
Initiate
@ Initiate
Definition: misc.hh:51
Float16::val
uint16_t val
Definition: misc.hh:116
RiscvISA::x
Bitfield< 3 > x
Definition: pagetable.hh:69
WaitClass::prerdy
bool prerdy() const
Definition: misc.hh:94
GMEnqueue
@ GMEnqueue
Definition: misc.hh:54
WaitClass::nxtAvail
uint64_t nxtAvail
Definition: misc.hh:101
WaitClass::WaitClass
WaitClass()
Definition: misc.hh:67
BlockMemoryHop
BlockMemoryHop
Definition: misc.hh:59
Float16::Float16
Float16(const Float16 &x)
Definition: misc.hh:120
clocked_object.hh
CoalsrSend
@ CoalsrSend
Definition: misc.hh:52
GPUDynInstPtr
std::shared_ptr< GPUDynInst > GPUDynInstPtr
Definition: misc.hh:48
logging.hh
Cycles
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:83
Complete
@ Complete
Definition: misc.hh:55
CoalsrRecv
@ CoalsrRecv
Definition: misc.hh:53
VectorMask
std::bitset< std::numeric_limits< unsigned long long >::digits > VectorMask
Definition: misc.hh:44
BlockSend
@ BlockSend
Definition: misc.hh:60
fatal_if
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Definition: logging.hh:219
BlockRecv
@ BlockRecv
Definition: misc.hh:61
WaitClass::lookAheadAvail
uint64_t lookAheadAvail
Definition: misc.hh:105
WaitClass::WaitClass
WaitClass(ClockedObject *_clockedObject, uint64_t _numStages=0)
Definition: misc.hh:69

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