Nimish Girdhar <nimishg <at> tamu.edu> writes:

> 
> 
> Thanks for your reply.
> I am looking to insert my counters in the gem5 source code so that I can 
look at them and do some calculations while the benchmark is running on the 
gem5 simulated hardware.....
> I don't get the part of probe infrastructure....can you explain it a bit 
more...
> Thanks,
> On Mar 24, 2015 3:00 AM, "Andreas Hansson" <Andreas.Hansson <at> arm.com> 
wrote:
> 
> 
> 
> 
> Hi Nimish,
> 
> When you say “count at runtime”, do you mean 1) in the software on the 
guest, or 2) just in a simulated hardware module? For #1 I would suggest to 
add them as PMU counters, and #2 you can use the probe infrastructure and a 
custom probe listener.
> 
> Andreas
> 
> 
> 
> From: Nimish Girdhar <nimishg <at> tamu.edu>Reply-To: gem5 users mailing 
list <gem5-users <at> gem5.org>Date: Tuesday, 24 March 2015 03:31To: gem5 
users mailing list <gem5-users <at> gem5.org>Subject: [gem5-users] Counting 
cache misses runtime
> 
> 
> Hello all,
> 
> I am working with ARM full system mode with classic memory model and I 
want to count the icache, dcache, L2 misses at runtime. I am not able to 
find where in the source code are these counters resident. I tried tracing 
back from the regstats in the src/mem/base.cc
>  file but in vain.
> 
> Has anybody done it before?  
> 
> Thanks,
> 

Hi Nimish,

My understanding is that you want your CPU side to be able to access stats 
from I/D/L2 caches for which you want to access the cache pointers.

Below is my implementation which a) May be a bit specific to my own arch b) 
Is a bit hacky and not a clean implementation. 

You will notice that your cpu defines an icacheport and a dcacheport 
(master ports) to send/receive requests/responses from the 1st level 
caches. 

To access icache (and dcache) I did the following -

In my src/mem/ports.cc,

I created a function to get a * slave-port's owner's pointer * -

MemObject*
MasterPort::GetSlaveOwner()
{
    MemObject *a = &_slavePort->owner;
    return a;
}

Then in my cpu.cc, since I know I am accessing the cache pointer, I 
typecast this MemObject as a CacheObject and access IC data -

Cache<LRU>*  pointer_ic = (Cache<LRU>*)cpu->getInstPort().GetSlaveOwner();

uint64_t ic_miss_data = pointer_ic->overallMisses.total()

The above works for DC as well.

For L2 cache, it is a bit more complicated due to the presence of a bus 
between the L1 and L2 cache (at least in my case).

So I do the following -

Using the Icache pointer that I just obtained above, I access the memory 
side port of the Icache (pointer_ic->memSidePort).

The slave-port corresponding to this memsideport is on the coherent bus. So 
I use the same GetSlaveOwner function defined above, to access the slave-
port and then its owner. This needs to be type-casted as a coherent bus (in 
my case).

CoherentBus*  pointer_bus =  (CoherentBus*)pointer_ic->memSidePort-
>GetSlaveOwner();

Now I have the pointer to the Coherent Bus. With this I access the master 
port for the bus (which is where my L2 is connected) and get its slave-
port's owner which is the L2.

Cache<LRU>*  pointer_l2 = (Cache<LRU>*) pointer_bus->masterPorts[0]-
>GetSlaveOwner();

uint64_t l2_miss_data = pointer_l2->overallMisses.total()

If you would need to access the l3, you can follow the same analogy above 
and go one step further etc.

Again, based on how your caches are attached to the buses, this 
implementation may change, but hopefully the above will point you in the 
right direction.

Best,
Gokul Subramanian Ravi

University of Wisconsin - Madison


_______________________________________________
gem5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to