base.hh revision 13943
113942Sodanrc@yahoo.com.br/* 213942Sodanrc@yahoo.com.br * Copyright (c) 2018 Inria 313942Sodanrc@yahoo.com.br * All rights reserved. 413942Sodanrc@yahoo.com.br * 513942Sodanrc@yahoo.com.br * Redistribution and use in source and binary forms, with or without 613942Sodanrc@yahoo.com.br * modification, are permitted provided that the following conditions are 713942Sodanrc@yahoo.com.br * met: redistributions of source code must retain the above copyright 813942Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer; 913942Sodanrc@yahoo.com.br * redistributions in binary form must reproduce the above copyright 1013942Sodanrc@yahoo.com.br * notice, this list of conditions and the following disclaimer in the 1113942Sodanrc@yahoo.com.br * documentation and/or other materials provided with the distribution; 1213942Sodanrc@yahoo.com.br * neither the name of the copyright holders nor the names of its 1313942Sodanrc@yahoo.com.br * contributors may be used to endorse or promote products derived from 1413942Sodanrc@yahoo.com.br * this software without specific prior written permission. 1513942Sodanrc@yahoo.com.br * 1613942Sodanrc@yahoo.com.br * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1713942Sodanrc@yahoo.com.br * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1813942Sodanrc@yahoo.com.br * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1913942Sodanrc@yahoo.com.br * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2013942Sodanrc@yahoo.com.br * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2113942Sodanrc@yahoo.com.br * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2213942Sodanrc@yahoo.com.br * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2313942Sodanrc@yahoo.com.br * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2413942Sodanrc@yahoo.com.br * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2513942Sodanrc@yahoo.com.br * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2613942Sodanrc@yahoo.com.br * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2713942Sodanrc@yahoo.com.br * 2813942Sodanrc@yahoo.com.br * Authors: Daniel Carvalho 2913942Sodanrc@yahoo.com.br */ 3013942Sodanrc@yahoo.com.br 3113942Sodanrc@yahoo.com.br/** @file 3213942Sodanrc@yahoo.com.br * Definition of a basic cache compressor. 3313942Sodanrc@yahoo.com.br * A cache compressor must consist of a compression and a decompression 3413942Sodanrc@yahoo.com.br * methods. It must also be aware of the size of an uncompressed cache 3513942Sodanrc@yahoo.com.br * line. 3613942Sodanrc@yahoo.com.br */ 3713942Sodanrc@yahoo.com.br 3813942Sodanrc@yahoo.com.br#ifndef __MEM_CACHE_COMPRESSORS_BASE_HH__ 3913942Sodanrc@yahoo.com.br#define __MEM_CACHE_COMPRESSORS_BASE_HH__ 4013942Sodanrc@yahoo.com.br 4113942Sodanrc@yahoo.com.br#include <cstdint> 4213942Sodanrc@yahoo.com.br 4313943Sodanrc@yahoo.com.br#include "base/statistics.hh" 4413942Sodanrc@yahoo.com.br#include "base/types.hh" 4513942Sodanrc@yahoo.com.br#include "sim/sim_object.hh" 4613942Sodanrc@yahoo.com.br 4713942Sodanrc@yahoo.com.brclass CacheBlk; 4813942Sodanrc@yahoo.com.brstruct BaseCacheCompressorParams; 4913942Sodanrc@yahoo.com.br 5013942Sodanrc@yahoo.com.br/** 5113942Sodanrc@yahoo.com.br * Base cache compressor interface. Every cache compressor must implement a 5213942Sodanrc@yahoo.com.br * compression and a decompression method. 5313942Sodanrc@yahoo.com.br */ 5413942Sodanrc@yahoo.com.brclass BaseCacheCompressor : public SimObject { 5513942Sodanrc@yahoo.com.br protected: 5613942Sodanrc@yahoo.com.br /** 5713942Sodanrc@yahoo.com.br * Forward declaration of compression data. Every new compressor must 5813942Sodanrc@yahoo.com.br * create a new compression data based on it. 5913942Sodanrc@yahoo.com.br */ 6013942Sodanrc@yahoo.com.br class CompressionData; 6113942Sodanrc@yahoo.com.br 6213942Sodanrc@yahoo.com.br /** 6313942Sodanrc@yahoo.com.br * Uncompressed cache line size (in bytes). 6413942Sodanrc@yahoo.com.br */ 6513942Sodanrc@yahoo.com.br const std::size_t blkSize; 6613942Sodanrc@yahoo.com.br 6713942Sodanrc@yahoo.com.br /** 6813943Sodanrc@yahoo.com.br * @defgroup CompressionStats Compression specific statistics. 6913943Sodanrc@yahoo.com.br * @{ 7013943Sodanrc@yahoo.com.br */ 7113943Sodanrc@yahoo.com.br 7213943Sodanrc@yahoo.com.br /** Number of blocks that were compressed to this power of two size. */ 7313943Sodanrc@yahoo.com.br Stats::Vector compressionSize; 7413943Sodanrc@yahoo.com.br 7513943Sodanrc@yahoo.com.br /** 7613943Sodanrc@yahoo.com.br * @} 7713943Sodanrc@yahoo.com.br */ 7813943Sodanrc@yahoo.com.br 7913943Sodanrc@yahoo.com.br /** 8013942Sodanrc@yahoo.com.br * Apply the compression process to the cache line. 8113942Sodanrc@yahoo.com.br * Returns the number of cycles used by the compressor, however it is 8213942Sodanrc@yahoo.com.br * usually covered by a good pipelined execution, and is currently ignored. 8313942Sodanrc@yahoo.com.br * The decompression latency is also returned, in order to avoid 8413942Sodanrc@yahoo.com.br * increasing simulation time and memory consumption. 8513942Sodanrc@yahoo.com.br * 8613942Sodanrc@yahoo.com.br * @param cache_line The cache line to be compressed. 8713942Sodanrc@yahoo.com.br * @param comp_lat Compression latency in number of cycles. 8813942Sodanrc@yahoo.com.br * @param decomp_lat Decompression latency in number of cycles. 8913942Sodanrc@yahoo.com.br * @return Cache line after compression. 9013942Sodanrc@yahoo.com.br */ 9113942Sodanrc@yahoo.com.br virtual std::unique_ptr<CompressionData> compress( 9213942Sodanrc@yahoo.com.br const uint64_t* cache_line, Cycles& comp_lat, Cycles& decomp_lat) = 0; 9313942Sodanrc@yahoo.com.br 9413942Sodanrc@yahoo.com.br /** 9513942Sodanrc@yahoo.com.br * Apply the decompression process to the compressed data. 9613942Sodanrc@yahoo.com.br * 9713942Sodanrc@yahoo.com.br * @param comp_data Compressed cache line. 9813942Sodanrc@yahoo.com.br * @param cache_line The cache line to be decompressed. 9913942Sodanrc@yahoo.com.br */ 10013942Sodanrc@yahoo.com.br virtual void decompress(const CompressionData* comp_data, 10113942Sodanrc@yahoo.com.br uint64_t* cache_line) = 0; 10213942Sodanrc@yahoo.com.br 10313942Sodanrc@yahoo.com.br public: 10413942Sodanrc@yahoo.com.br /** Convenience typedef. */ 10513942Sodanrc@yahoo.com.br typedef BaseCacheCompressorParams Params; 10613942Sodanrc@yahoo.com.br 10713942Sodanrc@yahoo.com.br /** 10813942Sodanrc@yahoo.com.br * Default constructor. 10913942Sodanrc@yahoo.com.br */ 11013942Sodanrc@yahoo.com.br BaseCacheCompressor(const Params *p); 11113942Sodanrc@yahoo.com.br 11213942Sodanrc@yahoo.com.br /** 11313942Sodanrc@yahoo.com.br * Default destructor. 11413942Sodanrc@yahoo.com.br */ 11513942Sodanrc@yahoo.com.br virtual ~BaseCacheCompressor() {}; 11613942Sodanrc@yahoo.com.br 11713942Sodanrc@yahoo.com.br /** 11813942Sodanrc@yahoo.com.br * Apply the compression process to the cache line. Ignores compression 11913942Sodanrc@yahoo.com.br * cycles. 12013942Sodanrc@yahoo.com.br * 12113942Sodanrc@yahoo.com.br * @param data The cache line to be compressed. 12213942Sodanrc@yahoo.com.br * @param comp_lat Compression latency in number of cycles. 12313942Sodanrc@yahoo.com.br * @param decomp_lat Decompression latency in number of cycles. 12413942Sodanrc@yahoo.com.br * @param comp_size_bits Compressed data size (in bits). 12513942Sodanrc@yahoo.com.br */ 12613942Sodanrc@yahoo.com.br void compress(const uint64_t* data, Cycles& comp_lat, 12713942Sodanrc@yahoo.com.br Cycles& decomp_lat, std::size_t& comp_size_bits); 12813942Sodanrc@yahoo.com.br 12913942Sodanrc@yahoo.com.br /** 13013942Sodanrc@yahoo.com.br * Get the decompression latency if the block is compressed. Latency is 0 13113942Sodanrc@yahoo.com.br * otherwise. 13213942Sodanrc@yahoo.com.br * 13313942Sodanrc@yahoo.com.br * @param blk The compressed block. 13413942Sodanrc@yahoo.com.br */ 13513942Sodanrc@yahoo.com.br static Cycles getDecompressionLatency(const CacheBlk* blk); 13613942Sodanrc@yahoo.com.br 13713942Sodanrc@yahoo.com.br /** 13813942Sodanrc@yahoo.com.br * Set the decompression latency of compressed block. 13913942Sodanrc@yahoo.com.br * 14013942Sodanrc@yahoo.com.br * @param blk The compressed block. 14113942Sodanrc@yahoo.com.br * @param lat The decompression latency. 14213942Sodanrc@yahoo.com.br */ 14313942Sodanrc@yahoo.com.br static void setDecompressionLatency(CacheBlk* blk, const Cycles lat); 14413942Sodanrc@yahoo.com.br 14513942Sodanrc@yahoo.com.br /** 14613942Sodanrc@yahoo.com.br * Set the size of the compressed block, in bits. 14713942Sodanrc@yahoo.com.br * 14813942Sodanrc@yahoo.com.br * @param blk The compressed block. 14913942Sodanrc@yahoo.com.br * @param size_bits The block size. 15013942Sodanrc@yahoo.com.br */ 15113942Sodanrc@yahoo.com.br static void setSizeBits(CacheBlk* blk, const std::size_t size_bits); 15213943Sodanrc@yahoo.com.br 15313943Sodanrc@yahoo.com.br /** 15413943Sodanrc@yahoo.com.br * Register local statistics. 15513943Sodanrc@yahoo.com.br */ 15613943Sodanrc@yahoo.com.br void regStats() override; 15713942Sodanrc@yahoo.com.br}; 15813942Sodanrc@yahoo.com.br 15913942Sodanrc@yahoo.com.brclass BaseCacheCompressor::CompressionData { 16013942Sodanrc@yahoo.com.br private: 16113942Sodanrc@yahoo.com.br /** 16213942Sodanrc@yahoo.com.br * Compressed cache line size (in bits). 16313942Sodanrc@yahoo.com.br */ 16413942Sodanrc@yahoo.com.br std::size_t _size; 16513942Sodanrc@yahoo.com.br 16613942Sodanrc@yahoo.com.br public: 16713942Sodanrc@yahoo.com.br /** 16813942Sodanrc@yahoo.com.br * Default constructor. 16913942Sodanrc@yahoo.com.br */ 17013942Sodanrc@yahoo.com.br CompressionData(); 17113942Sodanrc@yahoo.com.br 17213942Sodanrc@yahoo.com.br /** 17313942Sodanrc@yahoo.com.br * Virtual destructor. Without it unique_ptr will cause mem leak. 17413942Sodanrc@yahoo.com.br */ 17513942Sodanrc@yahoo.com.br virtual ~CompressionData(); 17613942Sodanrc@yahoo.com.br 17713942Sodanrc@yahoo.com.br /** 17813942Sodanrc@yahoo.com.br * Set compression size (in bits). 17913942Sodanrc@yahoo.com.br * 18013942Sodanrc@yahoo.com.br * @param size Compressed data size. 18113942Sodanrc@yahoo.com.br */ 18213942Sodanrc@yahoo.com.br void setSizeBits(std::size_t size); 18313942Sodanrc@yahoo.com.br 18413942Sodanrc@yahoo.com.br /** 18513942Sodanrc@yahoo.com.br * Get compression size (in bits). 18613942Sodanrc@yahoo.com.br * 18713942Sodanrc@yahoo.com.br * @return Compressed data size. 18813942Sodanrc@yahoo.com.br */ 18913942Sodanrc@yahoo.com.br std::size_t getSizeBits() const; 19013942Sodanrc@yahoo.com.br 19113942Sodanrc@yahoo.com.br /** 19213942Sodanrc@yahoo.com.br * Get compression size (in bytes). 19313942Sodanrc@yahoo.com.br * 19413942Sodanrc@yahoo.com.br * @return Compressed data size. 19513942Sodanrc@yahoo.com.br */ 19613942Sodanrc@yahoo.com.br std::size_t getSize() const; 19713942Sodanrc@yahoo.com.br}; 19813942Sodanrc@yahoo.com.br 19913942Sodanrc@yahoo.com.br#endif //__MEM_CACHE_COMPRESSORS_BASE_HH__ 200