base.cc revision 2810
11689SN/A/* 22325SN/A * Copyright (c) 2003-2005 The Regents of The University of Michigan 31689SN/A * All rights reserved. 41689SN/A * 51689SN/A * Redistribution and use in source and binary forms, with or without 61689SN/A * modification, are permitted provided that the following conditions are 71689SN/A * met: redistributions of source code must retain the above copyright 81689SN/A * notice, this list of conditions and the following disclaimer; 91689SN/A * redistributions in binary form must reproduce the above copyright 101689SN/A * notice, this list of conditions and the following disclaimer in the 111689SN/A * documentation and/or other materials provided with the distribution; 121689SN/A * neither the name of the copyright holders nor the names of its 131689SN/A * contributors may be used to endorse or promote products derived from 141689SN/A * this software without specific prior written permission. 151689SN/A * 161689SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 171689SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 181689SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 191689SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 201689SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 211689SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 221689SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 231689SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 241689SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 251689SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 261689SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 272665Ssaidi@eecs.umich.edu * 282665Ssaidi@eecs.umich.edu * Authors: Erik Hallnor 292756Sksewell@umich.edu */ 301689SN/A 311689SN/A/** 321858SN/A * @file 332733Sktlim@umich.edu * Definition of BaseCache functions. 341858SN/A */ 351858SN/A 361060SN/A#include "mem/cache/base_cache.hh" 371060SN/A#include "cpu/smt.hh" 381060SN/A#include "cpu/base.hh" 391060SN/A 401060SN/Ausing namespace std; 412325SN/A 422683Sktlim@umich.eduBaseCache::CachePort::CachePort(const std::string &_name, BaseCache *_cache, 432680Sktlim@umich.edu bool _isCpuSide) 442817Sksewell@umich.edu : Port(_name), cache(_cache), isCpuSide(_isCpuSide) 451717SN/A{ 461060SN/A blocked = false; 472325SN/A //Start ports at null if more than one is created we should panic 482292SN/A cpuSidePort = NULL; 492292SN/A memSidePort = NULL; 502794Sktlim@umich.edu} 512794Sktlim@umich.edu 522794Sktlim@umich.edubool 532794Sktlim@umich.eduBaseCache::CachePort::recvStatusChange(Port::Status status) 541060SN/A{ 552669Sktlim@umich.edu cache->recvStatusChange(status, isCpuSide); 561060SN/A} 572733Sktlim@umich.edu 582292SN/Avoid 591060SN/ABaseCache::CachePort::getDeviceAddressRanges(AddrRangeList &resp, 601060SN/A AddrRangeList &snoop) 611060SN/A{ 622292SN/A cache->getAddressRanges(resp, snoop); 632733Sktlim@umich.edu} 642292SN/A 652292SN/Aint 662292SN/ABaseCache::CachePort::deviceBlockSize() 672292SN/A{ 681060SN/A return cache->getBlockSize(); 691755SN/A} 701060SN/A 711060SN/Abool 721060SN/ABaseCache::CachePort::recvTiming(Packet *pkt) 731060SN/A{ 741060SN/A return cache->doTimingAccess(pkt, this, isCpuSide); 751060SN/A} 761755SN/A 771060SN/ATick 781060SN/ABaseCache::CachePort::recvAtomic(Packet *pkt) 791060SN/A{ 801060SN/A return cache->doAtomicAccess(pkt, isCpuSide); 811060SN/A} 821060SN/A 831755SN/Avoid 841060SN/ABaseCache::CachePort::recvFunctional(Packet *pkt) 851755SN/A{ 861060SN/A cache->doFunctionalAccess(pkt, isCpuSide); 871060SN/A} 881060SN/A 892829Sksewell@umich.eduvoid 902829Sksewell@umich.eduBaseCache::CachePort::setBlocked() 912829Sksewell@umich.edu{ 922829Sksewell@umich.edu blocked = true; 932829Sksewell@umich.edu} 942829Sksewell@umich.edu 952829Sksewell@umich.eduvoid 962829Sksewell@umich.eduBaseCache::CachePort::clearBlocked() 972829Sksewell@umich.edu{ 982829Sksewell@umich.edu blocked = false; 992829Sksewell@umich.edu} 1002829Sksewell@umich.edu 1012829Sksewell@umich.eduPort* 1022829Sksewell@umich.eduBaseCache::getPort(const std::string &if_name) 1032829Sksewell@umich.edu{ 1042829Sksewell@umich.edu if(if_name == "cpu_side") 1052829Sksewell@umich.edu { 1062829Sksewell@umich.edu if(cpuSidePort != NULL) 1072829Sksewell@umich.edu panic("Already have a cpu side for this cache\n"); 1082829Sksewell@umich.edu cpuSidePort = new CachePort(name() + "-cpu_side_port", this, true); 1092829Sksewell@umich.edu return cpuSidePort; 1102829Sksewell@umich.edu } 1112829Sksewell@umich.edu else if(if_name == "mem_side") 1122829Sksewell@umich.edu { 1132829Sksewell@umich.edu if(memSidePort != NULL) 1142829Sksewell@umich.edu panic("Already have a mem side for this cache\n"); 1152829Sksewell@umich.edu memSidePort = new CachePort(name() + "-mem_side_port", this, false); 1162829Sksewell@umich.edu return memSidePort; 1172829Sksewell@umich.edu } 1182875Sksewell@umich.edu else panic("Port name %s unrecognized\n", if_name); 1192875Sksewell@umich.edu} 1202875Sksewell@umich.edu 1212875Sksewell@umich.eduvoid 1222875Sksewell@umich.eduBaseCache::regStats() 1232875Sksewell@umich.edu{ 1242875Sksewell@umich.edu using namespace Stats; 1252875Sksewell@umich.edu 1262875Sksewell@umich.edu // Hit statistics 1272875Sksewell@umich.edu for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 1282875Sksewell@umich.edu Packet::Command cmd = (Packet::CommandEnum)access_idx; 1292875Sksewell@umich.edu const string &cstr = cmd.toString(); 1302875Sksewell@umich.edu 1312875Sksewell@umich.edu hits[access_idx] 1322875Sksewell@umich.edu .init(maxThreadsPerCPU) 1332875Sksewell@umich.edu .name(name() + "." + cstr + "_hits") 1342875Sksewell@umich.edu .desc("number of " + cstr + " hits") 1352875Sksewell@umich.edu .flags(total | nozero | nonan) 1362875Sksewell@umich.edu ; 1372875Sksewell@umich.edu } 1382875Sksewell@umich.edu 1392875Sksewell@umich.edu demandHits 1402875Sksewell@umich.edu .name(name() + ".demand_hits") 1412875Sksewell@umich.edu .desc("number of demand (read+write) hits") 1422875Sksewell@umich.edu .flags(total) 1432875Sksewell@umich.edu ; 1442875Sksewell@umich.edu demandHits = hits[Read] + hits[Write]; 1452875Sksewell@umich.edu 1462875Sksewell@umich.edu overallHits 1472875Sksewell@umich.edu .name(name() + ".overall_hits") 1482292SN/A .desc("number of overall hits") 1492733Sktlim@umich.edu .flags(total) 1501060SN/A ; 1512292SN/A overallHits = demandHits + hits[Soft_Prefetch] + hits[Hard_Prefetch] 1521060SN/A + hits[Writeback]; 1531060SN/A 1541060SN/A // Miss statistics 1551060SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 1561060SN/A Packet::Command cmd = (Packet::CommandEnum)access_idx; 1571060SN/A const string &cstr = cmd.toString(); 1582292SN/A 1591060SN/A misses[access_idx] 1602831Sksewell@umich.edu .init(maxThreadsPerCPU) 1612292SN/A .name(name() + "." + cstr + "_misses") 1622292SN/A .desc("number of " + cstr + " misses") 1631060SN/A .flags(total | nozero | nonan) 1642292SN/A ; 1652292SN/A } 1662292SN/A 1671060SN/A demandMisses 1682831Sksewell@umich.edu .name(name() + ".demand_misses") 1692292SN/A .desc("number of demand (read+write) misses") 1702292SN/A .flags(total) 1712292SN/A ; 1722292SN/A demandMisses = misses[Read] + misses[Write]; 1731060SN/A 1741060SN/A overallMisses 1752325SN/A .name(name() + ".overall_misses") 1762325SN/A .desc("number of overall misses") 1771061SN/A .flags(total) 1781061SN/A ; 1791061SN/A overallMisses = demandMisses + misses[Soft_Prefetch] + 1801061SN/A misses[Hard_Prefetch] + misses[Writeback]; 1811061SN/A 1822325SN/A // Miss latency statistics 1831060SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 1841060SN/A Packet::Command cmd = (Packet::CommandEnum)access_idx; 1851060SN/A const string &cstr = cmd.toString(); 1861858SN/A 1872292SN/A missLatency[access_idx] 1881060SN/A .init(maxThreadsPerCPU) 1891060SN/A .name(name() + "." + cstr + "_miss_latency") 1902292SN/A .desc("number of " + cstr + " miss cycles") 1912316SN/A .flags(total | nozero | nonan) 1922316SN/A ; 1932316SN/A } 1941060SN/A 1951060SN/A demandMissLatency 1961681SN/A .name(name() + ".demand_miss_latency") 1972733Sktlim@umich.edu .desc("number of demand (read+write) miss cycles") 1982733Sktlim@umich.edu .flags(total) 1992794Sktlim@umich.edu ; 2002733Sktlim@umich.edu demandMissLatency = missLatency[Read] + missLatency[Write]; 2012316SN/A 2022316SN/A overallMissLatency 2032316SN/A .name(name() + ".overall_miss_latency") 2042316SN/A .desc("number of overall miss cycles") 2052316SN/A .flags(total) 2062316SN/A ; 2072794Sktlim@umich.edu overallMissLatency = demandMissLatency + missLatency[Soft_Prefetch] + 2082794Sktlim@umich.edu missLatency[Hard_Prefetch]; 2092794Sktlim@umich.edu 2102316SN/A // access formulas 2112316SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 2121858SN/A Packet::Command cmd = (Packet::CommandEnum)access_idx; 2132292SN/A const string &cstr = cmd.toString(); 2142292SN/A 2151681SN/A accesses[access_idx] 2161681SN/A .name(name() + "." + cstr + "_accesses") 2172325SN/A .desc("number of " + cstr + " accesses(hits+misses)") 2182325SN/A .flags(total | nozero | nonan) 2192325SN/A ; 2201060SN/A 2212292SN/A accesses[access_idx] = hits[access_idx] + misses[access_idx]; 2222292SN/A } 2232292SN/A 2242292SN/A demandAccesses 2252292SN/A .name(name() + ".demand_accesses") 2262292SN/A .desc("number of demand (read+write) accesses") 2271060SN/A .flags(total) 2281060SN/A ; 2291060SN/A demandAccesses = demandHits + demandMisses; 2301060SN/A 2311060SN/A overallAccesses 2321060SN/A .name(name() + ".overall_accesses") 2331060SN/A .desc("number of overall (read+write) accesses") 2341060SN/A .flags(total) 2351060SN/A ; 2361060SN/A overallAccesses = overallHits + overallMisses; 2371060SN/A 2382292SN/A // miss rate formulas 2391060SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 2401060SN/A Packet::Command cmd = (Packet::CommandEnum)access_idx; 2411060SN/A const string &cstr = cmd.toString(); 2421060SN/A 2431060SN/A missRate[access_idx] 2441060SN/A .name(name() + "." + cstr + "_miss_rate") 2451060SN/A .desc("miss rate for " + cstr + " accesses") 2461060SN/A .flags(total | nozero | nonan) 2472316SN/A ; 2482292SN/A 2492292SN/A missRate[access_idx] = misses[access_idx] / accesses[access_idx]; 2502292SN/A } 2512292SN/A 2522292SN/A demandMissRate 2532307SN/A .name(name() + ".demand_miss_rate") 2542831Sksewell@umich.edu .desc("miss rate for demand accesses") 2552831Sksewell@umich.edu .flags(total) 2562831Sksewell@umich.edu ; 2572831Sksewell@umich.edu demandMissRate = demandMisses / demandAccesses; 2582831Sksewell@umich.edu 2592831Sksewell@umich.edu overallMissRate 2602292SN/A .name(name() + ".overall_miss_rate") 2612307SN/A .desc("miss rate for overall accesses") 2622292SN/A .flags(total) 2632292SN/A ; 2642316SN/A overallMissRate = overallMisses / overallAccesses; 2652292SN/A 2662292SN/A // miss latency formulas 2672292SN/A for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { 2682292SN/A Packet::Command cmd = (Packet::CommandEnum)access_idx; 2692292SN/A const string &cstr = cmd.toString(); 2702292SN/A 2711060SN/A avgMissLatency[access_idx] 2722292SN/A .name(name() + "." + cstr + "_avg_miss_latency") 2732292SN/A .desc("average " + cstr + " miss latency") 2741060SN/A .flags(total | nozero | nonan) 2752292SN/A ; 2762307SN/A 2772292SN/A avgMissLatency[access_idx] = 2782292SN/A missLatency[access_idx] / misses[access_idx]; 2792292SN/A } 2802325SN/A 2812292SN/A demandAvgMissLatency 2822292SN/A .name(name() + ".demand_avg_miss_latency") 2832292SN/A .desc("average overall miss latency") 2842325SN/A .flags(total) 2852292SN/A ; 2862292SN/A demandAvgMissLatency = demandMissLatency / demandMisses; 2872292SN/A 2882292SN/A overallAvgMissLatency 2892292SN/A .name(name() + ".overall_avg_miss_latency") 2902292SN/A .desc("average overall miss latency") 2912292SN/A .flags(total) 2922292SN/A ; 2932292SN/A overallAvgMissLatency = overallMissLatency / overallMisses; 2942292SN/A 2952292SN/A blocked_cycles.init(NUM_BLOCKED_CAUSES); 2962325SN/A blocked_cycles 2972292SN/A .name(name() + ".blocked_cycles") 2982292SN/A .desc("number of cycles access was blocked") 2992292SN/A .subname(Blocked_NoMSHRs, "no_mshrs") 3002325SN/A .subname(Blocked_NoTargets, "no_targets") 3012292SN/A ; 3022292SN/A 3032292SN/A 3042292SN/A blocked_causes.init(NUM_BLOCKED_CAUSES); 3052292SN/A blocked_causes 3062292SN/A .name(name() + ".blocked") 3072292SN/A .desc("number of cycles access was blocked") 3082292SN/A .subname(Blocked_NoMSHRs, "no_mshrs") 3092292SN/A .subname(Blocked_NoTargets, "no_targets") 3102292SN/A ; 3112292SN/A 3122292SN/A avg_blocked 3132292SN/A .name(name() + ".avg_blocked_cycles") 3142292SN/A .desc("average number of cycles each access was blocked") 3152292SN/A .subname(Blocked_NoMSHRs, "no_mshrs") 3162292SN/A .subname(Blocked_NoTargets, "no_targets") 3172292SN/A ; 3181060SN/A 3192292SN/A avg_blocked = blocked_cycles / blocked_causes; 3201060SN/A 3211060SN/A fastWrites 3222292SN/A .name(name() + ".fast_writes") 3232292SN/A .desc("number of fast writes performed") 3242292SN/A ; 3252829Sksewell@umich.edu 3262829Sksewell@umich.edu cacheCopies 3272292SN/A .name(name() + ".cache_copies") 3281060SN/A .desc("number of cache copies performed") 3291060SN/A ; 3301060SN/A} 3311755SN/A