https://mp.weixin.qq.com/s/zCP7wPuxgQ-r94Tr6BV5iw

 
简单介绍Replacement的实现。
 
 
1. 基本介绍
 
用于实现Cache替换相关的功能。
From: Cache Replacement Policies, Prof. Mikko H. Lipasti, University of Wisconsin-Madison, ECE/CS 752 Spring 2016
 
2. ReplacementPolicy
 
代表替换策略的抽象类。
包含如下方法:
a. way: 返回要替换的cache行号;
b. miss:未命中时执行的方法;
c. hit:命中时执行的方法;
 
3. RandomReplacement
 
随机替换策略,实现ReplacementPolicy:
a. way: 来自于LFSR生成的随机值;
b. miss:未命中则需要替换:replace := Bool(true);
c. hit:命中时不执行任何动作;
 
ways表示Cache的行数,Random(ways, lfsr)把lfsr随机到[0, ways-1]的范围内。
 
4. SeqReplacementPolicy
 
包含多组Cache的替换策略。
a. access: 访问某一个组(set)的方法;
b. update: 根据valid和是否命中(hit),更新Cache组set中的第way个行;
c. way:要替换的行;
 
5. SeqRandom
 
基于组的随机替换策略。
a. logic: 实例化一个RandomReplacement对象;
b. access:访问组set:没有动作;
c. update:如果输入合法,并且没有命中,则执行logic.miss方法;
d. way:返回要替换的行;
 
6. PseudoLRU
 
实现一个简单的LRU(Least Recently Used,最近最少使用)策略:
 
1) n
 
n表示cache的行数;
 
2) state_reg
 
表示cache的状态;
表示cache所有行的状态;
 
LRU要记录的状态信息是最近的使用情况。
也就是说,一个n-1位的state_reg要记录n行cache最近的使用情况。
 
类似于下图:
state_reg每一个比特值表示是否在最近被访问。
 
3) access(way)
 
访问第way个cache行。
要执行的动作是更新state_reg中第way个cache行的使用信息;
 
4) replace = get_replace_way
 
获取要被替换的cache行,即最近最少使用的行。
 
5) get_next_state
 
a. state:记录LRU最近访问信息的state变量;
b. way:此次被访问的cache行;
c. 2^width(way)表示way可以表示的cache行数;理想情况下,width(way)=log2Up(n);
d. way(i)从way中取出第i个比特;
e. i从log2Up(n)-1到0,表示从way的高位到低位逐个取出每一位;
f. !bit需要与get_replace_way结合起来一起理解:把访问的way的第i比特取反写入next_state,那么这个比特可以作为要替换的行的行号中的相应比特使用;
g. idx:逐个把way中的比特合并到idx中;
 
通过一个实例来看一下这个过程:
a. 假设条件
其中:n = 8;i逐个去2, 1, 0;相应的bit为w2, w1, w0;
 
b. var next_state = (state << 1).asInstanceOf[UInt]
 
 
c. i = 2
 
d. i = 1
 
e. i = 0
 
 
f. 把w2, w1的值带入
 
 
g. 考虑w0的两个取值
 
可以看到:
根据w2的取值,把next_state的取值分成两个1/2部分;
根据w1的取值,又把每个1/2部分分成两个1/4部分;
根据w0的取值,又把每个1/4部分分成两个1/8的部分;
 
他们的意义在查找替换cache行时再讲。
 
6) get_replace_way
 
 
直接看5)中实例的情况。
a. 假设条件
 
 
b. in_bounds
 
用于判断idx是否在[0, n)范围内;
 
c. shifted_state
 
移位的作用在于方便各个变量的位对应。
 
d. i = 2
 
 
e. i = 1
 
 
f. i = 0
 
 
g. 考虑ss4, ss5, ss6, ss7的两种取值
 
 
可以看到这个值与get_replace_way中相反。
 
7) 实例的总结
 
当刚刚访问了way 0后,next_state(1) = 1,对应着get_replace_way中的shifted_state(1) = 1,如此返回的idx(2) = 1。
 
也就是说:
如果刚刚访问了way 0,那么当查找可以替换的cache行时,从第4/5/6/7中找。
 
进而:
如果在4/5/6/7中最近访问的是4,那么当查找可替换的cache行时,从第6/7行中找。
如果在6/7中最近访问的是6,那么当查找可替换的cache行时,idx = 7 = 0b111,即就会选择第7行。
 
7. SeqPLRU
 
实现一个包含多组cache的替换策略:
 
a. 每组一个记录LRU最近访问信息的state寄存器
 
b. 替换策略是PseudoLRU
 
 
c. access: 访问某一个组时,读取该组的LRU状态信息
 
 
d. update:更新cache状态
 
update_way:如果命中,则使用命中的行号;如果未命中,则需要替换一个cache行(行号为plru_way)。
更新LRU信息,并写入;
 
e. way:返回要替换的cache行号
 
 
8. 附录
 

