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