I have made the prefetcher work. The followings are the modifications which
have been posted at M5-dev maillist.
Please be caution if want to adopt stride prefetcher for L2 cache because
the pkt->req->getPC() may incur an alert due to the request may be issued by
L1 cache's prefetcher and L1's Writeback event.
=====================================
cache/prefetch/base.hh
=====================================
107,112d106
<
< Tick nextPrefetchReadyTime()
< {
< return pf.empty() ? MaxTick : pf.front()->time;
< }
<
=====================================
cache/cache.hh
=====================================
317,321d316
< /**
< * Moved from base.hh to here, baoyg
< */
< Tick nextMSHRReadyTime();
<
340,342d334
<
<
<
=====================================
cache/base.hh
=====================================
>
472c471
< //assert(false);
---
> assert(false);
=====================================
cache/cache_impl.hh
=====================================
808,818c808
< if (target->pkt->cmd == MemCmd::HardPFResp) {
< blk->status |= BlkHWPrefetched; //remove it when not use
tagged prefetcher
< delete target->pkt->req;
< delete target->pkt;
< } else{
< cpuSidePort->respond(target->pkt, completion_time);
< }
---
> cpuSidePort->respond(target->pkt, completion_time);
1325,1343d1315
< /**
< * find out next Ready Time from mshrQueue, writeBuffer and *prefetcher*
< */
< template<class TagStore>
< Tick
< Cache<TagStore>::nextMSHRReadyTime()
< {
< if(prefetchMiss || prefetchAccess){
< return std::min(prefetcher->nextPrefetchReadyTime(),
< (std::min(mshrQueue.nextMSHRReadyTime(),
< writeBuffer.nextMSHRReadyTime())));
< }
< else{
< return std::min(mshrQueue.nextMSHRReadyTime(),
< writeBuffer.nextMSHRReadyTime());
< }
< }
<
=====================================
cache/prefetch/stride.cc
=====================================
#include "arch/isa_traits.hh"
#include "mem/cache/prefetch/stride.hh"
void
StridePrefetcher::calculatePrefetch(PacketPtr &pkt, std::list<Addr>
&addresses,
std::list<Tick> &delays)
{
Addr blkAddr = pkt->getAddr() & ~(Addr)(this->blkSize-1);
int cpuID = pkt->req->getCpuNum();
if (!useCPUId) cpuID = 0;
/* Scan Table for IAddr Match */
std::list<strideEntry*>::iterator iter;
for (iter=table[cpuID].begin(); iter !=table[cpuID].end(); iter++) {
if ((*iter)->IAddr == pkt->req->getPC())
break;
}
if (iter != table[cpuID].end()) {
//Hit in table
int newStride = blkAddr - (*iter)->MAddr;
if (newStride == (*iter)->stride) {
(*iter)->confidence++;
}
else {
(*iter)->stride = newStride;
(*iter)->confidence--;
}
(*iter)->MAddr = blkAddr;
for (int d=1; d <= degree; d++) {
Addr newAddr = blkAddr + d * newStride;
if (this->pageStop &&
(blkAddr & ~(TheISA::VMPageSize - 1)) !=
(newAddr & ~(TheISA::VMPageSize - 1))) {
//Spanned the page, so now stop
this->pfSpanPage += degree - d + 1;
return;
}
else {
addresses.push_back(newAddr);
delays.push_back(latency);
}
}
}
else {
//Miss in table
//Find lowest confidence and replace
if(table[cpuID].size() >= 256){ //set default table size is 256
std::list<strideEntry*>:: iterator minPos = NULL;
int64_t minConf = 0xFFFFFFFL;
for (iter=table[cpuID].begin(); iter !=table[cpuID].end(); iter++)
{
if ((*iter)->confidence < minConf){
minPos = iter;
minConf = (*iter)->confidence;
}
}
table[cpuID].erase(iter);
}
strideEntry * newEntry = new strideEntry;
newEntry->IAddr = pkt->req->getPC();
newEntry->MAddr = blkAddr;
newEntry->stride = 0;
newEntry->confidence = 0;
table[cpuID].push_back(newEntry);
}
}
2008/7/23, Gary Chai <[EMAIL PROTECTED]>:
>
> Hi all:
> I meet prefetch error in the full system simulation. Does anybody know
> where I can find the prefetch patches, which help to correct prefetch
> problems.
>
> thanks
> Gary
>
> Steve Reinhardt wrote:
> > There are some problems with the prefetching support in the new memory
> > system... basically it did not get tested after the rewrite. There
> > were some patches posted to the mailing list recently that I will be
> > pushing to the development repository soon.
> >
> > Steve
> >
> > On Mon, Jul 21, 2008 at 10:31 AM, Gary Chai <[EMAIL PROTECTED]
> > <mailto:[EMAIL PROTECTED]>> wrote:
> >
> > Hi all:
> > I want to take a look at the result of prefetch, so I add two
> > lines in the configs/example/fs.py and keep others same.
> >
> > if options.l2cache:
> > test_sys.l2 = L2Cache(size = '2MB')
> > test_sys.tol2bus = Bus()
> > test_sys.l2.cpu_side = test_sys.tol2bus.port
> > test_sys.l2.mem_side = test_sys.membus.port
> > test_sys.l2.prefetch_policy = 'tagged' #### by me
> > test_sys.l2.prefetch_miss = 'true' #### by me
> >
> > Then the simulation is aborted and the following is the error.
> >
> > M5 compiled Jun 9 2008 21:51:22
> > M5 started Mon Jul 21 13:24:26 2008
> > M5 executing on seasmile-pc
> > command line: /home/m5/m5-2.0b5/build/ALPHA_FS/m5.debug -d result2
> > /home/m5/m5-2.0b5/configs/example/fs.py -t --caches -n 1 --l2cache
> > -b hello
> > Global frequency set at 1000000000000 ticks per second
> > warn: kernel located at: /dist/m5/system/binaries/vmlinux
> > 0: system.tsunami.io.rtc: Real-time clock set to Thu Jan 1
> > 00:00:00 2009
> > Listening for system connection on port 3456
> > 0: system.remote_gdb.listener: listening for remote gdb #0 on port
> > 7000
> > **** REAL SIMULATION ****
> > warn: Entering event queue @ 0. Starting simulation...
> > m5.debug: build/ALPHA_FS/mem/cache/base.hh:471: void
> > BaseCache::deassertMemSideBusRequest(BaseCache::RequestCause):
> > Assertion `false' failed.
> > Program aborted at cycle 12851847000
> > Aborted
> >
> > Can you help me find the reason?
> > Thanks
> > Gary
> >
> > _______________________________________________
> > m5-users mailing list
> > [email protected] <mailto:[email protected]>
> > http://m5sim.org/cgi-bin/mailman/listinfo/m5-users
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > m5-users mailing list
> > [email protected]
> > http://m5sim.org/cgi-bin/mailman/listinfo/m5-users
>
>
> _______________________________________________
> m5-users mailing list
> [email protected]
> http://m5sim.org/cgi-bin/mailman/listinfo/m5-users
>
_______________________________________________
m5-users mailing list
[email protected]
http://m5sim.org/cgi-bin/mailman/listinfo/m5-users