Rocket - util - Replacement的更多相关文章

  1. Rocket - util - Annotations

    https://mp.weixin.qq.com/s/7C8ZmPpwAqFqyKjL9K40Fg   介绍util中定义的注解(Annotations).   ​​   1. Annotation ...

  2. Rocket - util - Timer

    https://mp.weixin.qq.com/s/Z4JJhZ_jL1lqF1nf_orq9A   简单介绍Timer的实现.   ​​   1. 基本功能   实现定时器的功能.   2. Ti ...

  3. Rocket - util - ReduceOthers

    https://mp.weixin.qq.com/s/gbR5fuDbE_nUFVxw-p4rsA   简单介绍ReduceOthers的实现.   ​​   1. 基本介绍   输入一组Bool元素 ...

  4. Rocket - util - Repeater

    https://mp.weixin.qq.com/s/xyEq3DgYuf2QuNjssv8pkA   简单介绍Repeater的实现.   ​​   1. 基本功能   A Repeater pas ...

  5. Rocket - util - PrefixSum

    https://mp.weixin.qq.com/s/G2vLP-ncoJzSOgxGGEJkfA   简单介绍PrefixSum的实现.   ​​   1. 基本介绍   ​​ 把一个序列从前向后逐 ...

  6. Rocket - util - MultiWidthFifo

    https://mp.weixin.qq.com/s/CUnrpyQN5LRBR5bxC5u86A   简单介绍MultiWidthFifo的实现.   ​​   1. 基本介绍   实现一个输入宽度 ...

  7. Rocket - util - MaskGen

    https://mp.weixin.qq.com/s/_aJqf1cFJDK5RVRBhxTWOw   介绍MaskGen的实现.   ​​   1. 基本介绍   给定总线宽度beatBytes,根 ...

  8. Rocket - util - Misc

    https://mp.weixin.qq.com/s/kf4FvAFye_bRdT49Yow7Hg   简单介绍Misc中各个辅助方法的用途和实现.   ​​   1. ParameterizedBu ...

  9. Rocket - util - LanePositionedQueue

    https://mp.weixin.qq.com/s/yO_9Ec3S5-AosRVLpsBgOg   简单介绍基于通道位置的队列(LanePositionedQueue)的实现.   ​​   1. ...

随机推荐

  1. GIL-Guilds(黑白灰染色)

    传送门门门门门咩咩咩咩咩咩咩咩咩咩咩咩 \(这题真是扯谈!!!\) \(灰色很高级是吧,但是题目没要你把颜色全部用上去啊!!!\) \(黑色或者白色只有一个条件,但灰色需要和所有三种颜色都相邻.这么难 ...

  2. Spring官网阅读(六)容器的扩展点(一)BeanFactoryPostProcessor

    之前的文章我们已经学习完了BeanDefinition的基本概念跟合并,其中多次提到了容器的扩展点,这篇文章我们就开始学习这方面的知识.这部分内容主要涉及官网中的1.8小结.按照官网介绍来说,容器的扩 ...

  3. ActiveMQ 持久订阅者,执行结果与初衷相违背,验证离线订阅者无效,问题解决

    导读 最新在接触ActiveMQ,里面有个持久订阅者模块,功能是怎么样也演示不出来效果.配置参数比较简单(配置没几个参数),消费者第一次运行时,需要指定ClientID(此时Broker已经记录离线订 ...

  4. Excel:公式转数值

    跨Workbook引用有些危险,有时要把公式转换为数值.修改频繁,有时也要把公式转换为数值. 方法一,选中区域,复制Ctrl+C,选择性粘贴Ctrl+Alt+V,数值V.方法二,选中区域,复制Ctrl ...

  5. CF#637 D. Nastya and Scoreboard DP

    D. Nastya and Scoreboard 题意 一块电子屏幕上有n个数字. 每个数字是通过这样7个线段显示的,现在你不小心打坏了k个线段,给出打坏之后的n个数字的显示方式,问之前的屏幕表示的最 ...

  6. SpringData表关系:多对多

    一.编写实体类配置关联关系: 1.多对多使用注解@ManyToMany配置:a. 在实体中添加一个集合属性 b.在属性上添加ManyToMany注解 c.@JoinTable 注解配置关联关系(nam ...

  7. mybatis分页助手分页

    一.编写dao及配置文件 (1)配置文件两种方式 第一种: <!--SqlSeesionFactoryBean对象--><bean id="sqlSessionFactor ...

  8. python实现简易词频统计-源码

    需求:给瓦尔登湖文章统计单词出现的频率 思路:首先读取文件并以空格分割得到列表,然后利用for循环遍历列表中的元素并把去掉列表元素中的符号,第三步去掉相同的元素,将列表转换为一个字典,最后按照键值对升 ...

  9. hdu2138 How many prime numbers 米勒测试

    hdu2138 How many prime numbers #include <bits/stdc++.h> using namespace std; typedef long long ...

  10. JavaScript中setInterval关闭问题

    这篇博客主要记录下学习中碰到的一些问题(以防忘记). JavaScript中,在setInterval中关闭该定时器,但是此次执行也会完成,用语言描述不太容易,直接看代码: var i=1; var ...