gem5  v21.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
compressed_tags.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Inria
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 
35 
36 #include "base/trace.hh"
37 #include "debug/CacheComp.hh"
41 #include "mem/packet.hh"
42 #include "params/CompressedTags.hh"
43 
45  : SectorTags(p)
46 {
47 }
48 
49 void
51 {
52  // Create blocks and superblocks
55 
56  // Initialize all blocks
57  unsigned blk_index = 0; // index into blks array
58  for (unsigned superblock_index = 0; superblock_index < numSectors;
59  superblock_index++)
60  {
61  // Locate next cache superblock
62  SuperBlk* superblock = &superBlks[superblock_index];
63 
64  // Superblocks must be aware of the block size due to their co-
65  // allocation conditions
66  superblock->setBlkSize(blkSize);
67 
68  // Associate a replacement data entry to the block
70 
71  // Initialize all blocks in this superblock
72  superblock->blks.resize(numBlocksPerSector, nullptr);
73  for (unsigned k = 0; k < numBlocksPerSector; ++k){
74  // Select block within the set to be linked
75  SectorSubBlk*& blk = superblock->blks[k];
76 
77  // Locate next cache block
78  blk = &blks[blk_index];
79 
80  // Associate a data chunk to the block
81  blk->data = &dataBlks[blkSize*blk_index];
82 
83  // Associate superblock to this block
84  blk->setSectorBlock(superblock);
85 
86  // Associate the superblock replacement data to this block
87  blk->replacementData = superblock->replacementData;
88 
89  // Set its index and sector offset
90  blk->setSectorOffset(k);
91 
92  // Update block index
93  ++blk_index;
94  }
95 
96  // Link block to indexing policy
97  indexingPolicy->setEntry(superblock, superblock_index);
98  }
99 }
100 
101 CacheBlk*
102 CompressedTags::findVictim(Addr addr, const bool is_secure,
103  const std::size_t compressed_size,
104  std::vector<CacheBlk*>& evict_blks)
105 {
106  // Get all possible locations of this superblock
107  const std::vector<ReplaceableEntry*> superblock_entries =
109 
110  // Check if the superblock this address belongs to has been allocated. If
111  // so, try co-allocating
112  Addr tag = extractTag(addr);
113  SuperBlk* victim_superblock = nullptr;
114  bool is_co_allocation = false;
115  const uint64_t offset = extractSectorOffset(addr);
116  for (const auto& entry : superblock_entries){
117  SuperBlk* superblock = static_cast<SuperBlk*>(entry);
118  if (superblock->matchTag(tag, is_secure) &&
119  !superblock->blks[offset]->isValid() &&
120  superblock->isCompressed() &&
121  superblock->canCoAllocate(compressed_size))
122  {
123  victim_superblock = superblock;
124  is_co_allocation = true;
125  break;
126  }
127  }
128 
129  // If the superblock is not present or cannot be co-allocated a
130  // superblock must be replaced
131  if (victim_superblock == nullptr){
132  // Choose replacement victim from replacement candidates
133  victim_superblock = static_cast<SuperBlk*>(
134  replacementPolicy->getVictim(superblock_entries));
135 
136  // The whole superblock must be evicted to make room for the new one
137  for (const auto& blk : victim_superblock->blks){
138  if (blk->isValid()) {
139  evict_blks.push_back(blk);
140  }
141  }
142  }
143 
144  // Get the location of the victim block within the superblock
145  SectorSubBlk* victim = victim_superblock->blks[offset];
146 
147  // It would be a hit if victim was valid in a co-allocation, and upgrades
148  // do not call findVictim, so it cannot happen
149  if (is_co_allocation){
150  assert(!victim->isValid());
151 
152  // Print all co-allocated blocks
153  DPRINTF(CacheComp, "Co-Allocation: offset %d of %s\n", offset,
154  victim_superblock->print());
155  }
156 
157  // Update number of sub-blocks evicted due to a replacement
158  sectorStats.evictionsReplacement[evict_blks.size()]++;
159 
160  return victim;
161 }
162 
163 void
164 CompressedTags::forEachBlk(std::function<void(CacheBlk &)> visitor)
165 {
166  for (CompressionBlk& blk : blks) {
167  visitor(blk);
168  }
169 }
170 
171 bool
172 CompressedTags::anyBlk(std::function<bool(CacheBlk &)> visitor)
173 {
174  for (CompressionBlk& blk : blks) {
175  if (visitor(blk)) {
176  return true;
177  }
178  }
179  return false;
180 }
SectorTags::extractSectorOffset
int extractSectorOffset(Addr addr) const
Calculate a block's offset in a sector from the address.
Definition: sector_tags.cc:323
ReplacementPolicy::Base::getVictim
virtual ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const =0
Find replacement victim among candidates.
BaseTags::dataBlks
std::unique_ptr< uint8_t[]> dataBlks
The data blocks, 1 per cache block.
Definition: base.hh:100
SuperBlk::canCoAllocate
bool canCoAllocate(const std::size_t compressed_size) const
Checks whether a superblock can co-allocate given compressed data block.
Definition: super_blk.cc:194
BaseTags::numBlocks
const unsigned numBlocks
the number of blocks in the cache
Definition: base.hh:97
compressed_tags.hh
CompressedTags::findVictim
CacheBlk * findVictim(Addr addr, const bool is_secure, const std::size_t compressed_size, std::vector< CacheBlk * > &evict_blks) override
Find replacement victim based on address.
Definition: compressed_tags.cc:102
SectorTags::numBlocksPerSector
const unsigned numBlocksPerSector
Number of data blocks per sector.
Definition: sector_tags.hh:79
CompressedTags::blks
std::vector< CompressionBlk > blks
The cache blocks.
Definition: compressed_tags.hh:71
SectorTags::SectorTagsStats::evictionsReplacement
Stats::Vector evictionsReplacement
Number of sub-blocks evicted due to a replacement.
Definition: sector_tags.hh:101
std::vector< CompressionBlk >
BaseTags::extractTag
virtual Addr extractTag(const Addr addr) const
Generate the tag from the given address.
Definition: base.cc:140
TaggedEntry::matchTag
virtual bool matchTag(Addr tag, bool is_secure) const
Checks if the given tag information corresponds to this entry's.
Definition: tagged_entry.hh:78
CompressedTags::forEachBlk
void forEachBlk(std::function< void(CacheBlk &)> visitor) override
Visit each sub-block in the tags and apply a visitor.
Definition: compressed_tags.cc:164
packet.hh
base.hh
replaceable_entry.hh
SectorBlk::blks
std::vector< SectorSubBlk * > blks
List of blocks associated to this sector.
Definition: sector_blk.hh:144
MipsISA::k
Bitfield< 23 > k
Definition: dt_constants.hh:78
SectorSubBlk::setSectorBlock
void setSectorBlock(SectorBlk *sector_blk)
Set sector block associated to this block.
Definition: sector_blk.cc:42
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:237
CompressedTags::anyBlk
bool anyBlk(std::function< bool(CacheBlk &)> visitor) override
Find if any of the sub-blocks satisfies a condition.
Definition: compressed_tags.cc:172
SectorTags
A SectorTags cache tag store.
Definition: sector_tags.hh:60
BaseTags::Params
BaseTagsParams Params
Definition: base.hh:158
BaseIndexingPolicy::setEntry
void setEntry(ReplaceableEntry *entry, const uint64_t index)
Associate a pointer to an entry to its physical counterpart.
Definition: base.cc:78
SectorTags::replacementPolicy
ReplacementPolicy::Base * replacementPolicy
Replacement policy.
Definition: sector_tags.hh:76
BaseTags::blkSize
const unsigned blkSize
The block size of the cache.
Definition: base.hh:74
TaggedEntry::isValid
virtual bool isValid() const
Checks if the entry is valid.
Definition: tagged_entry.hh:54
SectorTags::sectorStats
SectorTags::SectorTagsStats sectorStats
CompressedTags::CompressedTags
CompressedTags(const Params &p)
Construct and initialize this tag store.
Definition: compressed_tags.cc:44
SuperBlk::setBlkSize
void setBlkSize(const std::size_t blk_size)
Set block size.
Definition: super_blk.cc:204
ReplaceableEntry::replacementData
std::shared_ptr< ReplacementPolicy::ReplacementData > replacementData
Replacement data associated to this entry.
Definition: replaceable_entry.hh:78
base.hh
BaseTags::indexingPolicy
BaseIndexingPolicy * indexingPolicy
Indexing policy.
Definition: base.hh:86
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:148
BaseIndexingPolicy::getPossibleEntries
virtual std::vector< ReplaceableEntry * > getPossibleEntries(const Addr addr) const =0
Find all possible entries for insertion and replacement of an address.
CompressedTags::superBlks
std::vector< SuperBlk > superBlks
The cache superblocks.
Definition: compressed_tags.hh:73
ReplacementPolicy::Base::instantiateEntry
virtual std::shared_ptr< ReplacementData > instantiateEntry()=0
Instantiate a replacement data entry.
X86ISA::addr
Bitfield< 3 > addr
Definition: types.hh:80
CacheBlk::data
uint8_t * data
Contains a copy of the data in this block for easy access.
Definition: cache_blk.hh:100
SuperBlk
A basic compression superblock.
Definition: super_blk.hh:167
CacheBlk
A Basic Cache block.
Definition: cache_blk.hh:67
SectorSubBlk::setSectorOffset
void setSectorOffset(const int sector_offset)
Set offset of this sub-block within the sector.
Definition: sector_blk.cc:55
SuperBlk::isCompressed
bool isCompressed(const CompressionBlk *ignored_blk=nullptr) const
Returns whether the superblock contains compressed blocks or not.
Definition: super_blk.cc:181
SectorTags::numSectors
const unsigned numSectors
The number of sectors in the cache.
Definition: sector_tags.hh:82
SectorSubBlk
A sector is composed of sub-blocks, and each sub-block has information regarding its sector and a poi...
Definition: sector_blk.hh:48
trace.hh
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
SuperBlk::print
std::string print() const override
Print relevant information for this sector block and its sub-blocks.
Definition: super_blk.cc:241
CompressionBlk
A superblock is composed of sub-blocks, and each sub-block has information regarding its superblock a...
Definition: super_blk.hh:48
CompressedTags::tagsInit
void tagsInit() override
Initialize blocks as SuperBlk and CompressionBlk instances.
Definition: compressed_tags.cc:50
ArmISA::offset
Bitfield< 23, 0 > offset
Definition: types.hh:153

Generated on Tue Mar 23 2021 19:41:27 for gem5 by doxygen 1.8.17