diff options
author | Daniel R. Carvalho <odanrc@yahoo.com.br> | 2019-09-05 17:39:38 +0200 |
---|---|---|
committer | Daniel Carvalho <odanrc@yahoo.com.br> | 2019-10-29 21:32:02 +0000 |
commit | 7a8debf0fa391a5e34fd1f47a4d1ae7ad6e3028d (patch) | |
tree | 2c17f2565bb8bd1114e9362265c5c3461d67020e /src/mem/cache/compressors/dictionary_compressor.hh | |
parent | 7ce9fe0af9f04a6f94bec9542af025a043c46b35 (diff) | |
download | gem5-7a8debf0fa391a5e34fd1f47a4d1ae7ad6e3028d.tar.xz |
mem-cache: Templatize DictionaryCompressor
Templatize DictionaryCompressor so that the dictionary entries' sizes
can be changed.
Change-Id: I3d89e3c692a721cefcd7e3c55d2ccdefa425f614
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21148
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Diffstat (limited to 'src/mem/cache/compressors/dictionary_compressor.hh')
-rw-r--r-- | src/mem/cache/compressors/dictionary_compressor.hh | 168 |
1 files changed, 98 insertions, 70 deletions
diff --git a/src/mem/cache/compressors/dictionary_compressor.hh b/src/mem/cache/compressors/dictionary_compressor.hh index 87e69ccc8..7467d5a17 100644 --- a/src/mem/cache/compressors/dictionary_compressor.hh +++ b/src/mem/cache/compressors/dictionary_compressor.hh @@ -55,9 +55,60 @@ #include "base/types.hh" #include "mem/cache/compressors/base.hh" -struct DictionaryCompressorParams; +struct BaseDictionaryCompressorParams; -class DictionaryCompressor : public BaseCacheCompressor +class BaseDictionaryCompressor : public BaseCacheCompressor +{ + protected: + /** Dictionary size. */ + const std::size_t dictionarySize; + + /** Number of valid entries in the dictionary. */ + std::size_t numEntries; + + /** + * @defgroup CompressionStats Compression specific statistics. + * @{ + */ + + /** Number of data entries that were compressed to each pattern. */ + Stats::Vector patternStats; + + /** + * @} + */ + + /** + * Trick function to get the number of patterns. + * + * @return The number of defined patterns. + */ + virtual uint64_t getNumPatterns() const = 0; + + /** + * Get meta-name assigned to the given pattern. + * + * @param number The number of the pattern. + * @return The meta-name of the pattern. + */ + virtual std::string getName(int number) const = 0; + + public: + typedef BaseDictionaryCompressorParams Params; + BaseDictionaryCompressor(const Params *p); + ~BaseDictionaryCompressor() = default; + + void regStats() override; +}; + +/** + * A template version of the dictionary compressor that allows to choose the + * dictionary size. + * + * @tparam The type of a dictionary entry (e.g., uint16_t, uint32_t, etc). + */ +template <class T> +class DictionaryCompressor : public BaseDictionaryCompressor { protected: /** @@ -69,6 +120,9 @@ class DictionaryCompressor : public BaseCacheCompressor // Forward declaration of a pattern class Pattern; + /** Convenience typedef for a dictionary entry. */ + typedef std::array<uint8_t, sizeof(T)> DictionaryEntry; + /** * Create a factory to determine if input matches a pattern. The if else * chains are constructed by recursion. The patterns should be explored @@ -78,8 +132,8 @@ class DictionaryCompressor : public BaseCacheCompressor struct Factory { static std::unique_ptr<Pattern> getPattern( - const std::array<uint8_t, 4>& bytes, - const std::array<uint8_t, 4>& dict_bytes, const int match_location) + const DictionaryEntry& bytes, const DictionaryEntry& dict_bytes, + const int match_location) { // If match this pattern, instantiate it. If a negative match // location is used, the patterns that use the dictionary bytes @@ -100,9 +154,9 @@ class DictionaryCompressor : public BaseCacheCompressor template <class Head> struct Factory<Head> { - static std::unique_ptr<Pattern> getPattern( - const std::array<uint8_t, 4>& bytes, - const std::array<uint8_t, 4>& dict_bytes, const int match_location) + static std::unique_ptr<Pattern> + getPattern(const DictionaryEntry& bytes, + const DictionaryEntry& dict_bytes, const int match_location) { // Instantiate last pattern. Should be the XXXX pattern. return std::unique_ptr<Pattern>(new Head(bytes, match_location)); @@ -110,51 +164,15 @@ class DictionaryCompressor : public BaseCacheCompressor }; /** The dictionary. */ - std::vector<std::array<uint8_t, 4>> dictionary; - - /** Dictionary size. */ - const std::size_t dictionarySize; - - /** Number of valid entries in the dictionary. */ - std::size_t numEntries; - - /** - * @defgroup CompressionStats Compression specific statistics. - * @{ - */ - - /** - * Number of data entries that were compressed to each pattern. - */ - Stats::Vector patternStats; - - /** - * @} - */ - - /** - * Trick function to get the number of patterns. - * - * @return The number of defined patterns. - */ - virtual uint64_t getNumPatterns() const = 0; - - /** - * Get meta-name assigned to the given pattern. - * - * @param number The number of the pattern. - * @return The meta-name of the pattern. - */ - virtual std::string getName(int number) const = 0; + std::vector<DictionaryEntry> dictionary; /** * Since the factory cannot be instantiated here, classes that inherit * from this base class have to implement the call to their factory's * getPattern. */ - virtual std::unique_ptr<Pattern> getPattern( - const std::array<uint8_t, 4>& bytes, - const std::array<uint8_t, 4>& dict_bytes, + virtual std::unique_ptr<Pattern> + getPattern(const DictionaryEntry& bytes, const DictionaryEntry& dict_bytes, const int match_location) const = 0; /** @@ -163,15 +181,15 @@ class DictionaryCompressor : public BaseCacheCompressor * @param data Data to be compressed. * @return The pattern this data matches. */ - std::unique_ptr<Pattern> compressWord(const uint32_t data); + std::unique_ptr<Pattern> compressValue(const T data); /** - * Decompress a word. + * Decompress a pattern into a value that fits in a dictionary entry. * * @param pattern The pattern to be decompressed. * @return The decompressed word. */ - uint32_t decompressWord(const Pattern* pattern); + T decompressValue(const Pattern* pattern); /** Clear all dictionary entries. */ void resetDictionary(); @@ -181,7 +199,7 @@ class DictionaryCompressor : public BaseCacheCompressor * * @param data The new entry. */ - virtual void addToDictionary(std::array<uint8_t, 4> data) = 0; + virtual void addToDictionary(const DictionaryEntry data) = 0; /** * Apply compression. @@ -200,18 +218,26 @@ class DictionaryCompressor : public BaseCacheCompressor */ void decompress(const CompressionData* comp_data, uint64_t* data) override; - public: - /** Convenience typedef. */ - typedef DictionaryCompressorParams Params; - - /** Default constructor. */ - DictionaryCompressor(const Params *p); + /** + * Turn a value into a dictionary entry. + * + * @param value The value to turn. + * @return A dictionary entry containing the value. + */ + static DictionaryEntry toDictionaryEntry(T value); - /** Default destructor. */ - ~DictionaryCompressor() {}; + /** + * Turn a dictionary entry into a value. + * + * @param The dictionary entry to turn. + * @return The value that the dictionary entry contained. + */ + static T fromDictionaryEntry(const DictionaryEntry& entry); - /** Register local statistics. */ - void regStats() override; + public: + typedef BaseDictionaryCompressorParams Params; + DictionaryCompressor(const Params *p); + ~DictionaryCompressor() = default; }; /** @@ -220,7 +246,8 @@ class DictionaryCompressor : public BaseCacheCompressor * decompress(). Then the new pattern must be added to the PatternFactory * declaration in crescent order of size (in the DictionaryCompressor class). */ -class DictionaryCompressor::Pattern +template <class T> +class DictionaryCompressor<T>::Pattern { protected: /** Pattern enum number. */ @@ -322,25 +349,26 @@ class DictionaryCompressor::Pattern * @param dict_bytes The bytes in the corresponding matching entry. * @return The decompressed pattern. */ - virtual std::array<uint8_t, 4> decompress( - const std::array<uint8_t, 4> dict_bytes) const = 0; + virtual DictionaryEntry decompress( + const DictionaryEntry dict_bytes) const = 0; }; -class DictionaryCompressor::CompData : public CompressionData +template <class T> +class DictionaryCompressor<T>::CompData : public CompressionData { public: /** The patterns matched in the original line. */ std::vector<std::unique_ptr<Pattern>> entries; + CompData(); + ~CompData() = default; + /** - * Default constructor. + * Add a pattern entry to the list of patterns. * - * @param dictionary_size Number of entries in the dictionary. + * @param entry The new pattern entry. */ - CompData(const std::size_t dictionary_size); - - /** Default destructor. */ - ~CompData(); + virtual void addEntry(std::unique_ptr<Pattern>); }; #endif //__MEM_CACHE_COMPRESSORS_DICTIONARY_COMPRESSOR_HH__ |