base.cc revision 13215
15643Sgblack@eecs.umich.edu/* 25643Sgblack@eecs.umich.edu * Copyright (c) 2013,2016,2018 ARM Limited 35643Sgblack@eecs.umich.edu * All rights reserved. 45643Sgblack@eecs.umich.edu * 55643Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall 65643Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual 75643Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating 85643Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software 95643Sgblack@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 105643Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 115643Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 125643Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 135643Sgblack@eecs.umich.edu * 145643Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 155643Sgblack@eecs.umich.edu * All rights reserved. 165643Sgblack@eecs.umich.edu * 175643Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 185643Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 195643Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 205643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 215643Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 225643Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 235643Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 245643Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 255643Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 265643Sgblack@eecs.umich.edu * this software without specific prior written permission. 275643Sgblack@eecs.umich.edu * 285643Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 295643Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 305643Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 316138Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 325651Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 338746Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 348232Snate@binkert.org * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 355643Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 365657Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 375643Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 385643Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 395643Sgblack@eecs.umich.edu * 405643Sgblack@eecs.umich.edu * Authors: Erik Hallnor 419805Sstever@gmail.com * Ron Dreslinski 429805Sstever@gmail.com */ 439805Sstever@gmail.com 445643Sgblack@eecs.umich.edu/** 457913SBrad.Beckmann@amd.com * @file 467913SBrad.Beckmann@amd.com * Definitions of BaseTags. 477913SBrad.Beckmann@amd.com */ 487913SBrad.Beckmann@amd.com 497913SBrad.Beckmann@amd.com#include "mem/cache/tags/base.hh" 506136Sgblack@eecs.umich.edu 515643Sgblack@eecs.umich.edu#include <cassert> 525643Sgblack@eecs.umich.edu 535653Sgblack@eecs.umich.edu#include "base/types.hh" 545653Sgblack@eecs.umich.edu#include "mem/cache/base.hh" 555653Sgblack@eecs.umich.edu#include "mem/request.hh" 565653Sgblack@eecs.umich.edu#include "sim/core.hh" 575827Sgblack@eecs.umich.edu#include "sim/sim_exit.hh" 585653Sgblack@eecs.umich.edu#include "sim/system.hh" 599805Sstever@gmail.com 609805Sstever@gmail.comBaseTags::BaseTags(const Params *p) 615643Sgblack@eecs.umich.edu : ClockedObject(p), blkSize(p->block_size), blkMask(blkSize - 1), 625643Sgblack@eecs.umich.edu size(p->size), 637913SBrad.Beckmann@amd.com lookupLatency(p->tag_latency), 647913SBrad.Beckmann@amd.com accessLatency(p->sequential_access ? 657913SBrad.Beckmann@amd.com p->tag_latency + p->data_latency : 667913SBrad.Beckmann@amd.com std::max(p->tag_latency, p->data_latency)), 677913SBrad.Beckmann@amd.com cache(nullptr), 687913SBrad.Beckmann@amd.com warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)), 697913SBrad.Beckmann@amd.com warmedUp(false), numBlocks(p->size / p->block_size), 709805Sstever@gmail.com dataBlks(new uint8_t[p->size]) // Allocate data storage in one big chunk 717913SBrad.Beckmann@amd.com{ 727913SBrad.Beckmann@amd.com} 737913SBrad.Beckmann@amd.com 749805Sstever@gmail.comvoid 759805Sstever@gmail.comBaseTags::setCache(BaseCache *_cache) 769805Sstever@gmail.com{ 779805Sstever@gmail.com assert(!cache); 789805Sstever@gmail.com cache = _cache; 799805Sstever@gmail.com} 809805Sstever@gmail.com 819805Sstever@gmail.comvoid 829805Sstever@gmail.comBaseTags::insertBlock(const Addr addr, const bool is_secure, 839805Sstever@gmail.com const int src_master_ID, const uint32_t task_ID, 849805Sstever@gmail.com CacheBlk *blk) 859805Sstever@gmail.com{ 869805Sstever@gmail.com assert(!blk->isValid()); 879805Sstever@gmail.com 889805Sstever@gmail.com // Previous block, if existed, has been removed, and now we have 899805Sstever@gmail.com // to insert the new one 909805Sstever@gmail.com // Deal with what we are bringing in 919805Sstever@gmail.com assert(src_master_ID < cache->system->maxMasters()); 925643Sgblack@eecs.umich.edu occupancies[src_master_ID]++; 935643Sgblack@eecs.umich.edu 945643Sgblack@eecs.umich.edu // Insert block with tag, src master id and task id 955643Sgblack@eecs.umich.edu blk->insert(extractTag(addr), is_secure, src_master_ID, task_ID); 965643Sgblack@eecs.umich.edu 975643Sgblack@eecs.umich.edu // Check if cache warm up is done 985643Sgblack@eecs.umich.edu if (!warmedUp && tagsInUse.value() >= warmupBound) { 995643Sgblack@eecs.umich.edu warmedUp = true; 1005643Sgblack@eecs.umich.edu warmupCycle = curTick(); 1015643Sgblack@eecs.umich.edu } 1025643Sgblack@eecs.umich.edu 1035643Sgblack@eecs.umich.edu // We only need to write into one tag and one data block. 1045643Sgblack@eecs.umich.edu tagAccesses += 1; 1055643Sgblack@eecs.umich.edu dataAccesses += 1; 1065643Sgblack@eecs.umich.edu} 1075898Sgblack@eecs.umich.edu 1089805Sstever@gmail.comvoid 1095643Sgblack@eecs.umich.eduBaseTags::cleanupRefsVisitor(CacheBlk &blk) 1105643Sgblack@eecs.umich.edu{ 1115643Sgblack@eecs.umich.edu if (blk.isValid()) { 1125643Sgblack@eecs.umich.edu totalRefs += blk.refCount; 1135643Sgblack@eecs.umich.edu ++sampledRefs; 1145643Sgblack@eecs.umich.edu } 1155643Sgblack@eecs.umich.edu} 1165643Sgblack@eecs.umich.edu 1175643Sgblack@eecs.umich.eduvoid 1185643Sgblack@eecs.umich.eduBaseTags::cleanupRefs() 1195643Sgblack@eecs.umich.edu{ 1205643Sgblack@eecs.umich.edu forEachBlk([this](CacheBlk &blk) { cleanupRefsVisitor(blk); }); 1215643Sgblack@eecs.umich.edu} 1225643Sgblack@eecs.umich.edu 1235643Sgblack@eecs.umich.eduvoid 1245643Sgblack@eecs.umich.eduBaseTags::computeStatsVisitor(CacheBlk &blk) 1255643Sgblack@eecs.umich.edu{ 1265898Sgblack@eecs.umich.edu if (blk.isValid()) { 1279805Sstever@gmail.com assert(blk.task_id < ContextSwitchTaskId::NumTaskId); 1285643Sgblack@eecs.umich.edu occupanciesTaskId[blk.task_id]++; 1295643Sgblack@eecs.umich.edu assert(blk.tickInserted <= curTick()); 1305643Sgblack@eecs.umich.edu Tick age = curTick() - blk.tickInserted; 1315643Sgblack@eecs.umich.edu 1325643Sgblack@eecs.umich.edu int age_index; 1335643Sgblack@eecs.umich.edu if (age / SimClock::Int::us < 10) { // <10us 1347913SBrad.Beckmann@amd.com age_index = 0; 1355643Sgblack@eecs.umich.edu } else if (age / SimClock::Int::us < 100) { // <100us 1365643Sgblack@eecs.umich.edu age_index = 1; 1375643Sgblack@eecs.umich.edu } else if (age / SimClock::Int::ms < 1) { // <1ms 1387913SBrad.Beckmann@amd.com age_index = 2; 1395643Sgblack@eecs.umich.edu } else if (age / SimClock::Int::ms < 10) { // <10ms 1405643Sgblack@eecs.umich.edu age_index = 3; 1415643Sgblack@eecs.umich.edu } else 1425643Sgblack@eecs.umich.edu age_index = 4; // >10ms 1435643Sgblack@eecs.umich.edu 1445643Sgblack@eecs.umich.edu ageTaskId[blk.task_id][age_index]++; 1455643Sgblack@eecs.umich.edu } 1465643Sgblack@eecs.umich.edu} 1475643Sgblack@eecs.umich.edu 1485643Sgblack@eecs.umich.eduvoid 1495643Sgblack@eecs.umich.eduBaseTags::computeStats() 1505643Sgblack@eecs.umich.edu{ 1515643Sgblack@eecs.umich.edu for (unsigned i = 0; i < ContextSwitchTaskId::NumTaskId; ++i) { 1525643Sgblack@eecs.umich.edu occupanciesTaskId[i] = 0; 1535643Sgblack@eecs.umich.edu for (unsigned j = 0; j < 5; ++j) { 1545643Sgblack@eecs.umich.edu ageTaskId[i][j] = 0; 1555643Sgblack@eecs.umich.edu } 1565643Sgblack@eecs.umich.edu } 1575643Sgblack@eecs.umich.edu 1585643Sgblack@eecs.umich.edu forEachBlk([this](CacheBlk &blk) { computeStatsVisitor(blk); }); 1595643Sgblack@eecs.umich.edu} 1605643Sgblack@eecs.umich.edu 1615643Sgblack@eecs.umich.edustd::string 1625643Sgblack@eecs.umich.eduBaseTags::print() 1635643Sgblack@eecs.umich.edu{ 1645643Sgblack@eecs.umich.edu std::string str; 1655643Sgblack@eecs.umich.edu 1665643Sgblack@eecs.umich.edu auto print_blk = [&str](CacheBlk &blk) { 1675643Sgblack@eecs.umich.edu if (blk.isValid()) 1685643Sgblack@eecs.umich.edu str += csprintf("\tset: %d way: %d %s\n", blk.set, blk.way, 1695643Sgblack@eecs.umich.edu blk.print()); 1705643Sgblack@eecs.umich.edu }; 1715643Sgblack@eecs.umich.edu forEachBlk(print_blk); 1725643Sgblack@eecs.umich.edu 1735643Sgblack@eecs.umich.edu if (str.empty()) 1745643Sgblack@eecs.umich.edu str = "no valid tags\n"; 1755643Sgblack@eecs.umich.edu 1765643Sgblack@eecs.umich.edu return str; 1775643Sgblack@eecs.umich.edu} 1785643Sgblack@eecs.umich.edu 1795643Sgblack@eecs.umich.eduvoid 1805643Sgblack@eecs.umich.eduBaseTags::regStats() 1815643Sgblack@eecs.umich.edu{ 1825643Sgblack@eecs.umich.edu ClockedObject::regStats(); 1835643Sgblack@eecs.umich.edu 1845643Sgblack@eecs.umich.edu using namespace Stats; 1855643Sgblack@eecs.umich.edu 1865643Sgblack@eecs.umich.edu tagsInUse 1875643Sgblack@eecs.umich.edu .name(name() + ".tagsinuse") 1885643Sgblack@eecs.umich.edu .desc("Cycle average of tags in use") 1895643Sgblack@eecs.umich.edu ; 1906712Snate@binkert.org 1915651Sgblack@eecs.umich.edu totalRefs 1925657Sgblack@eecs.umich.edu .name(name() + ".total_refs") 1935657Sgblack@eecs.umich.edu .desc("Total number of references to valid blocks.") 1945657Sgblack@eecs.umich.edu ; 1955657Sgblack@eecs.umich.edu 1965657Sgblack@eecs.umich.edu sampledRefs 1975657Sgblack@eecs.umich.edu .name(name() + ".sampled_refs") 1985651Sgblack@eecs.umich.edu .desc("Sample count of references to valid blocks.") 1995651Sgblack@eecs.umich.edu ; 2005654Sgblack@eecs.umich.edu 2015654Sgblack@eecs.umich.edu avgRefs 2026138Sgblack@eecs.umich.edu .name(name() + ".avg_refs") 2036138Sgblack@eecs.umich.edu .desc("Average number of references to valid blocks.") 2046138Sgblack@eecs.umich.edu ; 2056138Sgblack@eecs.umich.edu 2066138Sgblack@eecs.umich.edu avgRefs = totalRefs/sampledRefs; 2076138Sgblack@eecs.umich.edu 2086138Sgblack@eecs.umich.edu warmupCycle 2096138Sgblack@eecs.umich.edu .name(name() + ".warmup_cycle") 2106138Sgblack@eecs.umich.edu .desc("Cycle when the warmup percentage was hit.") 2116138Sgblack@eecs.umich.edu ; 2126138Sgblack@eecs.umich.edu 2136138Sgblack@eecs.umich.edu occupancies 2146138Sgblack@eecs.umich.edu .init(cache->system->maxMasters()) 2156138Sgblack@eecs.umich.edu .name(name() + ".occ_blocks") 2166138Sgblack@eecs.umich.edu .desc("Average occupied blocks per requestor") 2176138Sgblack@eecs.umich.edu .flags(nozero | nonan) 2186138Sgblack@eecs.umich.edu ; 2198746Sgblack@eecs.umich.edu for (int i = 0; i < cache->system->maxMasters(); i++) { 2208746Sgblack@eecs.umich.edu occupancies.subname(i, cache->system->getMasterName(i)); 2216138Sgblack@eecs.umich.edu } 2226138Sgblack@eecs.umich.edu 2238746Sgblack@eecs.umich.edu avgOccs 2246138Sgblack@eecs.umich.edu .name(name() + ".occ_percent") 2256138Sgblack@eecs.umich.edu .desc("Average percentage of cache occupancy") 2266139Sgblack@eecs.umich.edu .flags(nozero | total) 2276139Sgblack@eecs.umich.edu ; 2286139Sgblack@eecs.umich.edu for (int i = 0; i < cache->system->maxMasters(); i++) { 2296139Sgblack@eecs.umich.edu avgOccs.subname(i, cache->system->getMasterName(i)); 2306139Sgblack@eecs.umich.edu } 2316139Sgblack@eecs.umich.edu 2326139Sgblack@eecs.umich.edu avgOccs = occupancies / Stats::constant(numBlocks); 2336139Sgblack@eecs.umich.edu 2346139Sgblack@eecs.umich.edu occupanciesTaskId 2356139Sgblack@eecs.umich.edu .init(ContextSwitchTaskId::NumTaskId) 2366139Sgblack@eecs.umich.edu .name(name() + ".occ_task_id_blocks") 2376139Sgblack@eecs.umich.edu .desc("Occupied blocks per task id") 2386139Sgblack@eecs.umich.edu .flags(nozero | nonan) 2396139Sgblack@eecs.umich.edu ; 2406139Sgblack@eecs.umich.edu 2416139Sgblack@eecs.umich.edu ageTaskId 2426138Sgblack@eecs.umich.edu .init(ContextSwitchTaskId::NumTaskId, 5) 2436138Sgblack@eecs.umich.edu .name(name() + ".age_task_id_blocks") 2449524SAndreas.Sandberg@ARM.com .desc("Occupied blocks per task id") 2455643Sgblack@eecs.umich.edu .flags(nozero | nonan) 2465643Sgblack@eecs.umich.edu ; 2475643Sgblack@eecs.umich.edu 2485827Sgblack@eecs.umich.edu percentOccsTaskId 2495827Sgblack@eecs.umich.edu .name(name() + ".occ_task_id_percent") 2505827Sgblack@eecs.umich.edu .desc("Percentage of cache occupancy per task id") 2515827Sgblack@eecs.umich.edu .flags(nozero) 2525827Sgblack@eecs.umich.edu ; 2535827Sgblack@eecs.umich.edu 2545827Sgblack@eecs.umich.edu percentOccsTaskId = occupanciesTaskId / Stats::constant(numBlocks); 2555827Sgblack@eecs.umich.edu 2565827Sgblack@eecs.umich.edu tagAccesses 2575827Sgblack@eecs.umich.edu .name(name() + ".tag_accesses") 2585827Sgblack@eecs.umich.edu .desc("Number of tag accesses") 2595827Sgblack@eecs.umich.edu ; 2605827Sgblack@eecs.umich.edu 2615827Sgblack@eecs.umich.edu dataAccesses 2625827Sgblack@eecs.umich.edu .name(name() + ".data_accesses") 2635827Sgblack@eecs.umich.edu .desc("Number of data accesses") 2646137Sgblack@eecs.umich.edu ; 2657903Shestness@cs.utexas.edu 2667903Shestness@cs.utexas.edu registerDumpCallback(new BaseTagsDumpCallback(this)); 2677903Shestness@cs.utexas.edu registerExitCallback(new BaseTagsCallback(this)); 2687903Shestness@cs.utexas.edu} 2697903Shestness@cs.utexas.edu