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);
      }
  }
}
示例#2
0
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);
    }
  }
}
示例#3
0
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;
  }
}