void evict() { /* We are being evicted. Print our stats, update waste maps and clear. */ if(WANT_RAW_OUTPUT) { cout << bytesUsed->count() << "\t" << timesReusedBeforeEvicted << "\t" << accessSite << "[" << varInfo << "]\t" << "0x" << hex << address << dec << endl; } if(timesReusedBeforeEvicted == 0) { zeroReuseMap.insert(pair<string, ZeroReuseRecord> (accessSite, ZeroReuseRecord(varInfo, address))); } if((float)(bytesUsed->count()) / (float)lineSize < LOW_UTIL_THRESHOLD) { lowUtilMap.insert(pair<string, LowUtilRecord> (accessSite, LowUtilRecord(varInfo, address, bytesUsed->count()))); } address = 0; tag = 0; accessSite = ""; varInfo = ""; timesReusedBeforeEvicted = 0; bytesUsed->reset(); }
/** Inserts a value to the collection. Returns true if the collection did not already contain the specified element. */ bool insert(int val) { int count = map.count(val); map.insert(make_pair(val, elements.size())); elements.push_back(val); return !count; }
inline void insert_hash(hash_t key,hashtgt &val){ #if PERFORMANCE_STATISTICS ++totalh; #endif for(auto it=hashes.find(key);it!=hashes.end();++it){ if(memcmp(val.digest,it->second.digest,sizeof(val.digest))==0){ #if PERFORMANCE_STATISTICS ++conflict; #endif //already have the same one inserted! return; } } hashes.insert(make_pair(key,val)); }
/** Removes a value from the collection. Returns true if the collection contained the specified element. */ bool remove(int val) { auto inSet = map.find(val); if(inSet != map.end()){ int pos = map.find(val)->second; map.erase (map.find(val), ++map.find(val)); int last = elements.back(); elements.pop_back(); elements[pos] = last; for(auto findPos = map.find(last); findPos != map.end(); ++findPos){ if(findPos->second == elements.size()){ map.erase( findPos, std::next(findPos)); map.insert( make_pair(last, pos)); break; } } } return inSet != map.end(); }
bool cache_access2 (int index, int tag, Data d) { bool hit = 1; pair<int, Data> mypair(index, d); int count = L2.count(index); // Miss if (count <= 0) { L2.insert(mypair); miss_count2++; hit = 0; valid_cacheline2++; } else if (count == 1) { auto range = L2.equal_range(index); auto it = range.first; Data d1 = it->second; // Hit if (d1.tag == tag) { it->second.lru = 0; //cout << "Hit" << endl; hit_count2++; } // Miss else { it->second.lru = 1; //cout << "Miss" << endl; miss_count2++; hit = 0; L2.insert(mypair); valid_cacheline2++; } } else if (count == 2) { auto range = L2.equal_range(index); auto it = range.first; auto it_1 = range.first; auto it_2 = ++it; Data d1 = it_1->second; Data d2 = it_2->second; // Hit if (d1.tag == tag) { it_1->second.lru = 0; it_2->second.lru = 1; //cout << "Hit" << endl; hit_count2++; } else if (d2.tag == tag) { it_1->second.lru = 1; it_2->second.lru = 0; //cout << "Hit" << endl; hit_count2++; } else if (d1.lru == 1) { it_2->second.lru = 1; //cout << "Miss" << endl; miss_count2++; evict_count2++; hit = 0; L2.erase(it_1); L2.insert(mypair); } else { it_1->second.lru = 1; //cout << "Miss" << endl; miss_count2++; evict_count2++; hit = 0; L2.erase(it_2); L2.insert(mypair); } } else { cout << "Containing more than 2 cachelines" <<endl; exit(1); } return hit; }