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