file interface support for multiple threads; icachebuffer bug fix; cache statistics made richer with half misses, combined writes
This commit is contained in:
parent
aa5755c34e
commit
a0f7fb276d
|
@ -119,10 +119,10 @@ public class RunnableThread implements Encoding, Runnable {
|
|||
&& EmulatorConfig.communicationType == CommunicationType.file) {
|
||||
//trace-file based simulation
|
||||
|
||||
for(int core = 0; core < maxCoreAssign; core++)
|
||||
{
|
||||
ArchitecturalComponent.getCore(core).getExecEngine().setExecutionBegun(true);
|
||||
}
|
||||
// for(int core = 0; core < maxCoreAssign; core++)
|
||||
// {
|
||||
// ArchitecturalComponent.getCore(core).getExecEngine().setExecutionBegun(true);
|
||||
// }
|
||||
|
||||
long microOpsReadFromFile = 0;
|
||||
long microOpsSentToPipelines = 0;
|
||||
|
@ -151,6 +151,9 @@ public class RunnableThread implements Encoding, Runnable {
|
|||
iNew =Instruction.getInvalidInstruction();
|
||||
else
|
||||
{
|
||||
if(ArchitecturalComponent.getCore(core).getExecEngine().isExecutionBegun() == false)
|
||||
ArchitecturalComponent.getCore(core).getExecEngine().setExecutionBegun(true);
|
||||
|
||||
microOpsReadFromFile++;
|
||||
if(microOpsReadFromFile < SimulationConfig.NumInsToIgnore)
|
||||
{
|
||||
|
@ -205,8 +208,12 @@ public class RunnableThread implements Encoding, Runnable {
|
|||
}
|
||||
}
|
||||
|
||||
inputToPipeline[core].enqueue(iNew);
|
||||
microOpsSentToPipelines++;
|
||||
if(ArchitecturalComponent.getCore(core).getExecEngine().isExecutionBegun())
|
||||
{
|
||||
inputToPipeline[core].enqueue(iNew);
|
||||
microOpsSentToPipelines++;
|
||||
}
|
||||
|
||||
if(line==null)
|
||||
{
|
||||
tracesDoneReading[core] = true;
|
||||
|
|
|
@ -490,19 +490,23 @@ public class Statistics {
|
|||
}
|
||||
}
|
||||
|
||||
static void printStatisticsForACache(String name,
|
||||
long hits, long misses, long numberOfCompulsoryMisses, long evictions, double avgNumEventsInMSHR, double avgNumEventsInMSHREntry) throws IOException
|
||||
static void printStatisticsForACache(String name, long requests,
|
||||
long hits, long misses, long halfmisses, long combinedWrites, long numberOfCompulsoryMisses, long evictions, long accesses, double avgNumEventsInMSHR, double avgNumEventsInMSHREntry) throws IOException
|
||||
{
|
||||
outputFileWriter.write("\n");
|
||||
outputFileWriter.write("\n" + name + " Requests\t=\t" + requests);
|
||||
outputFileWriter.write("\n" + name + " Hits\t=\t" + hits);
|
||||
outputFileWriter.write("\n" + name + " Misses\t=\t" + misses);
|
||||
outputFileWriter.write("\n" + name + " Accesses\t=\t" + (hits+misses));
|
||||
outputFileWriter.write("\n" + name + " Compulsory Misses\t=\t" + numberOfCompulsoryMisses);
|
||||
outputFileWriter.write("\n" + name + " Full-Misses\t=\t" + misses);
|
||||
outputFileWriter.write("\n" + name + " Half-Misses\t=\t" + halfmisses);
|
||||
outputFileWriter.write("\n" + name + " Combined-Writes\t=\t" + combinedWrites);
|
||||
if(Cache.toCountCompulsoryMisses)
|
||||
outputFileWriter.write("\n" + name + " Compulsory Misses\t=\t" + numberOfCompulsoryMisses);
|
||||
outputFileWriter.write("\n" + name + " Accesses\t=\t" + accesses);
|
||||
|
||||
float hitrate = (float)hits/(float)(hits+misses);
|
||||
float hitrate = (float)hits/(float)(requests);
|
||||
outputFileWriter.write("\n" + name + " Hit-Rate\t=\t" + hitrate);
|
||||
|
||||
float missrate = (float)misses/(float)(hits+misses);
|
||||
float missrate = (float)(misses+halfmisses)/(float)(requests);
|
||||
outputFileWriter.write("\n" + name + " Miss-Rate\t=\t" + missrate);
|
||||
|
||||
outputFileWriter.write("\n" + name + " AvgNumEventsInMSHR\t=\t" + formatDouble(avgNumEventsInMSHR));
|
||||
|
@ -514,19 +518,23 @@ public class Statistics {
|
|||
|
||||
static void printCacheStats(Cache c) throws IOException
|
||||
{
|
||||
printStatisticsForACache(c.toString(), c.hits, c.misses, c.numberOfCompulsoryMisses, c.evictions, c.getAvgNumEventsPendingInMSHR(), c.getAvgNumEventsPendingInMSHREntry());
|
||||
printStatisticsForACache(c.toString(), c.noOfRequests, c.hits, c.misses, c.halfmisses, c.combinedWrites, c.numberOfCompulsoryMisses, c.evictions, c.noOfAccesses, c.getAvgNumEventsPendingInMSHR(), c.getAvgNumEventsPendingInMSHREntry());
|
||||
}
|
||||
|
||||
static void printConsolidatedCacheStats(String cacheName,
|
||||
Vector<Cache> cacheArray) throws IOException
|
||||
{
|
||||
long hits = 0, misses = 0, compulsoryMisses = 0, evictions = 0;
|
||||
long requests = 0, hits = 0, misses = 0, halfmisses = 0, combinedWrites = 0, compulsoryMisses = 0, evictions = 0, accesses = 0;
|
||||
|
||||
for(Cache c : cacheArray) {
|
||||
requests += c.noOfRequests;
|
||||
hits += c.hits;
|
||||
misses += c.misses;
|
||||
halfmisses += c.halfmisses;
|
||||
combinedWrites += c.combinedWrites;
|
||||
compulsoryMisses += c.numberOfCompulsoryMisses;
|
||||
evictions += c.evictions;
|
||||
accesses = c.noOfAccesses;
|
||||
}
|
||||
|
||||
int numCaches = 0;
|
||||
|
@ -544,7 +552,7 @@ public class Statistics {
|
|||
avgNumEventsInMSHR = avgNumEventsInMSHR / (double)numCaches;
|
||||
avgNumEventsInMSHREntry = avgNumEventsInMSHREntry / (double)numCaches;
|
||||
|
||||
printStatisticsForACache(cacheName, hits, misses, compulsoryMisses, evictions, avgNumEventsInMSHR, avgNumEventsInMSHREntry);
|
||||
printStatisticsForACache(cacheName, requests, hits, misses, halfmisses, combinedWrites, compulsoryMisses, evictions, accesses, avgNumEventsInMSHR, avgNumEventsInMSHREntry);
|
||||
}
|
||||
|
||||
static void printInsWorkingSetStats() throws IOException {
|
||||
|
|
|
@ -97,6 +97,8 @@ public class Cache extends SimulationElement {
|
|||
public long noOfWritesReceived;
|
||||
public long hits;
|
||||
public long misses;
|
||||
public long halfmisses;
|
||||
public long combinedWrites;
|
||||
public long evictions;
|
||||
public boolean debug = false;
|
||||
public NucaType nucaType;
|
||||
|
@ -201,6 +203,8 @@ public class Cache extends SimulationElement {
|
|||
noOfWritesReceived = 0;
|
||||
this.hits = 0;
|
||||
this.misses = 0;
|
||||
this.halfmisses = 0;
|
||||
this.combinedWrites = 0;
|
||||
this.evictions = 0;
|
||||
// make the cache
|
||||
makeCache(cacheParameters.isDirectory);
|
||||
|
@ -218,6 +222,8 @@ public class Cache extends SimulationElement {
|
|||
addressesAccessedSoFar = new TreeSet<Long>();
|
||||
numberOfCompulsoryMisses = 0;
|
||||
}
|
||||
|
||||
halfmissList = new ArrayList<Event>();
|
||||
}
|
||||
|
||||
|
||||
|
@ -227,6 +233,19 @@ public class Cache extends SimulationElement {
|
|||
|
||||
private boolean printCacheDebugMessages = false;
|
||||
|
||||
//request (read or write or line-forward from another cache)
|
||||
// - read (*reads++)
|
||||
// - line found in cache (hits++)
|
||||
// - line not in cache
|
||||
// - entry exists in MSHR for same addr (halfmisses++)
|
||||
// - no MSHR entry (misses++)
|
||||
// - write (*writes++)
|
||||
// - line found in cache (hits++)
|
||||
// - line not in cache
|
||||
// - entry exists in MSHR for same addr (halfmisses++)
|
||||
// - latest MSHR entry for that addr is a write (combinedWrites++)
|
||||
// - no MSHR entry (misses++)
|
||||
ArrayList<Event> halfmissList;
|
||||
public void handleEvent(EventQueue eventQ, Event e) {
|
||||
|
||||
|
||||
|
@ -236,9 +255,24 @@ public class Cache extends SimulationElement {
|
|||
long addr = ((AddressCarryingEvent) event).getAddress();
|
||||
RequestType requestType = event.getRequestType();
|
||||
|
||||
noOfAccesses++;
|
||||
|
||||
if(mshr.isAddrInMSHR(addr) &&
|
||||
(requestType==RequestType.Cache_Read || requestType==RequestType.Cache_Write || requestType==RequestType.EvictCacheLine)) {
|
||||
if(requestType==RequestType.Cache_Read || requestType==RequestType.Cache_Write)
|
||||
{
|
||||
halfmisses++;
|
||||
noOfRequests++;
|
||||
// if(this.cacheName.contains("L1"))
|
||||
// {
|
||||
// System.out.println("half miss event added to mshr : " + e.serializationID);
|
||||
// halfmissList.add(event);
|
||||
// if(event.serializationID == 4385)
|
||||
// {
|
||||
// System.out.println(event.serializationID);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
mshr.addToMSHR(event);
|
||||
return;
|
||||
}
|
||||
|
@ -246,6 +280,7 @@ public class Cache extends SimulationElement {
|
|||
switch (event.getRequestType()) {
|
||||
case Cache_Read:
|
||||
case Cache_Write: {
|
||||
noOfRequests++;
|
||||
handleAccess(addr, requestType, event);
|
||||
break;
|
||||
}
|
||||
|
@ -266,6 +301,7 @@ public class Cache extends SimulationElement {
|
|||
}
|
||||
|
||||
case DirectoryCachelineForwardRequest: {
|
||||
noOfRequests++;
|
||||
handleDirectoryCachelineForwardRequest(addr, (Cache) (((AddressCarryingEvent) event).getPayloadElement()));
|
||||
break;
|
||||
}
|
||||
|
@ -355,8 +391,10 @@ public class Cache extends SimulationElement {
|
|||
|
||||
// IF HIT
|
||||
if (cl != null) {
|
||||
hits++;
|
||||
cacheHit(addr, requestType, cl, event);
|
||||
} else {
|
||||
misses++;
|
||||
if (this.mycoherence != null) {
|
||||
if (requestType == RequestType.Cache_Write) {
|
||||
mycoherence.writeMiss(addr, this);
|
||||
|
@ -378,9 +416,6 @@ public class Cache extends SimulationElement {
|
|||
|
||||
protected void cacheHit(long addr, RequestType requestType, CacheLine cl,
|
||||
AddressCarryingEvent event) {
|
||||
hits++;
|
||||
noOfRequests++;
|
||||
noOfAccesses++;
|
||||
|
||||
if (requestType == RequestType.Cache_Read) {
|
||||
sendAcknowledgement(event);
|
||||
|
@ -561,11 +596,6 @@ public class Cache extends SimulationElement {
|
|||
}
|
||||
|
||||
public void fillAndSatisfyRequests(long addr) {
|
||||
int numPendingEvents = mshr.getNumPendingEventsForAddr(addr);
|
||||
misses += numPendingEvents;
|
||||
noOfRequests += numPendingEvents;
|
||||
noOfAccesses += 1 + numPendingEvents;
|
||||
|
||||
CacheLine evictedLine = this.fill(addr, MESI.SHARED);
|
||||
handleEvictedLine(evictedLine);
|
||||
processEventsInMSHR(addr);
|
||||
|
@ -579,10 +609,20 @@ public class Cache extends SimulationElement {
|
|||
switch(event.getRequestType()) {
|
||||
case Cache_Read: {
|
||||
sendAcknowledgement(event);
|
||||
// if(this.cacheName.contains("L1"))
|
||||
// {
|
||||
// System.out.println("process read miss : " + event.serializationID);
|
||||
// halfmissList.remove(event);
|
||||
// }
|
||||
break;
|
||||
}
|
||||
|
||||
case Cache_Write: {
|
||||
// if(this.cacheName.contains("L1"))
|
||||
// {
|
||||
// System.out.println("process write miss : " + event.serializationID);
|
||||
// halfmissList.remove(event);
|
||||
// }
|
||||
CacheLine cl = accessValid(addr);
|
||||
|
||||
if(cl!=null) {
|
||||
|
|
|
@ -28,6 +28,7 @@ public class MSHR {
|
|||
if(event.getRequestType() == RequestType.Cache_Write
|
||||
&& missList.getLast().getRequestType() == RequestType.Cache_Write)
|
||||
{
|
||||
containingCache.combinedWrites++;
|
||||
return;
|
||||
}
|
||||
missList.add(event);
|
||||
|
|
|
@ -52,7 +52,7 @@ public class FetchUnitIn_MII extends SimulationElement
|
|||
this.ifId_latch = execEngine.getIfIdLatch();
|
||||
|
||||
this.fetchBufferCapacity = (int)(core.getIssueWidth()
|
||||
* (SystemConfig.core[core.getCore_number()].getICacheLatency()));
|
||||
* (SystemConfig.core[core.getCore_number()].getICacheLatency()/core.getStepSize()));
|
||||
this.fetchBuffer = new Instruction[this.fetchBufferCapacity];
|
||||
this.fetchFillCount=0;
|
||||
this.fetchBufferIndex=0;
|
||||
|
|
|
@ -230,7 +230,7 @@ public class OutOrderExecutionEngine extends ExecutionEngine {
|
|||
this.coreMemorySystem = coreMemorySystem;
|
||||
this.outOrderCoreMemorySystem = (OutOrderCoreMemorySystem)coreMemorySystem;
|
||||
this.iCacheBuffer = new ICacheBuffer((int)(core.getDecodeWidth() *
|
||||
coreMemorySystem.getiCache().getLatency()));
|
||||
coreMemorySystem.getiCache().getLatency()/core.getStepSize()));
|
||||
this.fetcher.setICacheBuffer(iCacheBuffer);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue