base.cc revision 2811
12221SN/A/* 22221SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 32221SN/A * All rights reserved. 42221SN/A * 52221SN/A * Redistribution and use in source and binary forms, with or without 62221SN/A * modification, are permitted provided that the following conditions are 72221SN/A * met: redistributions of source code must retain the above copyright 82221SN/A * notice, this list of conditions and the following disclaimer; 92221SN/A * redistributions in binary form must reproduce the above copyright 102221SN/A * notice, this list of conditions and the following disclaimer in the 112221SN/A * documentation and/or other materials provided with the distribution; 122221SN/A * neither the name of the copyright holders nor the names of its 132221SN/A * contributors may be used to endorse or promote products derived from 142221SN/A * this software without specific prior written permission. 152221SN/A * 162221SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 172221SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 182221SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 192221SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 202221SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 212221SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 222221SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 232221SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 242221SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 252221SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 262221SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Erik Hallnor 292665Ssaidi@eecs.umich.edu */ 302221SN/A 312221SN/A/** 323415Sgblack@eecs.umich.edu * @file 333415Sgblack@eecs.umich.edu * Definition of BaseCache functions. 342223SN/A */ 353415Sgblack@eecs.umich.edu 363415Sgblack@eecs.umich.edu#include "mem/cache/base_cache.hh" 373415Sgblack@eecs.umich.edu#include "cpu/smt.hh" 383415Sgblack@eecs.umich.edu#include "cpu/base.hh" 393415Sgblack@eecs.umich.edu 402680Sktlim@umich.eduusing namespace std; 412800Ssaidi@eecs.umich.edu 423415Sgblack@eecs.umich.eduBaseCache::CachePort::CachePort(const std::string &_name, BaseCache *_cache, 432800Ssaidi@eecs.umich.edu bool _isCpuSide) 442800Ssaidi@eecs.umich.edu : Port(_name), cache(_cache), isCpuSide(_isCpuSide) 452221SN/A{ 463415Sgblack@eecs.umich.edu blocked = false; 473415Sgblack@eecs.umich.edu //Start ports at null if more than one is created we should panic 482223SN/A //cpuSidePort = NULL; 492221SN/A //memSidePort = NULL; 502221SN/A} 512223SN/A 522223SN/Avoid 532223SN/ABaseCache::CachePort::recvStatusChange(Port::Status status) 542223SN/A{ 552221SN/A cache->recvStatusChange(status, isCpuSide); 562223SN/A} 572223SN/A 582223SN/Avoid 592223SN/ABaseCache::CachePort::getDeviceAddressRanges(AddrRangeList &resp, 602221SN/A AddrRangeList &snoop) 612223SN/A{ 622223SN/A cache->getAddressRanges(resp, snoop); 632223SN/A} 642223SN/A 652221SN/Aint 662223SN/ABaseCache::CachePort::deviceBlockSize() 672223SN/A{ 682223SN/A return cache->getBlockSize(); 692223SN/A} 702221SN/A 712223SN/Abool 722223SN/ABaseCache::CachePort::recvTiming(Packet *pkt) 732223SN/A{ 742223SN/A return cache->doTimingAccess(pkt, this, isCpuSide); 752221SN/A} 762223SN/A 772223SN/ATick 782223SN/ABaseCache::CachePort::recvAtomic(Packet *pkt) 792223SN/A{ 802221SN/A return cache->doAtomicAccess(pkt, isCpuSide); 812223SN/A} 822223SN/A 832223SN/Avoid 842223SN/ABaseCache::CachePort::recvFunctional(Packet *pkt) 852221SN/A{ 862223SN/A cache->doFunctionalAccess(pkt, isCpuSide); 872223SN/A} 882223SN/A 892223SN/Avoid 902221SN/ABaseCache::CachePort::setBlocked() 912223SN/A{ 922223SN/A blocked = true; 932223SN/A} 942223SN/A 952221SN/Avoid 962223SN/ABaseCache::CachePort::clearBlocked() 972223SN/A{ 982223SN/A blocked = false; 992223SN/A} 1002221SN/A 1012223SN/APort* 1022223SN/ABaseCache::getPort(const std::string &if_name) 1032223SN/A{ 1042223SN/A if(if_name == "cpu_side") 1052221SN/A { 1062469SN/A if(cpuSidePort != NULL) 1072469SN/A panic("Already have a cpu side for this cache\n"); 1082469SN/A cpuSidePort = new CachePort(name() + "-cpu_side_port", this, true); 1092469SN/A return cpuSidePort; 1102221SN/A } 1112223SN/A else if(if_name == "mem_side") 1122223SN/A { 1132223SN/A if(memSidePort != NULL) 1142223SN/A panic("Already have a mem side for this cache\n"); 1152221SN/A memSidePort = new CachePort(name() + "-mem_side_port", this, false); 1162223SN/A return memSidePort; 1172223SN/A } 1182223SN/A else panic("Port name %s unrecognized\n", if_name); 1192223SN/A} 1202221SN/A 1212223SN/Avoid 1222223SN/ABaseCache::regStats() 1232223SN/A{ 1242223SN/A Request temp_req; 1252221SN/A Packet::Command temp_cmd = Packet::ReadReq; 1262223SN/A Packet temp_pkt(&temp_req, temp_cmd, 0); //@todo FIx command strings so this isn't neccessary 1272223SN/A 1282223SN/A using namespace Stats; 1292223SN/A 1302223SN/A // Hit statistics 1312223SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 1322223SN/A Packet::Command cmd = (Packet::Command)access_idx; 1332223SN/A const string &cstr = temp_pkt.cmdIdxToString(cmd); 1342223SN/A 1352223SN/A hits[access_idx] 1362223SN/A .init(maxThreadsPerCPU) 1372223SN/A .name(name() + "." + cstr + "_hits") 1382223SN/A .desc("number of " + cstr + " hits") 1392223SN/A .flags(total | nozero | nonan) 1402223SN/A ; 1412223SN/A } 1422223SN/A 1432223SN/A demandHits 1442223SN/A .name(name() + ".demand_hits") 1452223SN/A .desc("number of demand (read+write) hits") 1462223SN/A .flags(total) 1472223SN/A ; 1482223SN/A demandHits = hits[Packet::ReadReq] + hits[Packet::WriteReq]; 1492223SN/A 1502223SN/A overallHits 1512223SN/A .name(name() + ".overall_hits") 1522223SN/A .desc("number of overall hits") 1532223SN/A .flags(total) 1542223SN/A ; 1552223SN/A overallHits = demandHits + hits[Packet::SoftPFReq] + hits[Packet::HardPFReq] 1562223SN/A + hits[Packet::Writeback]; 1572223SN/A 1582223SN/A // Miss statistics 1592223SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 1602223SN/A Packet::Command cmd = (Packet::Command)access_idx; 1612223SN/A const string &cstr = temp_pkt.cmdIdxToString(cmd); 1622223SN/A 1632223SN/A misses[access_idx] 1642223SN/A .init(maxThreadsPerCPU) 1652223SN/A .name(name() + "." + cstr + "_misses") 1662223SN/A .desc("number of " + cstr + " misses") 1672223SN/A .flags(total | nozero | nonan) 1682223SN/A ; 1692223SN/A } 1702223SN/A 1712223SN/A demandMisses 1722223SN/A .name(name() + ".demand_misses") 1732223SN/A .desc("number of demand (read+write) misses") 1742223SN/A .flags(total) 1752223SN/A ; 1762469SN/A demandMisses = misses[Packet::ReadReq] + misses[Packet::WriteReq]; 1772469SN/A 1782469SN/A overallMisses 1792469SN/A .name(name() + ".overall_misses") 1802223SN/A .desc("number of overall misses") 1812223SN/A .flags(total) 1822223SN/A ; 1832223SN/A overallMisses = demandMisses + misses[Packet::SoftPFReq] + 1842223SN/A misses[Packet::HardPFReq] + misses[Packet::Writeback]; 1852223SN/A 1862223SN/A // Miss latency statistics 1872223SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 1882223SN/A Packet::Command cmd = (Packet::Command)access_idx; 1892223SN/A const string &cstr = temp_pkt.cmdIdxToString(cmd); 1902223SN/A 1912223SN/A missLatency[access_idx] 1922223SN/A .init(maxThreadsPerCPU) 1932223SN/A .name(name() + "." + cstr + "_miss_latency") 1942223SN/A .desc("number of " + cstr + " miss cycles") 1952223SN/A .flags(total | nozero | nonan) 1962223SN/A ; 1972527SN/A } 1982223SN/A 1992223SN/A demandMissLatency 2002223SN/A .name(name() + ".demand_miss_latency") 2012527SN/A .desc("number of demand (read+write) miss cycles") 2022527SN/A .flags(total) 2032223SN/A ; 2042223SN/A demandMissLatency = missLatency[Packet::ReadReq] + missLatency[Packet::WriteReq]; 2052223SN/A 2062223SN/A overallMissLatency 2072223SN/A .name(name() + ".overall_miss_latency") 2082223SN/A .desc("number of overall miss cycles") 2092223SN/A .flags(total) 2102223SN/A ; 2112223SN/A overallMissLatency = demandMissLatency + missLatency[Packet::SoftPFReq] + 2122223SN/A missLatency[Packet::HardPFReq]; 2132223SN/A 2142223SN/A // access formulas 2152223SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 2162223SN/A Packet::Command cmd = (Packet::Command)access_idx; 2172223SN/A const string &cstr = temp_pkt.cmdIdxToString(cmd); 2182223SN/A 2192223SN/A accesses[access_idx] 2202223SN/A .name(name() + "." + cstr + "_accesses") 2212223SN/A .desc("number of " + cstr + " accesses(hits+misses)") 2222223SN/A .flags(total | nozero | nonan) 2232223SN/A ; 2242223SN/A 2252223SN/A accesses[access_idx] = hits[access_idx] + misses[access_idx]; 2262223SN/A } 2272223SN/A 2282223SN/A demandAccesses 2292223SN/A .name(name() + ".demand_accesses") 2302223SN/A .desc("number of demand (read+write) accesses") 2312223SN/A .flags(total) 2322800Ssaidi@eecs.umich.edu ; 2332800Ssaidi@eecs.umich.edu demandAccesses = demandHits + demandMisses; 2342800Ssaidi@eecs.umich.edu 2352800Ssaidi@eecs.umich.edu overallAccesses 2362800Ssaidi@eecs.umich.edu .name(name() + ".overall_accesses") 2372800Ssaidi@eecs.umich.edu .desc("number of overall (read+write) accesses") 2382800Ssaidi@eecs.umich.edu .flags(total) 2393415Sgblack@eecs.umich.edu ; 2403415Sgblack@eecs.umich.edu overallAccesses = overallHits + overallMisses; 2413415Sgblack@eecs.umich.edu 2423415Sgblack@eecs.umich.edu // miss rate formulas 2433415Sgblack@eecs.umich.edu for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 2443415Sgblack@eecs.umich.edu Packet::Command cmd = (Packet::Command)access_idx; 2453415Sgblack@eecs.umich.edu const string &cstr = temp_pkt.cmdIdxToString(cmd); 2463415Sgblack@eecs.umich.edu 2473415Sgblack@eecs.umich.edu missRate[access_idx] 2483415Sgblack@eecs.umich.edu .name(name() + "." + cstr + "_miss_rate") 2493415Sgblack@eecs.umich.edu .desc("miss rate for " + cstr + " accesses") 2503415Sgblack@eecs.umich.edu .flags(total | nozero | nonan) 2513415Sgblack@eecs.umich.edu ; 2523415Sgblack@eecs.umich.edu 2533415Sgblack@eecs.umich.edu missRate[access_idx] = misses[access_idx] / accesses[access_idx]; 2543415Sgblack@eecs.umich.edu } 2553415Sgblack@eecs.umich.edu 2563415Sgblack@eecs.umich.edu demandMissRate 2573415Sgblack@eecs.umich.edu .name(name() + ".demand_miss_rate") 2583415Sgblack@eecs.umich.edu .desc("miss rate for demand accesses") 2593415Sgblack@eecs.umich.edu .flags(total) 2603415Sgblack@eecs.umich.edu ; 2613415Sgblack@eecs.umich.edu demandMissRate = demandMisses / demandAccesses; 2623415Sgblack@eecs.umich.edu 2633415Sgblack@eecs.umich.edu overallMissRate 2643415Sgblack@eecs.umich.edu .name(name() + ".overall_miss_rate") 2653415Sgblack@eecs.umich.edu .desc("miss rate for overall accesses") 2663415Sgblack@eecs.umich.edu .flags(total) 2673415Sgblack@eecs.umich.edu ; 2683415Sgblack@eecs.umich.edu overallMissRate = overallMisses / overallAccesses; 2693415Sgblack@eecs.umich.edu 2703415Sgblack@eecs.umich.edu // miss latency formulas 2713415Sgblack@eecs.umich.edu for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 2723415Sgblack@eecs.umich.edu Packet::Command cmd = (Packet::Command)access_idx; 2733415Sgblack@eecs.umich.edu const string &cstr = temp_pkt.cmdIdxToString(cmd); 2743415Sgblack@eecs.umich.edu 2753415Sgblack@eecs.umich.edu avgMissLatency[access_idx] 2763415Sgblack@eecs.umich.edu .name(name() + "." + cstr + "_avg_miss_latency") 2773415Sgblack@eecs.umich.edu .desc("average " + cstr + " miss latency") 2783415Sgblack@eecs.umich.edu .flags(total | nozero | nonan) 2793415Sgblack@eecs.umich.edu ; 2803415Sgblack@eecs.umich.edu 2813415Sgblack@eecs.umich.edu avgMissLatency[access_idx] = 2823415Sgblack@eecs.umich.edu missLatency[access_idx] / misses[access_idx]; 2833415Sgblack@eecs.umich.edu } 2843415Sgblack@eecs.umich.edu 2853415Sgblack@eecs.umich.edu demandAvgMissLatency 2863415Sgblack@eecs.umich.edu .name(name() + ".demand_avg_miss_latency") 2873415Sgblack@eecs.umich.edu .desc("average overall miss latency") 2883415Sgblack@eecs.umich.edu .flags(total) 2893415Sgblack@eecs.umich.edu ; 2903415Sgblack@eecs.umich.edu demandAvgMissLatency = demandMissLatency / demandMisses; 2913415Sgblack@eecs.umich.edu 2923415Sgblack@eecs.umich.edu overallAvgMissLatency 2933415Sgblack@eecs.umich.edu .name(name() + ".overall_avg_miss_latency") 2943415Sgblack@eecs.umich.edu .desc("average overall miss latency") 2953415Sgblack@eecs.umich.edu .flags(total) 2963415Sgblack@eecs.umich.edu ; 2973415Sgblack@eecs.umich.edu overallAvgMissLatency = overallMissLatency / overallMisses; 2983415Sgblack@eecs.umich.edu 2993415Sgblack@eecs.umich.edu blocked_cycles.init(NUM_BLOCKED_CAUSES); 3003415Sgblack@eecs.umich.edu blocked_cycles 3013415Sgblack@eecs.umich.edu .name(name() + ".blocked_cycles") 3023415Sgblack@eecs.umich.edu .desc("number of cycles access was blocked") 3033415Sgblack@eecs.umich.edu .subname(Blocked_NoMSHRs, "no_mshrs") 3043415Sgblack@eecs.umich.edu .subname(Blocked_NoTargets, "no_targets") 3053415Sgblack@eecs.umich.edu ; 3063415Sgblack@eecs.umich.edu 3073415Sgblack@eecs.umich.edu 3083415Sgblack@eecs.umich.edu blocked_causes.init(NUM_BLOCKED_CAUSES); 3093415Sgblack@eecs.umich.edu blocked_causes 3103415Sgblack@eecs.umich.edu .name(name() + ".blocked") 3113415Sgblack@eecs.umich.edu .desc("number of cycles access was blocked") 3123415Sgblack@eecs.umich.edu .subname(Blocked_NoMSHRs, "no_mshrs") 3133415Sgblack@eecs.umich.edu .subname(Blocked_NoTargets, "no_targets") 3143415Sgblack@eecs.umich.edu ; 3153415Sgblack@eecs.umich.edu 3163415Sgblack@eecs.umich.edu avg_blocked 3173415Sgblack@eecs.umich.edu .name(name() + ".avg_blocked_cycles") 3183415Sgblack@eecs.umich.edu .desc("average number of cycles each access was blocked") 3193415Sgblack@eecs.umich.edu .subname(Blocked_NoMSHRs, "no_mshrs") 3203415Sgblack@eecs.umich.edu .subname(Blocked_NoTargets, "no_targets") 3213415Sgblack@eecs.umich.edu ; 3223415Sgblack@eecs.umich.edu 3233415Sgblack@eecs.umich.edu avg_blocked = blocked_cycles / blocked_causes; 3243415Sgblack@eecs.umich.edu 3253415Sgblack@eecs.umich.edu fastWrites 3263415Sgblack@eecs.umich.edu .name(name() + ".fast_writes") 3273415Sgblack@eecs.umich.edu .desc("number of fast writes performed") 3283415Sgblack@eecs.umich.edu ; 3293415Sgblack@eecs.umich.edu 3303415Sgblack@eecs.umich.edu cacheCopies 3313415Sgblack@eecs.umich.edu .name(name() + ".cache_copies") 3323415Sgblack@eecs.umich.edu .desc("number of cache copies performed") 3333415Sgblack@eecs.umich.edu ; 3343415Sgblack@eecs.umich.edu} 3353415Sgblack@eecs.umich.edu