void AlwaysPrefetch::prefetch(PAddr prefAddr, Time_t lat) { uint32_t paddr = prefAddr & defaultMask; if(!buff->readLine(paddr)) { // it is not in the buff penFetchSet::iterator it = pendingFetches.find(prefAddr); if(it == pendingFetches.end()) { CBMemRequest *r; r = CBMemRequest::create(lat, lowerLevel[0], MemRead, prefAddr, processAckCB::create(this, prefAddr)); r->markPrefetch(); LOG("NLAP: prefetch [0x%08lx]", (long unsigned int) prefAddr); predictions.inc(); pendingFetches.insert(prefAddr); } } }
void MarkovPrefetcher::prefetch(PAddr prefAddr, Time_t lat) { uint32_t paddr = prefAddr & defaultMask; if(!buff->readLine(paddr)) { // it is not in the buff penFetchSet::iterator it = pendingFetches.find(paddr); if(it == pendingFetches.end()) { CBMemRequest *r; r = CBMemRequest::create(lat, lowerLevel[0], MemRead, paddr, processAckCB::create(this, paddr)); if(lat != 0) { // if lat=0, the req might not exist anymore at this point r->markPrefetch(); } predictions.inc(); LOG("GHBP: prefetch [0x%08lx]", paddr); pendingFetches.insert(paddr); } } }
void StridePrefetcher::prefetch(pEntry *pe, Time_t lat) { uint bsize = buff->getLineSize(); PAddr prefAddr = pe->nextAddr(table); for(int i = 0; i < depth; i++) { if(!buff->readLine(prefAddr)) { // it is not in the buff penFetchSet::iterator it = pendingFetches.find(prefAddr); if(it == pendingFetches.end()) { CBMemRequest *r; r = CBMemRequest::create(lat, lowerLevel[0], MemRead, prefAddr, processAckCB::create(this, prefAddr)); if(lat != 0) { // if lat=0, the req might not exist anymore at this point r->markPrefetch(); } pendingFetches.insert(prefAddr); predictions.inc(); } } prefAddr += pe->stride; } }