package archimulator.uncore.cache.replacement.helperThread; import archimulator.uncore.MemoryHierarchyAccess; import archimulator.uncore.cache.CacheAccess; import archimulator.uncore.cache.CacheLine; import archimulator.uncore.cache.EvictableCache; import archimulator.uncore.cache.replacement.LRUPolicy; import java.io.Serializable; import static archimulator.uncore.cache.partitioning.CachePartitioningHelper.getThreadIdentifier; /** * Helper thread aware least recently used (LRU) policy 3. * * @param <StateT> the state type of the parent evictable cache * @author Min Cai */ public class HelperThreadAwareLRUPolicy3<StateT extends Serializable> extends LRUPolicy<StateT> { /** * Create a helper thread aware least recently used (LRU) policy 3 for the specified evictable cache. * * @param cache the parent evictable cache */ public HelperThreadAwareLRUPolicy3(EvictableCache<StateT> cache) { super(cache); } @Override public CacheAccess<StateT> handleReplacement(MemoryHierarchyAccess access, int set, int tag) { for (int stackPosition = this.getCache().getAssociativity() - 1; stackPosition >= 0; stackPosition--) { int way = this.getWayInStackPosition(set, stackPosition); CacheLine<StateT> line = this.getCache().getLine(set, way); if (line.getAccess() != null && getThreadIdentifier(line.getAccess().getThread()) == getThreadIdentifier(access.getThread())) { return new CacheAccess<>(this.getCache(), access, set, way, tag); } } return new CacheAccess<>(this.getCache(), access, set, this.getLRU(set), tag); } @Override public void handlePromotionOnHit(MemoryHierarchyAccess access, int set, int way) { super.handlePromotionOnHit(access, set, way); } @Override public void handleInsertionOnMiss(MemoryHierarchyAccess access, int set, int way) { super.handleInsertionOnMiss(access, set, way); } }