irregular_stream_buffer.hh revision 13963
111238Sandreas.sandberg@arm.com/** 211238Sandreas.sandberg@arm.com * Copyright (c) 2018 Metempsy Technology Consulting 311238Sandreas.sandberg@arm.com * All rights reserved. 411238Sandreas.sandberg@arm.com * 511238Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 611238Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 711238Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 811238Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 911238Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1011238Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1111238Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1211238Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1311238Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1411238Sandreas.sandberg@arm.com * this software without specific prior written permission. 1511238Sandreas.sandberg@arm.com * 1611238Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711238Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811238Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911238Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011238Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111238Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211238Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311238Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411238Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511238Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611238Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711238Sandreas.sandberg@arm.com * 2811238Sandreas.sandberg@arm.com * Authors: Javier Bueno 2911238Sandreas.sandberg@arm.com */ 3011238Sandreas.sandberg@arm.com 3111238Sandreas.sandberg@arm.com/** 3211238Sandreas.sandberg@arm.com * Implementation of the Irregular Stream Buffer prefetcher 3311238Sandreas.sandberg@arm.com * Reference: 3411238Sandreas.sandberg@arm.com * Jain, A., & Lin, C. (2013, December). Linearizing irregular memory 3511238Sandreas.sandberg@arm.com * accesses for improved correlated prefetching. In Proceedings of the 3611238Sandreas.sandberg@arm.com * 46th Annual IEEE/ACM International Symposium on Microarchitecture 3711238Sandreas.sandberg@arm.com * (pp. 247-259). ACM. 3811238Sandreas.sandberg@arm.com */ 3911238Sandreas.sandberg@arm.com 4011238Sandreas.sandberg@arm.com#ifndef __MEM_CACHE_PREFETCH_IRREGULAR_STREAM_BUFFER_HH__ 4111238Sandreas.sandberg@arm.com#define __MEM_CACHE_PREFETCH_IRREGULAR_STREAM_BUFFER_HH__ 4211238Sandreas.sandberg@arm.com 4311238Sandreas.sandberg@arm.com#include "base/callback.hh" 4411238Sandreas.sandberg@arm.com#include "base/sat_counter.hh" 4511238Sandreas.sandberg@arm.com#include "mem/cache/prefetch/associative_set.hh" 4611238Sandreas.sandberg@arm.com#include "mem/cache/prefetch/queued.hh" 4711238Sandreas.sandberg@arm.com 4811238Sandreas.sandberg@arm.comstruct IrregularStreamBufferPrefetcherParams; 4911238Sandreas.sandberg@arm.com 5011238Sandreas.sandberg@arm.comclass IrregularStreamBufferPrefetcher : public QueuedPrefetcher 5111297Sandreas.sandberg@arm.com{ 5211238Sandreas.sandberg@arm.com /** Size in bytes of a temporal stream */ 5311238Sandreas.sandberg@arm.com const size_t chunkSize; 5411238Sandreas.sandberg@arm.com /** Number of prefetch candidates per Physical-to-Structural entry */ 5511238Sandreas.sandberg@arm.com const unsigned prefetchCandidatesPerEntry; 5611238Sandreas.sandberg@arm.com /** Number of maximum prefetches requests created when predicting */ 5711238Sandreas.sandberg@arm.com const unsigned degree; 5811238Sandreas.sandberg@arm.com 5911238Sandreas.sandberg@arm.com /** 6011238Sandreas.sandberg@arm.com * Training Unit Entry datatype, it holds the last accessed address and 6111238Sandreas.sandberg@arm.com * its secure flag 6211238Sandreas.sandberg@arm.com */ 6311238Sandreas.sandberg@arm.com struct TrainingUnitEntry : public TaggedEntry { 6411238Sandreas.sandberg@arm.com Addr lastAddress; 6511238Sandreas.sandberg@arm.com bool lastAddressSecure; 6611238Sandreas.sandberg@arm.com }; 6711238Sandreas.sandberg@arm.com /** Map of PCs to Training unit entries */ 6811238Sandreas.sandberg@arm.com AssociativeSet<TrainingUnitEntry> trainingUnit; 6911238Sandreas.sandberg@arm.com 7011238Sandreas.sandberg@arm.com /** Address Mapping entry, holds an address and a confidence counter */ 7111238Sandreas.sandberg@arm.com struct AddressMapping { 7211238Sandreas.sandberg@arm.com Addr address; 7311238Sandreas.sandberg@arm.com SatCounter counter; 7411238Sandreas.sandberg@arm.com AddressMapping(unsigned bits) : address(0), counter(bits) 7511238Sandreas.sandberg@arm.com {} 7611238Sandreas.sandberg@arm.com }; 7711238Sandreas.sandberg@arm.com 7811238Sandreas.sandberg@arm.com /** 7911238Sandreas.sandberg@arm.com * Maps a set of contiguous addresses to another set of (not necessarily 8011238Sandreas.sandberg@arm.com * contiguos) addresses, with their corresponding confidence counters 8111238Sandreas.sandberg@arm.com */ 8211238Sandreas.sandberg@arm.com struct AddressMappingEntry : public TaggedEntry { 8311238Sandreas.sandberg@arm.com std::vector<AddressMapping> mappings; 8411238Sandreas.sandberg@arm.com AddressMappingEntry(size_t num_mappings, unsigned counter_bits) 8511238Sandreas.sandberg@arm.com : mappings(num_mappings, counter_bits) 8611238Sandreas.sandberg@arm.com {} 8711238Sandreas.sandberg@arm.com void reset() override 8811238Sandreas.sandberg@arm.com { 8911238Sandreas.sandberg@arm.com for (auto &entry : mappings) { 9011238Sandreas.sandberg@arm.com entry.address = 0; 9111238Sandreas.sandberg@arm.com entry.counter.reset(); 9211238Sandreas.sandberg@arm.com } 9311238Sandreas.sandberg@arm.com } 9411238Sandreas.sandberg@arm.com }; 9511238Sandreas.sandberg@arm.com 9611238Sandreas.sandberg@arm.com /** Physical-to-Structured mappings table */ 9711238Sandreas.sandberg@arm.com AssociativeSet<AddressMappingEntry> psAddressMappingCache; 9811238Sandreas.sandberg@arm.com /** Structured-to-Physical mappings table */ 9911238Sandreas.sandberg@arm.com AssociativeSet<AddressMappingEntry> spAddressMappingCache; 10011238Sandreas.sandberg@arm.com /** 10111238Sandreas.sandberg@arm.com * Counter of allocated structural addresses, increased by "chunkSize", 10211238Sandreas.sandberg@arm.com * each time a new structured address is allocated 10311238Sandreas.sandberg@arm.com */ 10411238Sandreas.sandberg@arm.com uint64_t structuralAddressCounter; 10511238Sandreas.sandberg@arm.com 10611238Sandreas.sandberg@arm.com /** 10711238Sandreas.sandberg@arm.com * Add a mapping to the Structured-to-Physica mapping table 10811238Sandreas.sandberg@arm.com * @param structuralAddress structural address 10911238Sandreas.sandberg@arm.com * @param is_secure whether this page is inside the secure memory area 11011238Sandreas.sandberg@arm.com * @param physical_address corresponding physical address 111 */ 112 void addStructuralToPhysicalEntry(Addr structuralAddress, bool is_secure, 113 Addr physical_address); 114 115 /** 116 * Obtain the Physical-to-Structured mapping entry of the given physical 117 * address. If the entry does not exist a new one is allocated, replacing 118 * an existing one if needed. 119 * @param paddr physical address 120 * @param is_secure whether this page is inside the secure memory area 121 * @result reference to the entry 122 */ 123 AddressMapping& getPSMapping(Addr paddr, bool is_secure); 124 public: 125 IrregularStreamBufferPrefetcher( 126 const IrregularStreamBufferPrefetcherParams *p); 127 ~IrregularStreamBufferPrefetcher() {} 128 void calculatePrefetch(const PrefetchInfo &pfi, 129 std::vector<AddrPriority> &addresses) override; 130}; 131#endif//__MEM_CACHE_PREFETCH_IRREGULAR_STREAM_BUFFER_HH__ 132