ruby: moved cache stats from Profiler to CacheMemory

Caches are now responsible for their own statistic gathering.  This
requires a direct callback from the protocol on misses, and so all
future protocols need to take this into account.
This commit is contained in:
Derek Hower 2009-07-20 09:40:43 -05:00
parent 308419b947
commit e59d0e3e89
12 changed files with 557 additions and 561 deletions

View file

@ -58,6 +58,7 @@ machine(L1Cache, "MI Example L1 Cache"): LATENCY_CACHE_RESPONSE_LATENCY LATENCY
Entry lookup(Address);
void changePermission(Address, AccessPermission);
bool isTagPresent(Address);
void profileMiss(CacheMsg);
}
// TBE fields
@ -259,6 +260,12 @@ machine(L1Cache, "MI Example L1 Cache"): LATENCY_CACHE_RESPONSE_LATENCY LATENCY
profileMsgDelay(2, forwardRequestNetwork_in.dequeue_getDelayCycles());
}
action(p_profileMiss, "p", desc="Profile cache miss") {
peek(mandatoryQueue_in, CacheMsg) {
cacheMemory.profileMiss(in_msg);
}
}
action(r_load_hit, "r", desc="Notify sequencer the load completed.") {
DEBUG_EXPR(cacheMemory[address].DataBlk);
sequencer.readCallback(address, cacheMemory[address].DataBlk);
@ -326,6 +333,7 @@ machine(L1Cache, "MI Example L1 Cache"): LATENCY_CACHE_RESPONSE_LATENCY LATENCY
v_allocateTBE;
i_allocateL1CacheBlock;
a_issueRequest;
p_profileMiss;
m_popMandatoryQueue;
}
@ -333,6 +341,7 @@ machine(L1Cache, "MI Example L1 Cache"): LATENCY_CACHE_RESPONSE_LATENCY LATENCY
v_allocateTBE;
i_allocateL1CacheBlock;
a_issueRequest;
p_profileMiss;
m_popMandatoryQueue;
}

View file

