base.cc revision 12691
15347Ssaidi@eecs.umich.edu/* 27534Ssteve.reinhardt@amd.com * Copyright (c) 2013,2016 ARM Limited 33395Shsul@eecs.umich.edu * All rights reserved. 43395Shsul@eecs.umich.edu * 53395Shsul@eecs.umich.edu * The license below extends only to copyright in the software and shall 63395Shsul@eecs.umich.edu * not be construed as granting a license to any other intellectual 73395Shsul@eecs.umich.edu * property including but not limited to intellectual property relating 83395Shsul@eecs.umich.edu * to a hardware implementation of the functionality of the software 93395Shsul@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 103395Shsul@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 113395Shsul@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 123395Shsul@eecs.umich.edu * modified or unmodified, in source code or in binary form. 133395Shsul@eecs.umich.edu * 143395Shsul@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 153395Shsul@eecs.umich.edu * All rights reserved. 163395Shsul@eecs.umich.edu * 173395Shsul@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 183395Shsul@eecs.umich.edu * modification, are permitted provided that the following conditions are 193395Shsul@eecs.umich.edu * met: redistributions of source code must retain the above copyright 203395Shsul@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 213395Shsul@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 223395Shsul@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 233395Shsul@eecs.umich.edu * documentation and/or other materials provided with the distribution; 243395Shsul@eecs.umich.edu * neither the name of the copyright holders nor the names of its 253395Shsul@eecs.umich.edu * contributors may be used to endorse or promote products derived from 263395Shsul@eecs.umich.edu * this software without specific prior written permission. 273395Shsul@eecs.umich.edu * 283395Shsul@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 293395Shsul@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 309457Svilanova@ac.upc.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 313395Shsul@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 323509Shsul@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 336654Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 343395Shsul@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 356654Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 363395Shsul@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 376654Snate@binkert.org * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 388724Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 396654Snate@binkert.org * 406654Snate@binkert.org * Authors: Erik Hallnor 413395Shsul@eecs.umich.edu * Ron Dreslinski 429139Snilay@cs.wisc.edu */ 439139Snilay@cs.wisc.edu 449139Snilay@cs.wisc.edu/** 459139Snilay@cs.wisc.edu * @file 469139Snilay@cs.wisc.edu * Definitions of BaseTags. 479139Snilay@cs.wisc.edu */ 489139Snilay@cs.wisc.edu 499139Snilay@cs.wisc.edu#include "mem/cache/tags/base.hh" 509139Snilay@cs.wisc.edu 519139Snilay@cs.wisc.edu#include "cpu/smt.hh" //maxThreadsPerCPU 529139Snilay@cs.wisc.edu#include "mem/cache/base.hh" 539139Snilay@cs.wisc.edu#include "sim/sim_exit.hh" 549139Snilay@cs.wisc.edu 559139Snilay@cs.wisc.eduBaseTags::BaseTags(const Params *p) 569139Snilay@cs.wisc.edu : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1), 573481Shsul@eecs.umich.edu size(p->size), 589139Snilay@cs.wisc.edu lookupLatency(p->tag_latency), 593481Shsul@eecs.umich.edu accessLatency(p->sequential_access ? 609139Snilay@cs.wisc.edu p->tag_latency + p->data_latency : 619139Snilay@cs.wisc.edu std::max(p->tag_latency, p->data_latency)), 629139Snilay@cs.wisc.edu cache(nullptr), 639139Snilay@cs.wisc.edu warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)), 649139Snilay@cs.wisc.edu warmedUp(false), numBlocks(p->size / p->block_size), 659139Snilay@cs.wisc.edu dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk 669139Snilay@cs.wisc.edu{ 679139Snilay@cs.wisc.edu} 689139Snilay@cs.wisc.edu 699139Snilay@cs.wisc.eduvoid 708718Snilay@cs.wisc.eduBaseTags::setCache(BaseCache *_cache) 719139Snilay@cs.wisc.edu{ 723481Shsul@eecs.umich.edu assert(!cache); 739139Snilay@cs.wisc.edu cache = _cache; 743481Shsul@eecs.umich.edu} 753481Shsul@eecs.umich.edu 769139Snilay@cs.wisc.eduvoid 779139Snilay@cs.wisc.eduBaseTags::insertBlock(PacketPtr pkt, CacheBlk *blk) 783481Shsul@eecs.umich.edu{ 799139Snilay@cs.wisc.edu // Get address 809139Snilay@cs.wisc.edu Addr addr = pkt->getAddr(); 819139Snilay@cs.wisc.edu 829139Snilay@cs.wisc.edu // Update warmup data 839139Snilay@cs.wisc.edu if (!blk->isTouched) { 843481Shsul@eecs.umich.edu if (!warmedUp && tagsInUse.value() >= warmupBound) { 853481Shsul@eecs.umich.edu warmedUp = true; 863481Shsul@eecs.umich.edu warmupCycle = curTick(); 878919Snilay@cs.wisc.edu } 888919Snilay@cs.wisc.edu } 898919Snilay@cs.wisc.edu 908919Snilay@cs.wisc.edu // If we're replacing a block that was previously valid update 918919Snilay@cs.wisc.edu // stats for it. This can't be done in findBlock() because a 928919Snilay@cs.wisc.edu // found block might not actually be replaced there if the 938919Snilay@cs.wisc.edu // coherence protocol says it can't be. 948919Snilay@cs.wisc.edu if (blk->isValid()) { 958919Snilay@cs.wisc.edu replacements[0]++; 968919Snilay@cs.wisc.edu totalRefs += blk->refCount; 978919Snilay@cs.wisc.edu ++sampledRefs; 988919Snilay@cs.wisc.edu 998919Snilay@cs.wisc.edu invalidate(blk); 1008919Snilay@cs.wisc.edu blk->invalidate(); 1018919Snilay@cs.wisc.edu } 1023481Shsul@eecs.umich.edu 1039140Snilay@cs.wisc.edu // Previous block, if existed, has been removed, and now we have 1049140Snilay@cs.wisc.edu // to insert the new one 1059140Snilay@cs.wisc.edu tagsInUse++; 1069140Snilay@cs.wisc.edu 1079140Snilay@cs.wisc.edu // Deal with what we are bringing in 1089140Snilay@cs.wisc.edu MasterID master_id = pkt->req->masterId(); 1099140Snilay@cs.wisc.edu assert(master_id < cache->system->maxMasters()); 1109140Snilay@cs.wisc.edu occupancies[master_id]++; 1119140Snilay@cs.wisc.edu 1129140Snilay@cs.wisc.edu // Insert block with tag, src master id and task id 1139140Snilay@cs.wisc.edu blk->insert(extractTag(addr), pkt->isSecure(), master_id, 1149140Snilay@cs.wisc.edu pkt->req->taskId()); 1159140Snilay@cs.wisc.edu 1169140Snilay@cs.wisc.edu // We only need to write into one tag and one data block. 1179140Snilay@cs.wisc.edu tagAccesses += 1; 1189140Snilay@cs.wisc.edu dataAccesses += 1; 1199140Snilay@cs.wisc.edu} 1209140Snilay@cs.wisc.edu 1219140Snilay@cs.wisc.eduvoid 1229140Snilay@cs.wisc.eduBaseTags::regStats() 1239140Snilay@cs.wisc.edu{ 1249140Snilay@cs.wisc.edu ClockedObject::regStats(); 1259140Snilay@cs.wisc.edu 1269140Snilay@cs.wisc.edu using namespace Stats; 1279140Snilay@cs.wisc.edu 1289140Snilay@cs.wisc.edu replacements 1299140Snilay@cs.wisc.edu .init(maxThreadsPerCPU) 1309140Snilay@cs.wisc.edu .name(name() + ".replacements") 1319140Snilay@cs.wisc.edu .desc("number of replacements") 1329140Snilay@cs.wisc.edu .flags(total) 1339140Snilay@cs.wisc.edu ; 1349140Snilay@cs.wisc.edu 1359140Snilay@cs.wisc.edu tagsInUse 1369140Snilay@cs.wisc.edu .name(name() + ".tagsinuse") 1379140Snilay@cs.wisc.edu .desc("Cycle average of tags in use") 1389140Snilay@cs.wisc.edu ; 1399140Snilay@cs.wisc.edu 1409140Snilay@cs.wisc.edu totalRefs 1419140Snilay@cs.wisc.edu .name(name() + ".total_refs") 1429140Snilay@cs.wisc.edu .desc("Total number of references to valid blocks.") 1439140Snilay@cs.wisc.edu ; 1449140Snilay@cs.wisc.edu 1459140Snilay@cs.wisc.edu sampledRefs 1469140Snilay@cs.wisc.edu .name(name() + ".sampled_refs") 1479140Snilay@cs.wisc.edu .desc("Sample count of references to valid blocks.") 1489140Snilay@cs.wisc.edu ; 1499140Snilay@cs.wisc.edu 1509140Snilay@cs.wisc.edu avgRefs 1519140Snilay@cs.wisc.edu .name(name() + ".avg_refs") 1529140Snilay@cs.wisc.edu .desc("Average number of references to valid blocks.") 1539140Snilay@cs.wisc.edu ; 1549140Snilay@cs.wisc.edu 1559140Snilay@cs.wisc.edu avgRefs = totalRefs/sampledRefs; 1569140Snilay@cs.wisc.edu 1579215Sandreas.hansson@arm.com warmupCycle 1589140Snilay@cs.wisc.edu .name(name() + ".warmup_cycle") 1599140Snilay@cs.wisc.edu .desc("Cycle when the warmup percentage was hit.") 1609140Snilay@cs.wisc.edu ; 1619140Snilay@cs.wisc.edu 1629140Snilay@cs.wisc.edu occupancies 1639140Snilay@cs.wisc.edu .init(cache->system->maxMasters()) 1649140Snilay@cs.wisc.edu .name(name() + ".occ_blocks") 1659140Snilay@cs.wisc.edu .desc("Average occupied blocks per requestor") 1669140Snilay@cs.wisc.edu .flags(nozero | nonan) 1679140Snilay@cs.wisc.edu ; 1689140Snilay@cs.wisc.edu for (int i = 0; i < cache->system->maxMasters(); i++) { 1699140Snilay@cs.wisc.edu occupancies.subname(i, cache->system->getMasterName(i)); 1709140Snilay@cs.wisc.edu } 1719140Snilay@cs.wisc.edu 1729140Snilay@cs.wisc.edu avgOccs 1739140Snilay@cs.wisc.edu .name(name() + ".occ_percent") 1749140Snilay@cs.wisc.edu .desc("Average percentage of cache occupancy") 1759140Snilay@cs.wisc.edu .flags(nozero | total) 1769140Snilay@cs.wisc.edu ; 1779140Snilay@cs.wisc.edu for (int i = 0; i < cache->system->maxMasters(); i++) { 1789140Snilay@cs.wisc.edu avgOccs.subname(i, cache->system->getMasterName(i)); 1799140Snilay@cs.wisc.edu } 1809140Snilay@cs.wisc.edu 1819140Snilay@cs.wisc.edu avgOccs = occupancies / Stats::constant(numBlocks); 1829140Snilay@cs.wisc.edu 1839140Snilay@cs.wisc.edu occupanciesTaskId 1849156Sandreas.hansson@arm.com .init(ContextSwitchTaskId::NumTaskId) 1859140Snilay@cs.wisc.edu .name(name() + ".occ_task_id_blocks") 1869140Snilay@cs.wisc.edu .desc("Occupied blocks per task id") 1879140Snilay@cs.wisc.edu .flags(nozero | nonan) 1889140Snilay@cs.wisc.edu ; 1899140Snilay@cs.wisc.edu 1909140Snilay@cs.wisc.edu ageTaskId 1919140Snilay@cs.wisc.edu .init(ContextSwitchTaskId::NumTaskId, 5) 1929140Snilay@cs.wisc.edu .name(name() + ".age_task_id_blocks") 1939140Snilay@cs.wisc.edu .desc("Occupied blocks per task id") 1949140Snilay@cs.wisc.edu .flags(nozero | nonan) 1959140Snilay@cs.wisc.edu ; 1969140Snilay@cs.wisc.edu 1979140Snilay@cs.wisc.edu percentOccsTaskId 1989140Snilay@cs.wisc.edu .name(name() + ".occ_task_id_percent") 1999140Snilay@cs.wisc.edu .desc("Percentage of cache occupancy per task id") 2009140Snilay@cs.wisc.edu .flags(nozero) 2019140Snilay@cs.wisc.edu ; 2029140Snilay@cs.wisc.edu 2039140Snilay@cs.wisc.edu percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks); 2049140Snilay@cs.wisc.edu 2059140Snilay@cs.wisc.edu tagAccesses 2069140Snilay@cs.wisc.edu .name(name() + ".tag_accesses") 2079140Snilay@cs.wisc.edu .desc("Number of tag accesses") 2089140Snilay@cs.wisc.edu ; 2099140Snilay@cs.wisc.edu 2109140Snilay@cs.wisc.edu dataAccesses 2119140Snilay@cs.wisc.edu .name(name() + ".data_accesses") 2129140Snilay@cs.wisc.edu .desc("Number of data accesses") 2139140Snilay@cs.wisc.edu ; 2149140Snilay@cs.wisc.edu 2159140Snilay@cs.wisc.edu registerDumpCallback(new BaseTagsDumpCallback(this)); 2169140Snilay@cs.wisc.edu registerExitCallback(new BaseTagsCallback(this)); 2179140Snilay@cs.wisc.edu} 2189140Snilay@cs.wisc.edu