compressed_tags.cc (13946:8e96e9be7f2c) | compressed_tags.cc (13947:4cf8087cab09) |
---|---|
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; --- 49 unchanged lines hidden (view full) --- 58 // Initialize all blocks 59 unsigned blk_index = 0; // index into blks array 60 for (unsigned superblock_index = 0; superblock_index < numSectors; 61 superblock_index++) 62 { 63 // Locate next cache superblock 64 SuperBlk* superblock = &superBlks[superblock_index]; 65 | 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; --- 49 unchanged lines hidden (view full) --- 58 // Initialize all blocks 59 unsigned blk_index = 0; // index into blks array 60 for (unsigned superblock_index = 0; superblock_index < numSectors; 61 superblock_index++) 62 { 63 // Locate next cache superblock 64 SuperBlk* superblock = &superBlks[superblock_index]; 65 |
66 // Superblocks must be aware of the block size due to their co- 67 // allocation conditions 68 superblock->setBlkSize(blkSize); 69 |
|
66 // Link block to indexing policy 67 indexingPolicy->setEntry(superblock, superblock_index); 68 69 // Associate a replacement data entry to the block 70 superblock->replacementData = replacementPolicy->instantiateEntry(); 71 72 // Initialize all blocks in this superblock 73 superblock->blks.resize(numBlocksPerSector, nullptr); --- 17 unchanged lines hidden (view full) --- 91 blk->setSectorOffset(k); 92 93 // Update block index 94 ++blk_index; 95 } 96 } 97} 98 | 70 // Link block to indexing policy 71 indexingPolicy->setEntry(superblock, superblock_index); 72 73 // Associate a replacement data entry to the block 74 superblock->replacementData = replacementPolicy->instantiateEntry(); 75 76 // Initialize all blocks in this superblock 77 superblock->blks.resize(numBlocksPerSector, nullptr); --- 17 unchanged lines hidden (view full) --- 95 blk->setSectorOffset(k); 96 97 // Update block index 98 ++blk_index; 99 } 100 } 101} 102 |
99bool 100CompressedTags::canCoAllocate(const SuperBlk* superblock, 101 const std::size_t compressed_size) const 102{ 103 // Simple co-allocation function: at most numBlocksPerSector blocks that 104 // compress at least to (100/numBlocksPerSector)% of their original size 105 // can share a superblock 106 return superblock->isCompressed() && 107 (compressed_size <= (blkSize * 8) / numBlocksPerSector); 108} 109 | |
110CacheBlk* 111CompressedTags::findVictim(Addr addr, const bool is_secure, 112 const std::size_t compressed_size, 113 std::vector<CacheBlk*>& evict_blks) const 114{ 115 // Get all possible locations of this superblock 116 const std::vector<ReplaceableEntry*> superblock_entries = 117 indexingPolicy->getPossibleEntries(addr); --- 4 unchanged lines hidden (view full) --- 122 SuperBlk* victim_superblock = nullptr; 123 bool is_co_allocation = false; 124 const uint64_t offset = extractSectorOffset(addr); 125 for (const auto& entry : superblock_entries){ 126 SuperBlk* superblock = static_cast<SuperBlk*>(entry); 127 if ((tag == superblock->getTag()) && superblock->isValid() && 128 (is_secure == superblock->isSecure()) && 129 !superblock->blks[offset]->isValid() && | 103CacheBlk* 104CompressedTags::findVictim(Addr addr, const bool is_secure, 105 const std::size_t compressed_size, 106 std::vector<CacheBlk*>& evict_blks) const 107{ 108 // Get all possible locations of this superblock 109 const std::vector<ReplaceableEntry*> superblock_entries = 110 indexingPolicy->getPossibleEntries(addr); --- 4 unchanged lines hidden (view full) --- 115 SuperBlk* victim_superblock = nullptr; 116 bool is_co_allocation = false; 117 const uint64_t offset = extractSectorOffset(addr); 118 for (const auto& entry : superblock_entries){ 119 SuperBlk* superblock = static_cast<SuperBlk*>(entry); 120 if ((tag == superblock->getTag()) && superblock->isValid() && 121 (is_secure == superblock->isSecure()) && 122 !superblock->blks[offset]->isValid() && |
130 canCoAllocate(superblock, compressed_size)) | 123 superblock->isCompressed() && 124 superblock->canCoAllocate(compressed_size)) |
131 { 132 victim_superblock = superblock; 133 is_co_allocation = true; 134 break; 135 } 136 } 137 138 // If the superblock is not present or cannot be co-allocated a --- 27 unchanged lines hidden (view full) --- 166 } 167 168 return victim; 169} 170 171void 172CompressedTags::insertBlock(const PacketPtr pkt, CacheBlk *blk) 173{ | 125 { 126 victim_superblock = superblock; 127 is_co_allocation = true; 128 break; 129 } 130 } 131 132 // If the superblock is not present or cannot be co-allocated a --- 27 unchanged lines hidden (view full) --- 160 } 161 162 return victim; 163} 164 165void 166CompressedTags::insertBlock(const PacketPtr pkt, CacheBlk *blk) 167{ |
168 // We check if block can co-allocate before inserting, because this check 169 // assumes the block is still invalid 170 CompressionBlk* compression_blk = static_cast<CompressionBlk*>(blk); 171 const SuperBlk* superblock = static_cast<const SuperBlk*>( 172 compression_blk->getSectorBlock()); 173 const bool is_co_allocatable = superblock->isCompressed() && 174 superblock->canCoAllocate(compression_blk->getSizeBits()); 175 |
|
174 // Insert block 175 SectorTags::insertBlock(pkt, blk); 176 | 176 // Insert block 177 SectorTags::insertBlock(pkt, blk); 178 |
177 // @todo We always store compressed blocks when possible 178 CompressionBlk* compression_blk = static_cast<CompressionBlk*>(blk); 179 compression_blk->setUncompressed(); | 179 // We always store compressed blocks when possible 180 if (is_co_allocatable) { 181 compression_blk->setCompressed(); 182 } else { 183 compression_blk->setUncompressed(); 184 } |
180} 181 182void 183CompressedTags::forEachBlk(std::function<void(CacheBlk &)> visitor) 184{ 185 for (CompressionBlk& blk : blks) { 186 visitor(blk); 187 } --- 18 unchanged lines hidden --- | 185} 186 187void 188CompressedTags::forEachBlk(std::function<void(CacheBlk &)> visitor) 189{ 190 for (CompressionBlk& blk : blks) { 191 visitor(blk); 192 } --- 18 unchanged lines hidden --- |