42 #include "debug/CacheComp.hh"
43 #include "params/MultiCompressor.hh"
53 std::unique_ptr<Base::CompressionData> comp_data)
86 compressor->setCache(_cache);
90 std::unique_ptr<Base::CompressionData>
97 std::unique_ptr<Base::CompressionData> compData;
99 uint8_t compressionFactor;
101 Results(
unsigned index,
102 std::unique_ptr<Base::CompressionData> comp_data,
103 Cycles decomp_lat, std::size_t blk_size)
104 :
index(
index), compData(std::move(comp_data)),
105 decompLat(decomp_lat)
107 const std::size_t size = compData->getSize();
117 compressionFactor = (size > blk_size) ? 1 :
118 ((size == 0) ? blk_size :
122 struct ResultsComparator
125 operator()(
const std::shared_ptr<Results>& lhs,
126 const std::shared_ptr<Results>& rhs)
const
128 const std::size_t lhs_cf = lhs->compressionFactor;
129 const std::size_t rhs_cf = rhs->compressionFactor;
131 if (lhs_cf == rhs_cf) {
134 return lhs->decompLat > rhs->decompLat;
136 return lhs_cf < rhs_cf;
147 std::priority_queue<std::shared_ptr<Results>,
152 auto temp_comp_data =
154 temp_comp_data->setSizeBits(temp_comp_data->getSizeBits() +
156 results.push(std::make_shared<Results>(
i, std::move(temp_comp_data),
158 max_comp_lat = std::max(max_comp_lat, comp_lat);
162 const unsigned best_index = results.top()->index;
163 std::unique_ptr<CompressionData> multi_comp_data =
164 std::unique_ptr<MultiCompData>(
165 new MultiCompData(best_index, std::move(results.top()->compData)));
166 DPRINTF(CacheComp,
"Best compressor: %d\n", best_index);
172 for (
int rank = 0; rank <
compressors.size(); rank++) {
181 return multi_comp_data;
186 uint64_t* cache_line)
191 casted_comp_data->
compData.get(), cache_line);
195 : statistics::
Group(&base_group), compressor(_compressor),
196 ADD_STAT(ranks, statistics::units::Count::get(),
197 "Number of times each compressor had the nth best compression")
206 const std::size_t num_compressors = compressor.compressors.size();
207 ranks.init(num_compressors, num_compressors);
208 for (
unsigned compressor = 0; compressor < num_compressors; compressor++) {
210 ranks.subdesc(compressor,
"Number of times compressor " +
212 for (
unsigned rank = 0; rank < num_compressors; rank++) {