gem5  v22.1.0.0
super_blk.cc
Go to the documentation of this file.
1 
36 
37 #include <climits>
38 #include <cmath>
39 
40 #include "base/bitfield.hh"
41 
42 namespace gem5
43 {
44 
46  : SectorSubBlk(), _size(0), _decompressionLatency(0), _compressed(false)
47 {
48 }
49 
50 CacheBlk&
52 {
53  operator=(std::move(static_cast<CompressionBlk&&>(other)));
54  return *this;
55 }
56 
59 {
60  // Copy internal variables; if moving, that means we had an expansion or
61  // contraction, and therefore the size is no longer valid, so it is not
62  // moved
63  setDecompressionLatency(other.getDecompressionLatency());
64  if (other.isCompressed()) {
65  setCompressed();
66  } else {
68  }
69 
70  CacheBlk::operator=(std::move(other));
71  return *this;
72 }
73 
74 bool
76 {
77  return _compressed;
78 }
79 
80 void
82 {
83  _compressed = true;
84 }
85 
86 void
88 {
89  _compressed = false;
90 }
91 
92 std::size_t
94 {
95  return _size;
96 }
97 
98 void
99 CompressionBlk::setSizeBits(const std::size_t size)
100 {
101  _size = size;
102 
103  SuperBlk* superblock = static_cast<SuperBlk*>(getSectorBlock());
104  const uint8_t compression_factor =
105  superblock->calculateCompressionFactor(size);
106  superblock->setCompressionFactor(compression_factor);
107 
108  // Either this function is called after an insertion, or an update.
109  // If somebody else is present in the block, keep the superblock's
110  // compressibility. Otherwise, check if it can co-allocate
111  const uint8_t num_valid = superblock->getNumValid();
112  assert(num_valid >= 1);
113  if (num_valid == 1) {
114  if (compression_factor != 1) {
115  setCompressed();
116  } else {
117  setUncompressed();
118  }
119  } else {
120  if (superblock->isCompressed(this)) {
121  setCompressed();
122  } else {
123  setUncompressed();
124  }
125  }
126 }
127 
128 Cycles
130 {
131  return _decompressionLatency;
132 }
133 
134 void
136 {
137  _decompressionLatency = lat;
138 }
139 
140 void
142 {
144  setUncompressed();
145 }
146 
148 CompressionBlk::checkExpansionContraction(const std::size_t size) const
149 {
150  // An expansion happens when a block passes from a compressible state
151  // to a less compressible state (e.g., blkSize/4 to (blkSize/2 or blkSize),
152  // or blkSize/2 to blkSize). A contraction happens when a block passes
153  // from a less compressible state to a more compressible state (i.e., the
154  // opposite of expansion)
155  const SuperBlk* superblock =
156  static_cast<const SuperBlk*>(getSectorBlock());
157  const uint8_t prev_cf = superblock->getCompressionFactor();
158  const uint8_t new_cf = superblock->calculateCompressionFactor(size);
159  return (new_cf < prev_cf) ? DATA_EXPANSION :
160  ((new_cf > prev_cf) ? DATA_CONTRACTION : UNCHANGED);
161 }
162 
163 std::string
165 {
166  return csprintf("%s compressed: %d size: %llu decompression latency: %d",
169 }
170 
172  : SectorBlk(), blkSize(0), compressionFactor(1)
173 {
174 }
175 
176 void
178 {
180  compressionFactor = 1;
181 }
182 
183 bool
184 SuperBlk::isCompressed(const CompressionBlk* ignored_blk) const
185 {
186  for (const auto& blk : blks) {
187  if (blk->isValid() && (blk != ignored_blk)) {
188  return static_cast<CompressionBlk*>(blk)->isCompressed();
189  }
190  }
191 
192  // An invalid block is seen as compressed
193  return true;
194 }
195 
196 bool
197 SuperBlk::canCoAllocate(const std::size_t compressed_size) const
198 {
199  // A YACC-like (Sardashti et al., 2016) co-allocation function: at most
200  // numBlocksPerSector blocks that compress at least to fit in the space
201  // allocated by its compression factor can share a superblock
202  return (getNumValid() < getCompressionFactor()) &&
203  (compressed_size <= (blkSize * CHAR_BIT) / getCompressionFactor());
204 }
205 
206 void
207 SuperBlk::setBlkSize(const std::size_t blk_size)
208 {
209  assert(blkSize == 0);
210  blkSize = blk_size;
211 }
212 
213 uint8_t
214 SuperBlk::calculateCompressionFactor(const std::size_t size) const
215 {
216  // The number of blocks per sector determines the maximum comp factor.
217  // If the compressed size is worse than the uncompressed size, we assume
218  // the size is the uncompressed size, and thus the compression factor is 1
219  const std::size_t blk_size_bits = CHAR_BIT * blkSize;
220  const std::size_t compression_factor = (size > blk_size_bits) ? 1 :
221  ((size == 0) ? blk_size_bits :
222  alignToPowerOfTwo(std::floor(double(blk_size_bits) / size)));
223  return std::min(compression_factor, blks.size());
224 }
225 
226 uint8_t
228 {
229  return compressionFactor;
230 }
231 
232 void
233 SuperBlk::setCompressionFactor(const uint8_t compression_factor)
234 {
235  // Either the block is alone, in which case the compression factor
236  // must be set, or it co-allocates with someone with a worse or
237  // equal compression factor, in which case it should not be updated
238  if (getNumValid() <= 1) {
239  compressionFactor = compression_factor;
240  }
241 }
242 
243 std::string
245 {
246  return csprintf("CF: %d %s", getCompressionFactor(), SectorBlk::print());
247 }
248 
249 } // namespace gem5
A Basic Cache block.
Definition: cache_blk.hh:71
CacheBlk & operator=(const CacheBlk &)=delete
A superblock is composed of sub-blocks, and each sub-block has information regarding its superblock a...
Definition: super_blk.hh:52
void setCompressed()
Set compression bit.
Definition: super_blk.cc:81
std::string print() const override
Pretty-print sector offset and other CacheBlk information.
Definition: super_blk.cc:164
std::size_t getSizeBits() const
Definition: super_blk.cc:93
void setUncompressed()
Clear compression bit.
Definition: super_blk.cc:87
void setSizeBits(const std::size_t size)
Set size, in bits, of this compressed block's data.
Definition: super_blk.cc:99
bool isCompressed() const
Check if this block holds compressed data.
Definition: super_blk.cc:75
Cycles _decompressionLatency
Number of cycles needed to decompress this block.
Definition: super_blk.hh:63
std::size_t _size
Set size, in bits, of this compressed block's data.
Definition: super_blk.hh:57
void setDecompressionLatency(const Cycles lat)
Set number of cycles needed to decompress this block.
Definition: super_blk.cc:135
CompressionBlk & operator=(const CompressionBlk &)=delete
OverwriteType
When an overwrite happens, the data size may change an not fit in its current container any longer.
Definition: super_blk.hh:75
@ UNCHANGED
New and old contents are considered of similar sizes.
Definition: super_blk.hh:79
@ DATA_EXPANSION
New data contents are considered larger than previous contents.
Definition: super_blk.hh:81
@ DATA_CONTRACTION
New data contents are considered smaller than previous contents.
Definition: super_blk.hh:77
Cycles getDecompressionLatency() const
Get number of cycles needed to decompress this block.
Definition: super_blk.cc:129
OverwriteType checkExpansionContraction(const std::size_t size) const
Determines if changing the size of the block will cause a data expansion (new size is bigger) or cont...
Definition: super_blk.cc:148
void invalidate() override
Invalidate the block and inform sector block.
Definition: super_blk.cc:141
bool _compressed
Compression bit.
Definition: super_blk.hh:66
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:79
A Basic Sector block.
Definition: sector_blk.hh:135
std::vector< SectorSubBlk * > blks
List of blocks associated to this sector.
Definition: sector_blk.hh:147
std::string print() const override
Print relevant information for this sector block and its sub-blocks.
Definition: sector_blk.cc:158
uint8_t getNumValid() const
Get the number of sub-blocks that have been validated.
Definition: sector_blk.cc:127
A sector is composed of sub-blocks, and each sub-block has information regarding its sector and a poi...
Definition: sector_blk.hh:52
void invalidate() override
Invalidate the block and inform sector block.
Definition: sector_blk.cc:101
std::string print() const override
Pretty-print sector offset and other CacheBlk information.
Definition: sector_blk.cc:108
SectorBlk * getSectorBlock() const
Get sector block associated to this block.
Definition: sector_blk.cc:52
A basic compression superblock.
Definition: super_blk.hh:171
std::size_t blkSize
Block size, in bytes.
Definition: super_blk.hh:174
std::string print() const override
Print relevant information for this sector block and its sub-blocks.
Definition: super_blk.cc:244
void setCompressionFactor(const uint8_t compression_factor)
Set the compression factor of this superblock.
Definition: super_blk.cc:233
bool isCompressed(const CompressionBlk *ignored_blk=nullptr) const
Returns whether the superblock contains compressed blocks or not.
Definition: super_blk.cc:184
void setBlkSize(const std::size_t blk_size)
Set block size.
Definition: super_blk.cc:207
void invalidate() override
Invalidate the block.
Definition: super_blk.cc:177
bool canCoAllocate(const std::size_t compressed_size) const
Checks whether a superblock can co-allocate given compressed data block.
Definition: super_blk.cc:197
uint8_t compressionFactor
Superblock's compression factor.
Definition: super_blk.hh:181
uint8_t calculateCompressionFactor(const std::size_t size) const
Calculate the compression factor (cf) given a compressed size and the maximum compression ratio.
Definition: super_blk.cc:214
uint8_t getCompressionFactor() const
Get the compression factor of this superblock.
Definition: super_blk.cc:227
virtual void invalidate()
Invalidate the block.
constexpr uint64_t alignToPowerOfTwo(uint64_t val)
Align to the next highest power of two.
Definition: bitfield.hh:369
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
std::string csprintf(const char *format, const Args &...args)
Definition: cprintf.hh:161
Copyright (c) 2018 Inria All rights reserved.

Generated on Wed Dec 21 2022 10:22:37 for gem5 by doxygen 1.9.1