@ -48,7 +48,7 @@ CacheProfiler::CacheProfiler(string description)
{
m_description = description;
m_requestTypeVec_ptr = new Vector<int>;
m_requestTypeVec_ptr->setSize(int(GenericRequestType_NUM));
m_requestTypeVec_ptr->setSize(int(CacheRequestType_NUM));
clearStats();
}
@ -70,30 +70,22 @@ void CacheProfiler::printStats(ostream& out) const
out << description << "_total_hw_prefetches: " << m_hw_prefetches << endl;
double trans_executed = double(g_system_ptr->getProfiler()->getTotalTransactionsExecuted());
double inst_executed = double(g_system_ptr->getProfiler()->getTotalInstructionsExecuted());
out << description << "_misses_per_transaction: " << double(m_misses) / trans_executed << endl;
out << description << "_misses_per_instruction: " << double(m_misses) / inst_executed << endl;
out << description << "_instructions_per_misses: ";
if (m_misses > 0) {
out << inst_executed / double(m_misses) << endl;
} else {
out << "NaN" << endl;
}
out << endl;
int requests = 0;
for(int i=0; i<int(GenericRequestType_NUM); i++) {
for(int i=0; i<int(CacheRequestType_NUM); i++) {
requests += m_requestTypeVec_ptr->ref(i);
}
assert(m_misses == requests);
if (requests > 0) {
for(int i=0; i<int(GenericRequestType_NUM); i++){
for(int i=0; i<int(CacheRequestType_NUM); i++){
if (m_requestTypeVec_ptr->ref(i) > 0) {
out << description << "_request_type_" << GenericRequestType_to_string(GenericRequestType(i)) << ": "
out << description << "_request_type_" << CacheRequestType_to_string(CacheRequestType(i)) << ": "
<< (100.0 * double((m_requestTypeVec_ptr->ref(i)))) / double(requests)
<< "%" << endl;
}
@ -116,7 +108,7 @@ void CacheProfiler::printStats(ostream& out) const
void CacheProfiler::clearStats()
{
for(int i=0; i<int(GenericRequestType_NUM); i++) {
for(int i=0; i<int(CacheRequestType_NUM); i++) {
m_requestTypeVec_ptr->ref(i) = 0;
}
m_requestSize.clear();
@ -130,7 +122,7 @@ void CacheProfiler::clearStats()
}
}
void CacheProfiler::addStatSample(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit)
void CacheProfiler::addStatSample(CacheRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit)
{
m_misses++;

View file

@ -44,7 +44,7 @@
#include "mem/ruby/common/Histogram.hh"
#include "mem/protocol/AccessModeType.hh"
#include "mem/protocol/PrefetchBit.hh"
#include "mem/protocol/GenericRequestType.hh"
#include "mem/protocol/CacheRequestType.hh"
template <class TYPE> class Vector;
@ -60,7 +60,7 @@ public:
void printStats(ostream& out) const;
void clearStats();
void addStatSample(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit);
void addStatSample(CacheRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit);
void print(ostream& out) const;
private:

View file

@ -380,9 +380,9 @@ void Profiler::printStats(ostream& out, bool short_stats)
out << endl;
m_L1D_cache_profiler_ptr->printStats(out);
m_L1I_cache_profiler_ptr->printStats(out);
m_L2_cache_profiler_ptr->printStats(out);
// m_L1D_cache_profiler_ptr->printStats(out);
// m_L1I_cache_profiler_ptr->printStats(out);
// m_L2_cache_profiler_ptr->printStats(out);
out << endl;
@ -773,25 +773,6 @@ void Profiler::clearStats()
m_ruby_start = g_eventQueue_ptr->getTime();
}
void Profiler::addPrimaryStatSample(const CacheMsg& msg, NodeID id)
{
if (Protocol::m_TwoLevelCache) {
if (msg.getType() == CacheRequestType_IFETCH) {
addL1IStatSample(msg, id);
} else {
addL1DStatSample(msg, id);
}
// profile the address after an L1 miss (outside of the processor for CMP)
if (Protocol::m_CMP) {
addAddressTraceSample(msg, id);
}
} else {
addL2StatSample(CacheRequestType_to_GenericRequestType(msg.getType()),
msg.getAccessMode(), msg.getSize(), msg.getPrefetch(), id);
addAddressTraceSample(msg, id);
}
}
void Profiler::profileConflictingRequests(const Address& addr)
{
assert(addr == line_address(addr));
@ -805,39 +786,6 @@ void Profiler::profileConflictingRequests(const Address& addr)
m_conflicting_map_ptr->add(addr, current_time);
}
void Profiler::addSecondaryStatSample(CacheRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID id)
{
addSecondaryStatSample(CacheRequestType_to_GenericRequestType(requestType), type, msgSize, pfBit, id);
}
void Profiler::addSecondaryStatSample(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID id)
{
addL2StatSample(requestType, type, msgSize, pfBit, id);
}
void Profiler::addL2StatSample(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID id)
{
m_perProcTotalMisses[id]++;
if (type == AccessModeType_SupervisorMode) {
m_perProcSupervisorMisses[id]++;
} else {
m_perProcUserMisses[id]++;
}
m_L2_cache_profiler_ptr->addStatSample(requestType, type, msgSize, pfBit);
}
void Profiler::addL1DStatSample(const CacheMsg& msg, NodeID id)
{
m_L1D_cache_profiler_ptr->addStatSample(CacheRequestType_to_GenericRequestType(msg.getType()),
msg.getAccessMode(), msg.getSize(), msg.getPrefetch());
}
void Profiler::addL1IStatSample(const CacheMsg& msg, NodeID id)
{
m_L1I_cache_profiler_ptr->addStatSample(CacheRequestType_to_GenericRequestType(msg.getType()),
msg.getAccessMode(), msg.getSize(), msg.getPrefetch());
}
void Profiler::addAddressTraceSample(const CacheMsg& msg, NodeID id)
{
if (msg.getType() != CacheRequestType_IFETCH) {
@ -1055,30 +1003,6 @@ int64 Profiler::getTotalTransactionsExecuted() const
}
// The following case statement converts CacheRequestTypes to GenericRequestTypes
// allowing all profiling to be done with a single enum type instead of slow strings
GenericRequestType Profiler::CacheRequestType_to_GenericRequestType(const CacheRequestType& type) {
switch (type) {
case CacheRequestType_LD:
return GenericRequestType_LD;
break;
case CacheRequestType_ST:
return GenericRequestType_ST;
break;
case CacheRequestType_ATOMIC:
return GenericRequestType_ATOMIC;
break;
case CacheRequestType_IFETCH:
return GenericRequestType_IFETCH;
break;
case CacheRequestType_NULL:
return GenericRequestType_NULL;
break;
default:
ERROR_MSG("Unexpected cache request type");
}
}
void Profiler::rubyWatch(int id){
//int rn_g1 = 0;//SIMICS_get_register_number(id, "g1");
uint64 tr = 0;//SIMICS_read_register(id, rn_g1);

View file

@ -126,9 +126,6 @@ public:
AddressProfiler* getAddressProfiler() { return m_address_profiler_ptr; }
AddressProfiler* getInstructionProfiler() { return m_inst_profiler_ptr; }
void addPrimaryStatSample(const CacheMsg& msg, NodeID id);
void addSecondaryStatSample(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID id);
void addSecondaryStatSample(CacheRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID id);
void addAddressTraceSample(const CacheMsg& msg, NodeID id);
void profileRequest(const string& requestStr);
@ -206,12 +203,6 @@ public:
private:
//added by SS
vector<string> m_memory_control_names;
// Private Methods
void addL2StatSample(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID id);
void addL1DStatSample(const CacheMsg& msg, NodeID id);
void addL1IStatSample(const CacheMsg& msg, NodeID id);
GenericRequestType CacheRequestType_to_GenericRequestType(const CacheRequestType& type);
// Private copy constructor and assignment operator
Profiler(const Profiler& obj);

View file

@ -79,33 +79,11 @@ void profile_sharing(const Address& addr, AccessType type, NodeID requestor, con
g_system_ptr->getProfiler()->profileSharing(addr, type, requestor, sharers, owner);
}
void profile_miss(const CacheMsg& msg, NodeID id)
{
// CMP profile address after L1 misses, not L2
ASSERT (!Protocol::m_CMP);
g_system_ptr->getProfiler()->addAddressTraceSample(msg, id);
g_system_ptr->getProfiler()->profileConflictingRequests(msg.getLineAddress());
g_system_ptr->getProfiler()->addSecondaryStatSample(msg.getType(),
msg.getAccessMode(), msg.getSize(), msg.getPrefetch(), id);
}
void profile_L1Cache_miss(const CacheMsg& msg, NodeID id)
{
g_system_ptr->getProfiler()->addPrimaryStatSample(msg, id);
}
void profileMsgDelay(int virtualNetwork, int delayCycles)
{
g_system_ptr->getProfiler()->profileMsgDelay(virtualNetwork, delayCycles);
}
void profile_L2Cache_miss(GenericRequestType requestType, AccessModeType type, int msgSize, PrefetchBit pfBit, NodeID nodeID)
{
g_system_ptr->getProfiler()->addSecondaryStatSample(requestType, type, msgSize, pfBit, nodeID);
}
void profile_token_retry(const Address& addr, AccessType type, int count)
{
g_system_ptr->getProfiler()->getAddressProfiler()->profileRetry(addr, type, count);

View file

@ -52,6 +52,8 @@
#include "mem/ruby/slicc_interface/AbstractCacheEntry.hh"
#include "mem/ruby/system/System.hh"
#include "mem/ruby/slicc_interface/AbstractController.hh"
#include "mem/ruby/profiler/CacheProfiler.hh"
#include "mem/protocol/CacheMsg.hh"
#include <vector>
class CacheMemory {
@ -111,6 +113,8 @@ public:
// Set this address to most recently used
void setMRU(const Address& address);
void profileMiss(const CacheMsg & msg);
void getMemoryValue(const Address& addr, char* value,
unsigned int size_in_bytes );
void setMemoryValue(const Address& addr, char* value,
@ -123,6 +127,8 @@ public:
void print(ostream& out) const;
void printData(ostream& out) const;
void printStats(ostream& out) const;
private:
// Private Methods
@ -154,6 +160,8 @@ private:
AbstractReplacementPolicy *m_replacementPolicy_ptr;
CacheProfiler* m_profiler_ptr;
int m_cache_num_sets;
int m_cache_num_set_bits;
int m_cache_assoc;
@ -182,6 +190,7 @@ inline
CacheMemory::CacheMemory(const string & name)
: m_cache_name(name)
{
m_profiler_ptr = new CacheProfiler(name);
}
inline
@ -495,6 +504,13 @@ void CacheMemory::setMRU(const Address& address)
g_eventQueue_ptr->getTime());
}
inline
void CacheMemory::profileMiss(const CacheMsg & msg)
{
m_profiler_ptr->addStatSample(msg.getType(), msg.getAccessMode(),
msg.getSize(), msg.getPrefetch());
}
inline
void CacheMemory::recordCacheContents(CacheRecorder& tr) const
{
@ -545,6 +561,12 @@ void CacheMemory::printData(ostream& out) const
out << "printData() not supported" << endl;
}
inline
void CacheMemory::printStats(ostream& out) const
{
m_profiler_ptr->printStats(out);
}
inline
void CacheMemory::getMemoryValue(const Address& addr, char* value,
unsigned int size_in_bytes ){

View file

@ -335,6 +335,10 @@ void RubySystem::printStats(ostream& out)
m_profiler_ptr->printStats(out);
m_network_ptr->printStats(out);
for (map<string, CacheMemory*>::const_iterator it = m_caches.begin();
it != m_caches.end(); it++) {
(*it).second->printStats(out);
}
for (map<string, AbstractController*>::const_iterator it = m_controllers.begin();
it != m_controllers.end(); it++) {
(*it).second->printStats(out);

View file

@ -1,76 +1,76 @@
["-r", "tests/configs/../../src/mem/ruby/config/MI_example-homogeneous.rb", "-p", "8", "-m", "1", "-s", "1024"]
print config: 1
system.cpu1: completed 10000 read accesses @3641101
system.cpu6: completed 10000 read accesses @3657885
system.cpu0: completed 10000 read accesses @3682054
system.cpu4: completed 10000 read accesses @3686756
system.cpu3: completed 10000 read accesses @3686791
system.cpu2: completed 10000 read accesses @3714721
system.cpu5: completed 10000 read accesses @3718986
system.cpu7: completed 10000 read accesses @3739388
system.cpu1: completed 20000 read accesses @6773990
system.cpu4: completed 20000 read accesses @6790313
system.cpu0: completed 20000 read accesses @6796672
system.cpu3: completed 20000 read accesses @6797278
system.cpu6: completed 20000 read accesses @6823694
system.cpu2: completed 20000 read accesses @6833547
system.cpu5: completed 20000 read accesses @6854676
system.cpu7: completed 20000 read accesses @6875905
system.cpu1: completed 30000 read accesses @9853256
system.cpu3: completed 30000 read accesses @9906665
system.cpu0: completed 30000 read accesses @9931557
system.cpu4: completed 30000 read accesses @9952518
system.cpu5: completed 30000 read accesses @9976242
system.cpu2: completed 30000 read accesses @9981306
system.cpu6: completed 30000 read accesses @10008066
system.cpu7: completed 30000 read accesses @10011960
system.cpu1: completed 40000 read accesses @13015878
system.cpu3: completed 40000 read accesses @13040111
system.cpu5: completed 40000 read accesses @13079687
system.cpu0: completed 40000 read accesses @13099309
system.cpu2: completed 40000 read accesses @13115004
system.cpu4: completed 40000 read accesses @13143910
system.cpu6: completed 40000 read accesses @13150020
system.cpu7: completed 40000 read accesses @13161356
system.cpu3: completed 50000 read accesses @16125452
system.cpu1: completed 50000 read accesses @16181745
system.cpu5: completed 50000 read accesses @16184066
system.cpu0: completed 50000 read accesses @16216286
system.cpu2: completed 50000 read accesses @16257216
system.cpu4: completed 50000 read accesses @16263973
system.cpu6: completed 50000 read accesses @16288792
system.cpu7: completed 50000 read accesses @16318993
system.cpu3: completed 60000 read accesses @19283536
system.cpu0: completed 60000 read accesses @19309937
system.cpu1: completed 60000 read accesses @19317676
system.cpu2: completed 60000 read accesses @19325470
system.cpu5: completed 60000 read accesses @19327514
system.cpu6: completed 60000 read accesses @19417822
system.cpu4: completed 60000 read accesses @19447479
system.cpu7: completed 60000 read accesses @19480386
system.cpu0: completed 70000 read accesses @22411174
system.cpu3: completed 70000 read accesses @22411178
system.cpu2: completed 70000 read accesses @22414508
system.cpu5: completed 70000 read accesses @22453684
system.cpu1: completed 70000 read accesses @22473724
system.cpu4: completed 70000 read accesses @22564254
system.cpu6: completed 70000 read accesses @22590390
system.cpu7: completed 70000 read accesses @22646034
system.cpu3: completed 80000 read accesses @25536114
system.cpu0: completed 80000 read accesses @25565410
system.cpu2: completed 80000 read accesses @25581306
system.cpu1: completed 80000 read accesses @25643150
system.cpu5: completed 80000 read accesses @25659302
system.cpu4: completed 80000 read accesses @25672250
system.cpu6: completed 80000 read accesses @25729734
system.cpu7: completed 80000 read accesses @25780094
system.cpu3: completed 90000 read accesses @28701520
system.cpu2: completed 90000 read accesses @28736898
system.cpu0: completed 90000 read accesses @28740612
system.cpu5: completed 90000 read accesses @28751484
system.cpu1: completed 90000 read accesses @28768980
system.cpu4: completed 90000 read accesses @28819348
system.cpu6: completed 90000 read accesses @28888794
system.cpu7: completed 90000 read accesses @28938947
system.cpu3: completed 100000 read accesses @31820150
system.cpu1: completed 10000 read accesses @3663630
system.cpu2: completed 10000 read accesses @3663638
system.cpu5: completed 10000 read accesses @3680002
system.cpu7: completed 10000 read accesses @3691164
system.cpu3: completed 10000 read accesses @3698130
system.cpu4: completed 10000 read accesses @3701748
system.cpu6: completed 10000 read accesses @3704092
system.cpu0: completed 10000 read accesses @3742302
system.cpu2: completed 20000 read accesses @6788966
system.cpu7: completed 20000 read accesses @6816416
system.cpu5: completed 20000 read accesses @6822351
system.cpu4: completed 20000 read accesses @6824056
system.cpu1: completed 20000 read accesses @6825604
system.cpu3: completed 20000 read accesses @6829578
system.cpu6: completed 20000 read accesses @6857232
system.cpu0: completed 20000 read accesses @6872452
system.cpu5: completed 30000 read accesses @9928492
system.cpu2: completed 30000 read accesses @9933192
system.cpu7: completed 30000 read accesses @9950074
system.cpu4: completed 30000 read accesses @9965775
system.cpu6: completed 30000 read accesses @9978835
system.cpu0: completed 30000 read accesses @9993926
system.cpu1: completed 30000 read accesses @9994767
system.cpu3: completed 30000 read accesses @9996366
system.cpu5: completed 40000 read accesses @13012070
system.cpu2: completed 40000 read accesses @13044972
system.cpu7: completed 40000 read accesses @13077010
system.cpu4: completed 40000 read accesses @13081178
system.cpu1: completed 40000 read accesses @13100740
system.cpu0: completed 40000 read accesses @13111135
system.cpu6: completed 40000 read accesses @13147706
system.cpu3: completed 40000 read accesses @13153176
system.cpu5: completed 50000 read accesses @16120762
system.cpu2: completed 50000 read accesses @16176586
system.cpu7: completed 50000 read accesses @16213417
system.cpu4: completed 50000 read accesses @16219872
system.cpu6: completed 50000 read accesses @16231538
system.cpu1: completed 50000 read accesses @16246976
system.cpu3: completed 50000 read accesses @16276612
system.cpu0: completed 50000 read accesses @16293234
system.cpu5: completed 60000 read accesses @19263804
system.cpu4: completed 60000 read accesses @19313220
system.cpu2: completed 60000 read accesses @19330470
system.cpu7: completed 60000 read accesses @19340197
system.cpu6: completed 60000 read accesses @19399766
system.cpu0: completed 60000 read accesses @19424570
system.cpu1: completed 60000 read accesses @19425712
system.cpu3: completed 60000 read accesses @19444952
system.cpu5: completed 70000 read accesses @22408750
system.cpu4: completed 70000 read accesses @22449746
system.cpu7: completed 70000 read accesses @22451736
system.cpu2: completed 70000 read accesses @22461052
system.cpu0: completed 70000 read accesses @22554296
system.cpu1: completed 70000 read accesses @22555310
system.cpu3: completed 70000 read accesses @22588935
system.cpu6: completed 70000 read accesses @22602456
system.cpu5: completed 80000 read accesses @25540598
system.cpu4: completed 80000 read accesses @25577430
system.cpu7: completed 80000 read accesses @25617532
system.cpu1: completed 80000 read accesses @25644879
system.cpu2: completed 80000 read accesses @25660256
system.cpu0: completed 80000 read accesses @25710799
system.cpu3: completed 80000 read accesses @25716714
system.cpu6: completed 80000 read accesses @25776606
system.cpu5: completed 90000 read accesses @28693458
system.cpu4: completed 90000 read accesses @28705416
system.cpu7: completed 90000 read accesses @28729734
system.cpu1: completed 90000 read accesses @28778532
system.cpu2: completed 90000 read accesses @28801770
system.cpu0: completed 90000 read accesses @28857559
system.cpu6: completed 90000 read accesses @28885159
system.cpu3: completed 90000 read accesses @28894168
system.cpu7: completed 100000 read accesses @31814464
hack: be nice to actually delete the event here

View file

@ -5,11 +5,11 @@ The Regents of The University of Michigan
All Rights Reserved
M5 compiled Jul 13 2009 11:01:42
M5 revision 57650468aff1+ 6297+ default
M5 started Jul 13 2009 11:01:45
M5 compiled Jul 19 2009 14:52:18
M5 revision 544d33334ee1+ 6369+ default tip
M5 started Jul 19 2009 14:52:23
M5 executing on clover-01.cs.wisc.edu
command line: build/ALPHA_SE/m5.fast -d build/ALPHA_SE/tests/fast/quick/50.memtest/alpha/linux/memtest-ruby -re tests/run.py build/ALPHA_SE/tests/fast/quick/50.memtest/alpha/linux/memtest-ruby
Global frequency set at 1000000000000 ticks per second
info: Entering event queue @ 0. Starting simulation...
Exiting @ tick 31820150 because maximum number of loads reached
Exiting @ tick 31814464 because maximum number of loads reached

View file

@ -1,34 +1,34 @@
---------- Begin Simulation Statistics ----------
host_mem_usage 1538632 # Number of bytes of host memory used
host_seconds 2021.99 # Real time elapsed on the host
host_tick_rate 15737 # Simulator tick rate (ticks/s)
host_mem_usage 1538656 # Number of bytes of host memory used
host_seconds 2552.36 # Real time elapsed on the host
host_tick_rate 12465 # Simulator tick rate (ticks/s)
sim_freq 1000000000000 # Frequency of simulated ticks
sim_seconds 0.000032 # Number of seconds simulated
sim_ticks 31820150 # Number of ticks simulated
sim_ticks 31814464 # Number of ticks simulated
system.cpu0.num_copies 0 # number of copy accesses completed
system.cpu0.num_reads 99856 # number of read accesses completed
system.cpu0.num_writes 53852 # number of write accesses completed
system.cpu0.num_reads 99342 # number of read accesses completed
system.cpu0.num_writes 53699 # number of write accesses completed
system.cpu1.num_copies 0 # number of copy accesses completed
system.cpu1.num_reads 99692 # number of read accesses completed
system.cpu1.num_writes 53561 # number of write accesses completed
system.cpu1.num_reads 99812 # number of read accesses completed
system.cpu1.num_writes 53757 # number of write accesses completed
system.cpu2.num_copies 0 # number of copy accesses completed
system.cpu2.num_reads 99805 # number of read accesses completed
system.cpu2.num_writes 53565 # number of write accesses completed
system.cpu2.num_reads 99597 # number of read accesses completed
system.cpu2.num_writes 53671 # number of write accesses completed
system.cpu3.num_copies 0 # number of copy accesses completed
system.cpu3.num_reads 100000 # number of read accesses completed
system.cpu3.num_writes 53663 # number of write accesses completed
system.cpu3.num_reads 99365 # number of read accesses completed
system.cpu3.num_writes 53444 # number of write accesses completed
system.cpu4.num_copies 0 # number of copy accesses completed
system.cpu4.num_reads 99420 # number of read accesses completed
system.cpu4.num_writes 53889 # number of write accesses completed
system.cpu4.num_reads 99713 # number of read accesses completed
system.cpu4.num_writes 54044 # number of write accesses completed
system.cpu5.num_copies 0 # number of copy accesses completed
system.cpu5.num_reads 99788 # number of read accesses completed
system.cpu5.num_writes 53529 # number of write accesses completed
system.cpu5.num_reads 99943 # number of read accesses completed
system.cpu5.num_writes 53789 # number of write accesses completed
system.cpu6.num_copies 0 # number of copy accesses completed
system.cpu6.num_reads 99210 # number of read accesses completed
system.cpu6.num_writes 53902 # number of write accesses completed
system.cpu6.num_reads 99307 # number of read accesses completed
system.cpu6.num_writes 53603 # number of write accesses completed
system.cpu7.num_copies 0 # number of copy accesses completed
system.cpu7.num_reads 99182 # number of read accesses completed
system.cpu7.num_writes 54075 # number of write accesses completed
system.cpu7.num_reads 100000 # number of read accesses completed
system.cpu7.num_writes 53881 # number of write accesses completed
---------- End Simulation Statistics ----------