base_cache.cc
来自「linux下基于c++的处理器仿真平台。具有处理器流水线」· CC 代码 · 共 253 行
CC
253 行
/* * Copyright (c) 2003, 2004, 2005 * The Regents of The University of Michigan * All Rights Reserved * * This code is part of the M5 simulator, developed by Nathan Binkert, * Erik Hallnor, Steve Raasch, and Steve Reinhardt, with contributions * from Ron Dreslinski, Dave Greene, Lisa Hsu, Kevin Lim, Ali Saidi, * and Andrew Schultz. * * Permission is granted to use, copy, create derivative works and * redistribute this software and such derivative works for any * purpose, so long as the copyright notice above, this grant of * permission, and the disclaimer below appear in all copies made; and * so long as the name of The University of Michigan is not used in * any advertising or publicity pertaining to the use or distribution * of this software without specific, written prior authorization. * * THIS SOFTWARE IS PROVIDED AS IS, WITHOUT REPRESENTATION FROM THE * UNIVERSITY OF MICHIGAN AS TO ITS FITNESS FOR ANY PURPOSE, AND * WITHOUT WARRANTY BY THE UNIVERSITY OF MICHIGAN OF ANY KIND, EITHER * EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE REGENTS OF THE UNIVERSITY OF MICHIGAN SHALL NOT BE * LIABLE FOR ANY DAMAGES, INCLUDING DIRECT, SPECIAL, INDIRECT, * INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WITH RESPECT TO ANY CLAIM * ARISING OUT OF OR IN CONNECTION WITH THE USE OF THE SOFTWARE, EVEN * IF IT HAS BEEN OR IS HEREAFTER ADVISED OF THE POSSIBILITY OF SUCH * DAMAGES. *//** * @file * Definition of BaseCache functions. */#include "mem/cache/base_cache.hh"#include "cpu/smt.hh"#include "cpu/base.hh"using namespace std;voidBaseCache::regStats(){ using namespace Stats; // Hit statistics for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { MemCmd cmd = (MemCmdEnum)access_idx; const string &cstr = cmd.toString(); hits[access_idx] .init(maxThreadsPerCPU) .name(name() + "." + cstr + "_hits") .desc("number of " + cstr + " hits") .flags(total | nozero | nonan) ; } demandHits .name(name() + ".demand_hits") .desc("number of demand (read+write) hits") .flags(total) ; demandHits = hits[Read] + hits[Write]; overallHits .name(name() + ".overall_hits") .desc("number of overall hits") .flags(total) ; overallHits = demandHits + hits[Soft_Prefetch] + hits[Hard_Prefetch] + hits[Writeback]; // Miss statistics for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { MemCmd cmd = (MemCmdEnum)access_idx; const string &cstr = cmd.toString(); misses[access_idx] .init(maxThreadsPerCPU) .name(name() + "." + cstr + "_misses") .desc("number of " + cstr + " misses") .flags(total | nozero | nonan) ; } demandMisses .name(name() + ".demand_misses") .desc("number of demand (read+write) misses") .flags(total) ; demandMisses = misses[Read] + misses[Write]; overallMisses .name(name() + ".overall_misses") .desc("number of overall misses") .flags(total) ; overallMisses = demandMisses + misses[Soft_Prefetch] + misses[Hard_Prefetch] + misses[Writeback]; // Miss latency statistics for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { MemCmd cmd = (MemCmdEnum)access_idx; const string &cstr = cmd.toString(); missLatency[access_idx] .init(maxThreadsPerCPU) .name(name() + "." + cstr + "_miss_latency") .desc("number of " + cstr + " miss cycles") .flags(total | nozero | nonan) ; } demandMissLatency .name(name() + ".demand_miss_latency") .desc("number of demand (read+write) miss cycles") .flags(total) ; demandMissLatency = missLatency[Read] + missLatency[Write]; overallMissLatency .name(name() + ".overall_miss_latency") .desc("number of overall miss cycles") .flags(total) ; overallMissLatency = demandMissLatency + missLatency[Soft_Prefetch] + missLatency[Hard_Prefetch]; // access formulas for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { MemCmd cmd = (MemCmdEnum)access_idx; const string &cstr = cmd.toString(); accesses[access_idx] .name(name() + "." + cstr + "_accesses") .desc("number of " + cstr + " accesses(hits+misses)") .flags(total | nozero | nonan) ; accesses[access_idx] = hits[access_idx] + misses[access_idx]; } demandAccesses .name(name() + ".demand_accesses") .desc("number of demand (read+write) accesses") .flags(total) ; demandAccesses = demandHits + demandMisses; overallAccesses .name(name() + ".overall_accesses") .desc("number of overall (read+write) accesses") .flags(total) ; overallAccesses = overallHits + overallMisses; // miss rate formulas for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { MemCmd cmd = (MemCmdEnum)access_idx; const string &cstr = cmd.toString(); missRate[access_idx] .name(name() + "." + cstr + "_miss_rate") .desc("miss rate for " + cstr + " accesses") .flags(total | nozero | nonan) ; missRate[access_idx] = misses[access_idx] / accesses[access_idx]; } demandMissRate .name(name() + ".demand_miss_rate") .desc("miss rate for demand accesses") .flags(total) ; demandMissRate = demandMisses / demandAccesses; overallMissRate .name(name() + ".overall_miss_rate") .desc("miss rate for overall accesses") .flags(total) ; overallMissRate = overallMisses / overallAccesses; // miss latency formulas for (int access_idx = 0; access_idx < NUM_MEM_CMDS; ++access_idx) { MemCmd cmd = (MemCmdEnum)access_idx; const string &cstr = cmd.toString(); avgMissLatency[access_idx] .name(name() + "." + cstr + "_avg_miss_latency") .desc("average " + cstr + " miss latency") .flags(total | nozero | nonan) ; avgMissLatency[access_idx] = missLatency[access_idx] / misses[access_idx]; } demandAvgMissLatency .name(name() + ".demand_avg_miss_latency") .desc("average overall miss latency") .flags(total) ; demandAvgMissLatency = demandMissLatency / demandMisses; overallAvgMissLatency .name(name() + ".overall_avg_miss_latency") .desc("average overall miss latency") .flags(total) ; overallAvgMissLatency = overallMissLatency / overallMisses; blocked_cycles.init(NUM_BLOCKED_CAUSES); blocked_cycles .name(name() + ".blocked_cycles") .desc("number of cycles access was blocked") .subname(Blocked_NoMSHRs, "no_mshrs") .subname(Blocked_NoTargets, "no_targets") ; blocked_causes.init(NUM_BLOCKED_CAUSES); blocked_causes .name(name() + ".blocked") .desc("number of cycles access was blocked") .subname(Blocked_NoMSHRs, "no_mshrs") .subname(Blocked_NoTargets, "no_targets") ; avg_blocked .name(name() + ".avg_blocked_cycles") .desc("average number of cycles each access was blocked") .subname(Blocked_NoMSHRs, "no_mshrs") .subname(Blocked_NoTargets, "no_targets") ; avg_blocked = blocked_cycles / blocked_causes; fastWrites .name(name() + ".fast_writes") .desc("number of fast writes performed") ; cacheCopies .name(name() + ".cache_copies") .desc("number of cache copies performed") ;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?