113944Sodanrc@yahoo.com.br/* 213944Sodanrc@yahoo.com.br * Copyright (c) 2018 Inria 313944Sodanrc@yahoo.com.br * All rights reserved. 413944Sodanrc@yahoo.com.br * 513944Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without 613944Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are 713944Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright 813944Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer; 913944Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright 1013944Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the 1113944Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution; 1213944Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its 1313944Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from 1413944Sodanrc@yahoo.com.br * this software without specific prior written permission. 1513944Sodanrc@yahoo.com.br * 1613944Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713944Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813944Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913944Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013944Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113944Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213944Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313944Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413944Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513944Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613944Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713944Sodanrc@yahoo.com.br * 2813944Sodanrc@yahoo.com.br * Authors: Daniel Carvalho 2913944Sodanrc@yahoo.com.br */ 3013944Sodanrc@yahoo.com.br 3113944Sodanrc@yahoo.com.br/** @file 3213944Sodanrc@yahoo.com.br * Definition of "Base-Delta-Immediate Compression: Practical Data Compression 3313944Sodanrc@yahoo.com.br * for On-Chip Caches". 3413944Sodanrc@yahoo.com.br */ 3513944Sodanrc@yahoo.com.br 3613944Sodanrc@yahoo.com.br#ifndef __MEM_CACHE_COMPRESSORS_BDI_HH__ 3713944Sodanrc@yahoo.com.br#define __MEM_CACHE_COMPRESSORS_BDI_HH__ 3813944Sodanrc@yahoo.com.br 3913944Sodanrc@yahoo.com.br#include <cstdint> 4013944Sodanrc@yahoo.com.br#include <memory> 4113944Sodanrc@yahoo.com.br#include <vector> 4213944Sodanrc@yahoo.com.br 4313944Sodanrc@yahoo.com.br#include "base/types.hh" 4413944Sodanrc@yahoo.com.br#include "mem/cache/compressors/base.hh" 4513944Sodanrc@yahoo.com.br 4613944Sodanrc@yahoo.com.brstruct BDIParams; 4713944Sodanrc@yahoo.com.br 4813944Sodanrc@yahoo.com.br/** 4913944Sodanrc@yahoo.com.br * Default maximum number of bases in the original BDI. 5013944Sodanrc@yahoo.com.br */ 5113944Sodanrc@yahoo.com.br#define BDI_DEFAULT_MAX_NUM_BASES 2 5213944Sodanrc@yahoo.com.br 5313944Sodanrc@yahoo.com.brclass BDI : public BaseCacheCompressor 5413944Sodanrc@yahoo.com.br{ 5513944Sodanrc@yahoo.com.br protected: 5613944Sodanrc@yahoo.com.br /** 5713944Sodanrc@yahoo.com.br * Forward declaration of comp data classes. 5813944Sodanrc@yahoo.com.br */ 5913944Sodanrc@yahoo.com.br class BDICompData; 6013944Sodanrc@yahoo.com.br class BDICompDataZeros; 6113944Sodanrc@yahoo.com.br class BDICompDataRep; 6213944Sodanrc@yahoo.com.br class BDICompDataUncompressed; 6313944Sodanrc@yahoo.com.br template <class TB, class TD> class BDICompDataBaseDelta; 6413944Sodanrc@yahoo.com.br 6513944Sodanrc@yahoo.com.br /** 6613944Sodanrc@yahoo.com.br * The possible encoding values. If modified, ENCODING_NAMES must be too. 6713944Sodanrc@yahoo.com.br */ 6813944Sodanrc@yahoo.com.br enum ENCODING {ZERO, REP_VALUES, BASE8_1, BASE8_2, BASE8_4, BASE4_1, 6913944Sodanrc@yahoo.com.br BASE4_2, BASE2_1, UNCOMPRESSED, NUM_ENCODINGS}; 7013944Sodanrc@yahoo.com.br 7113944Sodanrc@yahoo.com.br /** 7213944Sodanrc@yahoo.com.br * The respective encoding names. They are indexed by the ENCODING enum. 7313944Sodanrc@yahoo.com.br * The values are assigned in the source file, and should be modified if 7413944Sodanrc@yahoo.com.br * ENCODING is changed. 7513944Sodanrc@yahoo.com.br */ 7613944Sodanrc@yahoo.com.br static const char* ENCODING_NAMES[]; 7713944Sodanrc@yahoo.com.br 7813944Sodanrc@yahoo.com.br /** 7913944Sodanrc@yahoo.com.br * If set, create multiple compressor instances for each possible 8013944Sodanrc@yahoo.com.br * combination of base and delta size. Otherwise, just create a 8113944Sodanrc@yahoo.com.br * compressor for each base size with the highest available delta 8213944Sodanrc@yahoo.com.br * size. This can be used to save area and power (having less 8313944Sodanrc@yahoo.com.br * compressors). True by default. 8413944Sodanrc@yahoo.com.br */ 8513944Sodanrc@yahoo.com.br const bool useMoreCompressors; 8613944Sodanrc@yahoo.com.br 8713944Sodanrc@yahoo.com.br /** 8813944Sodanrc@yahoo.com.br * Number of qwords in a cache line. 8913944Sodanrc@yahoo.com.br */ 9013944Sodanrc@yahoo.com.br const std::size_t qwordsPerCacheLine; 9113944Sodanrc@yahoo.com.br 9213944Sodanrc@yahoo.com.br /** 9313944Sodanrc@yahoo.com.br * @defgroup CompressionStats Compression specific statistics. 9413944Sodanrc@yahoo.com.br * @{ 9513944Sodanrc@yahoo.com.br */ 9613944Sodanrc@yahoo.com.br 9713944Sodanrc@yahoo.com.br /** 9813944Sodanrc@yahoo.com.br * Number of data entries that were compressed to each encoding. 9913944Sodanrc@yahoo.com.br */ 10013944Sodanrc@yahoo.com.br Stats::Vector encodingStats; 10113944Sodanrc@yahoo.com.br 10213944Sodanrc@yahoo.com.br /** 10313944Sodanrc@yahoo.com.br * @} 10413944Sodanrc@yahoo.com.br */ 10513944Sodanrc@yahoo.com.br 10613944Sodanrc@yahoo.com.br /** 10713944Sodanrc@yahoo.com.br * Check if the cache line consists of only zero values. 10813944Sodanrc@yahoo.com.br * 10913944Sodanrc@yahoo.com.br * @param data The cache line. 11013944Sodanrc@yahoo.com.br * @return True if it is a ZERO cache line. 11113944Sodanrc@yahoo.com.br */ 11213944Sodanrc@yahoo.com.br bool isZeroPackable(const uint64_t* data) const; 11313944Sodanrc@yahoo.com.br 11413944Sodanrc@yahoo.com.br /** 11513944Sodanrc@yahoo.com.br * Check if the cache line consists only of same values. 11613944Sodanrc@yahoo.com.br * 11713944Sodanrc@yahoo.com.br * @param data The cache line. 11813944Sodanrc@yahoo.com.br * @return True if it is a REP_VALUES cache line. 11913944Sodanrc@yahoo.com.br */ 12013944Sodanrc@yahoo.com.br bool isSameValuePackable(const uint64_t* data) const; 12113944Sodanrc@yahoo.com.br 12213944Sodanrc@yahoo.com.br /** 12313944Sodanrc@yahoo.com.br * Instantiate a BaseDelta compressor with given TB and TD, and try to 12413944Sodanrc@yahoo.com.br * compress the cache line. If the compression fails, it returns a nullptr. 12513944Sodanrc@yahoo.com.br * @sa BDICompDataBaseDelta 12613944Sodanrc@yahoo.com.br * 12713944Sodanrc@yahoo.com.br * @tparam TB Type of a base entry. 12813944Sodanrc@yahoo.com.br * @tparam TD Type of a delta entry. 12913944Sodanrc@yahoo.com.br * @param data The cache line to be compressed. 13013944Sodanrc@yahoo.com.br * @param encoding Encoding value for given TB-TD combination. 13113944Sodanrc@yahoo.com.br * @return Cache line after compression or nullptr. 13213944Sodanrc@yahoo.com.br */ 13313944Sodanrc@yahoo.com.br template <class TB, class TD> 13413944Sodanrc@yahoo.com.br std::unique_ptr<BDICompData> tryCompress(const uint64_t* data, 13513944Sodanrc@yahoo.com.br const uint8_t encoding) const; 13613944Sodanrc@yahoo.com.br 13713944Sodanrc@yahoo.com.br /** 13813944Sodanrc@yahoo.com.br * Apply compression. 13913944Sodanrc@yahoo.com.br * 14013944Sodanrc@yahoo.com.br * @param data The cache line to be compressed. 14113944Sodanrc@yahoo.com.br * @param comp_lat Compression latency in number of cycles. 14213944Sodanrc@yahoo.com.br * @param decomp_lat Decompression latency in number of cycles. 14313944Sodanrc@yahoo.com.br * @param comp_size Compressed data size. 14413944Sodanrc@yahoo.com.br */ 14513944Sodanrc@yahoo.com.br std::unique_ptr<BaseCacheCompressor::CompressionData> compress( 14613944Sodanrc@yahoo.com.br const uint64_t* data, Cycles& comp_lat, Cycles& decomp_lat) override; 14713944Sodanrc@yahoo.com.br 14813944Sodanrc@yahoo.com.br /** 14913944Sodanrc@yahoo.com.br * Decompress data. 15013944Sodanrc@yahoo.com.br * 15113944Sodanrc@yahoo.com.br * @param comp_data Compressed cache line. 15213944Sodanrc@yahoo.com.br * @param data The cache line to be decompressed. 15313944Sodanrc@yahoo.com.br * @return Decompression latency in number of cycles. 15413944Sodanrc@yahoo.com.br */ 15513944Sodanrc@yahoo.com.br void decompress(const BaseCacheCompressor::CompressionData* comp_data, 15613944Sodanrc@yahoo.com.br uint64_t* data) override; 15713944Sodanrc@yahoo.com.br 15813944Sodanrc@yahoo.com.br public: 15913944Sodanrc@yahoo.com.br /** Convenience typedef. */ 16013944Sodanrc@yahoo.com.br typedef BDIParams Params; 16113944Sodanrc@yahoo.com.br 16213944Sodanrc@yahoo.com.br /** 16313944Sodanrc@yahoo.com.br * Default constructor. 16413944Sodanrc@yahoo.com.br */ 16513944Sodanrc@yahoo.com.br BDI(const Params *p); 16613944Sodanrc@yahoo.com.br 16713944Sodanrc@yahoo.com.br /** 16813944Sodanrc@yahoo.com.br * Default destructor. 16913944Sodanrc@yahoo.com.br */ 17013944Sodanrc@yahoo.com.br ~BDI() = default; 17113944Sodanrc@yahoo.com.br 17213944Sodanrc@yahoo.com.br /** 17313944Sodanrc@yahoo.com.br * Register local statistics. 17413944Sodanrc@yahoo.com.br */ 17513944Sodanrc@yahoo.com.br void regStats() override; 17613944Sodanrc@yahoo.com.br}; 17713944Sodanrc@yahoo.com.br 17813944Sodanrc@yahoo.com.br/** 17913944Sodanrc@yahoo.com.br * Template for the BDI compression data. 18013944Sodanrc@yahoo.com.br */ 18113944Sodanrc@yahoo.com.brclass BDI::BDICompData : public CompressionData 18213944Sodanrc@yahoo.com.br{ 18313944Sodanrc@yahoo.com.br private: 18413944Sodanrc@yahoo.com.br /** 18513944Sodanrc@yahoo.com.br * Data encoding. 18613944Sodanrc@yahoo.com.br * @sa BDI 18713944Sodanrc@yahoo.com.br */ 18813944Sodanrc@yahoo.com.br const uint8_t _encoding; 18913944Sodanrc@yahoo.com.br 19013944Sodanrc@yahoo.com.br protected: 19113944Sodanrc@yahoo.com.br /** 19213944Sodanrc@yahoo.com.br * Number of bits needed for the encoding field. 19313944Sodanrc@yahoo.com.br */ 19413944Sodanrc@yahoo.com.br static const std::size_t encodingBits = 4; 19513944Sodanrc@yahoo.com.br 19613944Sodanrc@yahoo.com.br /** 19713944Sodanrc@yahoo.com.br * Calculate and set compressed data size. 19813944Sodanrc@yahoo.com.br * Each BDI compressor generates compressed data with different sizes. 19913944Sodanrc@yahoo.com.br */ 20013944Sodanrc@yahoo.com.br virtual void calculateCompressedSize() = 0; 20113944Sodanrc@yahoo.com.br 20213944Sodanrc@yahoo.com.br public: 20313944Sodanrc@yahoo.com.br /** 20413944Sodanrc@yahoo.com.br * Default constructor. 20513944Sodanrc@yahoo.com.br * 20613944Sodanrc@yahoo.com.br * @param encoding The encoding value. 20713944Sodanrc@yahoo.com.br */ 20813944Sodanrc@yahoo.com.br BDICompData(const uint8_t encoding); 20913944Sodanrc@yahoo.com.br 21013944Sodanrc@yahoo.com.br /** 21113944Sodanrc@yahoo.com.br * Default destructor. 21213944Sodanrc@yahoo.com.br */ 21313944Sodanrc@yahoo.com.br virtual ~BDICompData() = default; 21413944Sodanrc@yahoo.com.br 21513944Sodanrc@yahoo.com.br /** 21613944Sodanrc@yahoo.com.br * Get and decompress data at given index. 21713944Sodanrc@yahoo.com.br * 21813944Sodanrc@yahoo.com.br * The index is given relative to 64-bit entries, therefore if the base 21913944Sodanrc@yahoo.com.br * size of the given compressed data is smaller than that, this function 22013944Sodanrc@yahoo.com.br * joins multiple base-delta entries to generate the respective 64-bit 22113944Sodanrc@yahoo.com.br * entry. 22213944Sodanrc@yahoo.com.br * 22313944Sodanrc@yahoo.com.br * @param index The index of the compressed data. 22413944Sodanrc@yahoo.com.br * @return Decompressed data for the given index. 22513944Sodanrc@yahoo.com.br */ 22613944Sodanrc@yahoo.com.br virtual uint64_t access(const int index) const = 0; 22713944Sodanrc@yahoo.com.br 22813944Sodanrc@yahoo.com.br /** 22913944Sodanrc@yahoo.com.br * Get encoding. 23013944Sodanrc@yahoo.com.br * 23113944Sodanrc@yahoo.com.br * @return The encoding. 23213944Sodanrc@yahoo.com.br */ 23313944Sodanrc@yahoo.com.br uint8_t getEncoding() const; 23413944Sodanrc@yahoo.com.br 23513944Sodanrc@yahoo.com.br /** 23613944Sodanrc@yahoo.com.br * Get encoding name. 23713944Sodanrc@yahoo.com.br * 23813944Sodanrc@yahoo.com.br * @return The encoding name. 23913944Sodanrc@yahoo.com.br */ 24013944Sodanrc@yahoo.com.br std::string getName() const; 24113944Sodanrc@yahoo.com.br}; 24213944Sodanrc@yahoo.com.br 24313944Sodanrc@yahoo.com.br/** 24413944Sodanrc@yahoo.com.br * BDI compressed data containing the ZERO encoding. 24513944Sodanrc@yahoo.com.br */ 24613944Sodanrc@yahoo.com.brclass BDI::BDICompDataZeros : public BDICompData 24713944Sodanrc@yahoo.com.br{ 24813944Sodanrc@yahoo.com.br protected: 24913944Sodanrc@yahoo.com.br /** 25013944Sodanrc@yahoo.com.br * Calculate compressed data size using ZERO encoding. 25113944Sodanrc@yahoo.com.br */ 25213944Sodanrc@yahoo.com.br void calculateCompressedSize() override; 25313944Sodanrc@yahoo.com.br 25413944Sodanrc@yahoo.com.br public: 25513944Sodanrc@yahoo.com.br /** 25613944Sodanrc@yahoo.com.br * Default constructor. 25713944Sodanrc@yahoo.com.br */ 25813944Sodanrc@yahoo.com.br BDICompDataZeros(); 25913944Sodanrc@yahoo.com.br 26013944Sodanrc@yahoo.com.br /** 26113944Sodanrc@yahoo.com.br * Get and decompress data at given index. Must always return 0. 26213944Sodanrc@yahoo.com.br * 26313944Sodanrc@yahoo.com.br * @param index The index of the compressed data. 26413944Sodanrc@yahoo.com.br * @return Decompressed data for the given index. 26513944Sodanrc@yahoo.com.br */ 26613944Sodanrc@yahoo.com.br uint64_t access(const int index) const override; 26713944Sodanrc@yahoo.com.br}; 26813944Sodanrc@yahoo.com.br 26913944Sodanrc@yahoo.com.br/** 27013944Sodanrc@yahoo.com.br * BDI compressed data containing the REP_VALUES encoding. 27113944Sodanrc@yahoo.com.br */ 27213944Sodanrc@yahoo.com.brclass BDI::BDICompDataRep : public BDICompData 27313944Sodanrc@yahoo.com.br{ 27413944Sodanrc@yahoo.com.br private: 27513944Sodanrc@yahoo.com.br /** 27613944Sodanrc@yahoo.com.br * The repeated value. 27713944Sodanrc@yahoo.com.br */ 27813944Sodanrc@yahoo.com.br uint64_t base; 27913944Sodanrc@yahoo.com.br 28013944Sodanrc@yahoo.com.br protected: 28113944Sodanrc@yahoo.com.br /** 28213944Sodanrc@yahoo.com.br * Calculate compressed data size using REP_VALUES encoding. 28313944Sodanrc@yahoo.com.br */ 28413944Sodanrc@yahoo.com.br void calculateCompressedSize() override; 28513944Sodanrc@yahoo.com.br 28613944Sodanrc@yahoo.com.br public: 28713944Sodanrc@yahoo.com.br /** 28813944Sodanrc@yahoo.com.br * Default constructor. 28913944Sodanrc@yahoo.com.br * 29013944Sodanrc@yahoo.com.br * @param rep_value The repeated value. 29113944Sodanrc@yahoo.com.br */ 29213944Sodanrc@yahoo.com.br BDICompDataRep(const uint64_t rep_value); 29313944Sodanrc@yahoo.com.br 29413944Sodanrc@yahoo.com.br /** 29513944Sodanrc@yahoo.com.br * Get and decompress data at given index. Must always return the same 29613944Sodanrc@yahoo.com.br * value as data[0]. 29713944Sodanrc@yahoo.com.br * 29813944Sodanrc@yahoo.com.br * @param index The index of the compressed data. 29913944Sodanrc@yahoo.com.br * @return Decompressed data for the given index. 30013944Sodanrc@yahoo.com.br */ 30113944Sodanrc@yahoo.com.br uint64_t access(const int index) const override; 30213944Sodanrc@yahoo.com.br}; 30313944Sodanrc@yahoo.com.br 30413944Sodanrc@yahoo.com.br/** 30513944Sodanrc@yahoo.com.br * BDI compressed data containing the UNCOMPRESSED encoding. 30613944Sodanrc@yahoo.com.br */ 30713944Sodanrc@yahoo.com.brclass BDI::BDICompDataUncompressed : public BDICompData 30813944Sodanrc@yahoo.com.br{ 30913944Sodanrc@yahoo.com.br private: 31013944Sodanrc@yahoo.com.br /** 31113944Sodanrc@yahoo.com.br * Uncompressed cache line size (in bytes). 31213944Sodanrc@yahoo.com.br */ 31313944Sodanrc@yahoo.com.br const std::size_t blkSize; 31413944Sodanrc@yahoo.com.br 31513944Sodanrc@yahoo.com.br /** 31613944Sodanrc@yahoo.com.br * The compressed data is the original cache line. 31713944Sodanrc@yahoo.com.br */ 31813944Sodanrc@yahoo.com.br const std::vector<uint64_t> _data; 31913944Sodanrc@yahoo.com.br 32013944Sodanrc@yahoo.com.br protected: 32113944Sodanrc@yahoo.com.br /** 32213944Sodanrc@yahoo.com.br * Calculate compressed data size using UNCOMPRESSED encoding. 32313944Sodanrc@yahoo.com.br */ 32413944Sodanrc@yahoo.com.br void calculateCompressedSize() override; 32513944Sodanrc@yahoo.com.br 32613944Sodanrc@yahoo.com.br public: 32713944Sodanrc@yahoo.com.br /** 32813944Sodanrc@yahoo.com.br * Default constructor. 32913944Sodanrc@yahoo.com.br * 33013944Sodanrc@yahoo.com.br * @param data The data on which compression was applied. 33113944Sodanrc@yahoo.com.br * @param blk_size Size of a cache line in bytes. 33213944Sodanrc@yahoo.com.br */ 33313944Sodanrc@yahoo.com.br BDICompDataUncompressed(const uint64_t* data, 33413944Sodanrc@yahoo.com.br const std::size_t blk_size); 33513944Sodanrc@yahoo.com.br 33613944Sodanrc@yahoo.com.br /** 33713944Sodanrc@yahoo.com.br * Get and decompress data at given index. Must return the same 33813944Sodanrc@yahoo.com.br * value as _data[index]. 33913944Sodanrc@yahoo.com.br * 34013944Sodanrc@yahoo.com.br * @param index The index of the compressed data. 34113944Sodanrc@yahoo.com.br * @return Decompressed data for the given index. 34213944Sodanrc@yahoo.com.br */ 34313944Sodanrc@yahoo.com.br uint64_t access(const int index) const override; 34413944Sodanrc@yahoo.com.br}; 34513944Sodanrc@yahoo.com.br 34613944Sodanrc@yahoo.com.br/** 34713944Sodanrc@yahoo.com.br * Template class for BDI compressed data containing all the BASE_DELTA 34813944Sodanrc@yahoo.com.br * encodings. TB's size must always be greater than TD's. 34913944Sodanrc@yahoo.com.br * 35013944Sodanrc@yahoo.com.br * @tparam TB Type of a base entry. 35113944Sodanrc@yahoo.com.br * @tparam TD Type of a delta entry. 35213944Sodanrc@yahoo.com.br*/ 35313944Sodanrc@yahoo.com.brtemplate <class TB, class TD> 35413944Sodanrc@yahoo.com.brclass BDI::BDICompDataBaseDelta : public BDICompData 35513944Sodanrc@yahoo.com.br{ 35613944Sodanrc@yahoo.com.br protected: 35713944Sodanrc@yahoo.com.br /** 35813944Sodanrc@yahoo.com.br * Maximum number of bases. 35913944Sodanrc@yahoo.com.br */ 36013944Sodanrc@yahoo.com.br const std::size_t maxNumBases; 36113944Sodanrc@yahoo.com.br 36213944Sodanrc@yahoo.com.br /** 36313944Sodanrc@yahoo.com.br * Bit mask to differentiate between the bases. 36413944Sodanrc@yahoo.com.br */ 36513944Sodanrc@yahoo.com.br std::vector<uint8_t> bitMask; 36613944Sodanrc@yahoo.com.br 36713944Sodanrc@yahoo.com.br /** 36813944Sodanrc@yahoo.com.br * Bases. bases[0] is 0 and is not stored in a hardware implementation. 36913944Sodanrc@yahoo.com.br */ 37013944Sodanrc@yahoo.com.br std::vector<TB> bases; 37113944Sodanrc@yahoo.com.br 37213944Sodanrc@yahoo.com.br /** 37313944Sodanrc@yahoo.com.br * Array of deltas (or immediate values). 37413944Sodanrc@yahoo.com.br */ 37513944Sodanrc@yahoo.com.br std::vector<TD> deltas; 37613944Sodanrc@yahoo.com.br 37713944Sodanrc@yahoo.com.br /** 37813944Sodanrc@yahoo.com.br * Add a base to the bases vector. 37913944Sodanrc@yahoo.com.br * 38013944Sodanrc@yahoo.com.br * @param base The base to be added. 38113944Sodanrc@yahoo.com.br * @return True on success, false if already used all base slots. 38213944Sodanrc@yahoo.com.br */ 38313944Sodanrc@yahoo.com.br bool addBase(const TB base); 38413944Sodanrc@yahoo.com.br 38513944Sodanrc@yahoo.com.br /** 38613944Sodanrc@yahoo.com.br * Add a delta to the deltas vector. 38713944Sodanrc@yahoo.com.br * 38813944Sodanrc@yahoo.com.br * @param base_index Base to which the delta refers. 38913944Sodanrc@yahoo.com.br * @param delta The delta value. 39013944Sodanrc@yahoo.com.br */ 39113944Sodanrc@yahoo.com.br void addDelta(const std::size_t base_index, const TD delta); 39213944Sodanrc@yahoo.com.br 39313944Sodanrc@yahoo.com.br /** 39413944Sodanrc@yahoo.com.br * Calculate compressed data size using number of bases, the base size and 39513944Sodanrc@yahoo.com.br * the delta size. 39613944Sodanrc@yahoo.com.br */ 39713944Sodanrc@yahoo.com.br void calculateCompressedSize() override; 39813944Sodanrc@yahoo.com.br 39913944Sodanrc@yahoo.com.br public: 40013944Sodanrc@yahoo.com.br /** 40113944Sodanrc@yahoo.com.br * Default constructor. 40213944Sodanrc@yahoo.com.br * 40313944Sodanrc@yahoo.com.br * @param encoding The encoding value for this compressor. 40413944Sodanrc@yahoo.com.br * @param blk_size Size of a cache line in bytes. 40513944Sodanrc@yahoo.com.br * @param max_num_bases Maximum number of bases allowed to be stored. 40613944Sodanrc@yahoo.com.br */ 40713944Sodanrc@yahoo.com.br BDICompDataBaseDelta(const uint8_t encoding, const std::size_t blk_size, 40813944Sodanrc@yahoo.com.br const std::size_t max_num_bases = BDI_DEFAULT_MAX_NUM_BASES); 40913944Sodanrc@yahoo.com.br 41013944Sodanrc@yahoo.com.br /** 41113944Sodanrc@yahoo.com.br * Get and decompress data at given index. 41213944Sodanrc@yahoo.com.br * 41313944Sodanrc@yahoo.com.br * @param index The index of the compressed data. 41413944Sodanrc@yahoo.com.br * @return Decompressed data for the given index. 41513944Sodanrc@yahoo.com.br */ 41613944Sodanrc@yahoo.com.br uint64_t access(const int index) const override; 41713944Sodanrc@yahoo.com.br 41813944Sodanrc@yahoo.com.br /** 41913944Sodanrc@yahoo.com.br * Apply base delta compression. 42013944Sodanrc@yahoo.com.br * 42113944Sodanrc@yahoo.com.br * @param data The data on which compression was applied. 42213944Sodanrc@yahoo.com.br * @param blk_size Size of a cache line in bytes. 42313944Sodanrc@yahoo.com.br * @return True on success. 42413944Sodanrc@yahoo.com.br */ 42513944Sodanrc@yahoo.com.br bool compress(const uint64_t* data, const std::size_t blk_size); 42613944Sodanrc@yahoo.com.br}; 42713944Sodanrc@yahoo.com.br 42813944Sodanrc@yahoo.com.br#endif //__MEM_CACHE_COMPRESSORS_BDI_HH__ 429