stride.hh revision 13427:72a3afac3e78
11758Ssaidi@eecs.umich.edu/*
21758Ssaidi@eecs.umich.edu * Copyright (c) 2018 Inria
31758Ssaidi@eecs.umich.edu * Copyright (c) 2012-2013, 2015 ARM Limited
41758Ssaidi@eecs.umich.edu * All rights reserved
51758Ssaidi@eecs.umich.edu *
61758Ssaidi@eecs.umich.edu * The license below extends only to copyright in the software and shall
71758Ssaidi@eecs.umich.edu * not be construed as granting a license to any other intellectual
81758Ssaidi@eecs.umich.edu * property including but not limited to intellectual property relating
91758Ssaidi@eecs.umich.edu * to a hardware implementation of the functionality of the software
101758Ssaidi@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
111758Ssaidi@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
121758Ssaidi@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
131758Ssaidi@eecs.umich.edu * modified or unmodified, in source code or in binary form.
141758Ssaidi@eecs.umich.edu *
151758Ssaidi@eecs.umich.edu * Copyright (c) 2005 The Regents of The University of Michigan
161758Ssaidi@eecs.umich.edu * All rights reserved.
171758Ssaidi@eecs.umich.edu *
181758Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
191758Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are
201758Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright
211758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
221758Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
231758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
241758Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution;
251758Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its
261758Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from
271758Ssaidi@eecs.umich.edu * this software without specific prior written permission.
281758Ssaidi@eecs.umich.edu *
291758Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
301758Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
311758Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
321758Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
331758Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
341758Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
351758Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
361758Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
371758Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
381758Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
391758Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
401758Ssaidi@eecs.umich.edu *
411758Ssaidi@eecs.umich.edu * Authors: Ron Dreslinski
421758Ssaidi@eecs.umich.edu *          Daniel Carvalho
431758Ssaidi@eecs.umich.edu */
441758Ssaidi@eecs.umich.edu
451758Ssaidi@eecs.umich.edu/**
461758Ssaidi@eecs.umich.edu * @file
471049Sbinkertn@umich.edu * Describes a strided prefetcher.
481049Sbinkertn@umich.edu */
491049Sbinkertn@umich.edu
501049Sbinkertn@umich.edu#ifndef __MEM_CACHE_PREFETCH_STRIDE_HH__
511049Sbinkertn@umich.edu#define __MEM_CACHE_PREFETCH_STRIDE_HH__
521049Sbinkertn@umich.edu
531049Sbinkertn@umich.edu#include <string>
541049Sbinkertn@umich.edu#include <unordered_map>
551049Sbinkertn@umich.edu#include <vector>
561049Sbinkertn@umich.edu
571049Sbinkertn@umich.edu#include "base/types.hh"
581049Sbinkertn@umich.edu#include "mem/cache/prefetch/queued.hh"
591049Sbinkertn@umich.edu#include "mem/cache/replacement_policies/replaceable_entry.hh"
601049Sbinkertn@umich.edu#include "mem/packet.hh"
611049Sbinkertn@umich.edu
621049Sbinkertn@umich.educlass BaseReplacementPolicy;
631049Sbinkertn@umich.edustruct StridePrefetcherParams;
641049Sbinkertn@umich.edu
651049Sbinkertn@umich.educlass StridePrefetcher : public QueuedPrefetcher
661049Sbinkertn@umich.edu{
671049Sbinkertn@umich.edu  protected:
681049Sbinkertn@umich.edu    const int maxConf;
691049Sbinkertn@umich.edu    const int threshConf;
701049Sbinkertn@umich.edu    const int minConf;
711049Sbinkertn@umich.edu    const int startConf;
721049Sbinkertn@umich.edu
731049Sbinkertn@umich.edu    const int pcTableAssoc;
741049Sbinkertn@umich.edu    const int pcTableSets;
751049Sbinkertn@umich.edu
761049Sbinkertn@umich.edu    const bool useMasterId;
771049Sbinkertn@umich.edu
781049Sbinkertn@umich.edu    const int degree;
791049Sbinkertn@umich.edu
801049Sbinkertn@umich.edu    /** Replacement policy used in the PC tables. */
811049Sbinkertn@umich.edu    BaseReplacementPolicy* replacementPolicy;
821049Sbinkertn@umich.edu
831049Sbinkertn@umich.edu    struct StrideEntry : public ReplaceableEntry
841049Sbinkertn@umich.edu    {
851049Sbinkertn@umich.edu        /** Default constructor */
861049Sbinkertn@umich.edu        StrideEntry();
871049Sbinkertn@umich.edu
881049Sbinkertn@umich.edu        /** Invalidate the entry */
891049Sbinkertn@umich.edu        void invalidate();
901049Sbinkertn@umich.edu
911049Sbinkertn@umich.edu        Addr instAddr;
921049Sbinkertn@umich.edu        Addr lastAddr;
931049Sbinkertn@umich.edu        bool isSecure;
941049Sbinkertn@umich.edu        int stride;
951049Sbinkertn@umich.edu        int confidence;
961049Sbinkertn@umich.edu    };
971049Sbinkertn@umich.edu
981049Sbinkertn@umich.edu    class PCTable
991049Sbinkertn@umich.edu    {
1001049Sbinkertn@umich.edu      public:
1011049Sbinkertn@umich.edu        /**
1021049Sbinkertn@umich.edu         * Default constructor. Create a table with given parameters.
1031049Sbinkertn@umich.edu         *
1041049Sbinkertn@umich.edu         * @param assoc Associativity of the table.
1051049Sbinkertn@umich.edu         * @param sets Number of sets in the table.
1061049Sbinkertn@umich.edu         * @param name Name of the prefetcher.
1071049Sbinkertn@umich.edu         * @param replacementPolicy Replacement policy used by the table.
1081049Sbinkertn@umich.edu         */
1091049Sbinkertn@umich.edu        PCTable(int assoc, int sets, const std::string name,
1101049Sbinkertn@umich.edu                BaseReplacementPolicy* replacementPolicy);
1111049Sbinkertn@umich.edu
1121049Sbinkertn@umich.edu        /**
1131049Sbinkertn@umich.edu         * Default destructor.
1141049Sbinkertn@umich.edu         */
1151049Sbinkertn@umich.edu        ~PCTable();
1161049Sbinkertn@umich.edu
1171049Sbinkertn@umich.edu        /**
1181049Sbinkertn@umich.edu         * Search for an entry in the pc table.
1191049Sbinkertn@umich.edu         *
1201049Sbinkertn@umich.edu         * @param pc The PC to look for.
1211049Sbinkertn@umich.edu         * @param is_secure True if the target memory space is secure.
1221049Sbinkertn@umich.edu         * @return Pointer to the entry.
1231049Sbinkertn@umich.edu         */
1241049Sbinkertn@umich.edu        StrideEntry* findEntry(Addr pc, bool is_secure);
1251049Sbinkertn@umich.edu
1261049Sbinkertn@umich.edu        /**
1271049Sbinkertn@umich.edu         * Find a replacement victim to make room for given PC.
1281049Sbinkertn@umich.edu         *
1291049Sbinkertn@umich.edu         * @param pc The PC value.
1301049Sbinkertn@umich.edu         * @return The victimized entry.
1311049Sbinkertn@umich.edu         */
1321049Sbinkertn@umich.edu        StrideEntry* findVictim(Addr pc);
1331049Sbinkertn@umich.edu
1341049Sbinkertn@umich.edu      private:
1351049Sbinkertn@umich.edu        const std::string name() {return _name; }
1361049Sbinkertn@umich.edu        const int pcTableSets;
1371049Sbinkertn@umich.edu        const std::string _name;
1381049Sbinkertn@umich.edu        std::vector<std::vector<StrideEntry>> entries;
1391049Sbinkertn@umich.edu
1401049Sbinkertn@umich.edu        /**
1411049Sbinkertn@umich.edu         * Replacement policy used by StridePrefetcher.
1421049Sbinkertn@umich.edu         */
1431049Sbinkertn@umich.edu        BaseReplacementPolicy* replacementPolicy;
1441049Sbinkertn@umich.edu
1451049Sbinkertn@umich.edu        /**
1461049Sbinkertn@umich.edu         * PC hashing function to index sets in the table.
1471049Sbinkertn@umich.edu         *
1481049Sbinkertn@umich.edu         * @param pc The PC value.
1491049Sbinkertn@umich.edu         * @return The set to which this PC maps.
1501049Sbinkertn@umich.edu         */
1511049Sbinkertn@umich.edu        Addr pcHash(Addr pc) const;
1521049Sbinkertn@umich.edu    };
1531049Sbinkertn@umich.edu    std::unordered_map<int, PCTable> pcTables;
1541049Sbinkertn@umich.edu
1551049Sbinkertn@umich.edu    /**
1561049Sbinkertn@umich.edu     * Try to find a table of entries for the given context. If none is
1571049Sbinkertn@umich.edu     * found, a new table is created.
1581049Sbinkertn@umich.edu     *
1591049Sbinkertn@umich.edu     * @param context The context to be searched for.
1601049Sbinkertn@umich.edu     * @return The table corresponding to the given context.
1611049Sbinkertn@umich.edu     */
1621049Sbinkertn@umich.edu    PCTable* findTable(int context);
1631049Sbinkertn@umich.edu
1641049Sbinkertn@umich.edu    /**
1651049Sbinkertn@umich.edu     * Create a PC table for the given context.
1661049Sbinkertn@umich.edu     *
1671049Sbinkertn@umich.edu     * @param context The context of the new PC table.
1681049Sbinkertn@umich.edu     * @return The new PC table
1691049Sbinkertn@umich.edu     */
1701049Sbinkertn@umich.edu    PCTable* allocateNewContext(int context);
1711049Sbinkertn@umich.edu
1721049Sbinkertn@umich.edu  public:
1731049Sbinkertn@umich.edu    StridePrefetcher(const StridePrefetcherParams *p);
1741049Sbinkertn@umich.edu
1751049Sbinkertn@umich.edu    void calculatePrefetch(const PacketPtr &pkt,
1761049Sbinkertn@umich.edu                           std::vector<AddrPriority> &addresses) override;
1771049Sbinkertn@umich.edu};
1781049Sbinkertn@umich.edu
1791049Sbinkertn@umich.edu#endif // __MEM_CACHE_PREFETCH_STRIDE_HH__
1801049Sbinkertn@umich.edu