https://mp.weixin.qq.com/s/QsL1Bfb0JsOaxWW_muhg_Q

 
简单介绍CacheCork的实现。
 
 
1. 基本介绍
 
Cache的塞子,下游没有Cache节点。把上游节点的Acquire/Release消息转换为Get/Put消息实现。
 
各个消息处理方法整理如下表:
 
2. 类参数
 
包含如下参数:
a. unsafe:是否安全:至多能安全的支持一个Cache Client;
b. sinkIds:支持的下游ID数目,用于Grant消息中填充sink域;
 
3. diplomacy node
 
介绍TLCacheCork节点如何向上下游传递参数:
 
1) clientFn:向下游传递上游节点的参数
 
其中:
a. supportsProbe = TransferSizes.none:告诉下游节点他的上游节点即CacheCork节点不接收Probe消息;
b. c.sourceId.start * 2:乘以2是因为在低位增加了1位作为transform编码使用;
 
2) managerFn:向上游传递下游节点的参数
 
只处理类型为UNCACHED的manager:
其中:
a. 告诉上游节点CacheCork节点支持的sinkIds;
b. AcquireB是要获取读权限,所以转变为m.supportsGet;
c. AcquireT是要获取写权限,所以转变为m.supportsPutFull;
d. 因为只有一个cache client,所以可以alwaysGrantT;
 
4. lazy module
 
1) 输入边和输出边成对出现
 
 
2) 如果没有一个manager支持Acquire操作,则直接相连
 
这里使用的是edgeIn.manager,也就是输入边的manager,即输入边的下游,也就是CacheCork节点。edgeIn.manager是从edgeOut.manager参数转换而来的(使用managerFn)。
 
edgeIn.manager都不支持AcquireB,可以反推得知edgeOut.manager也都不支持AcquireB。
 
3) 需要CacheCork做中转:edgeIn.manager.anySupportAcquireB
 
A. 取出上游节点
 
 
B. 取出可以缓存数据的节点
 
 
C. 限制条件
 
a. 只有一个上游节点,如果多于一个,则不能有cache节点;
b. 上游cache节点最多只能有一个,否则不安全;
c. 下游节点不能支持缓存,否则不安全;CacheCork节点居中阻挡下游cache节点和上游cache节点之间的数据同步,无法保证缓存一致性;
d. 下游节点的区域类型必须为UNCACHED/UNCACHEABLE/PUT_EFFECTS/GET_EFFECTS中的一个;
 
考虑安全的使用方式(unsafe = false),限制条件a/b要求上游的cache节点最多只有一个。这是因为CacheCork节点不做Probe的动作,而是alwaysGrantT。所以如果有多个Cache节点的话,会导致缓存一致性问题。
 
关于d,新版代码中有注释:
 
D. 要组装的消息
 
a. 把in.a组装成a_a,再通过out.a发出;
b. 把out.d组装成a_d,再通过in.d发出;
 
E. isPut:是否Put消息
 
 
F. toD:是否可以立即回复的消息
 
 
G. in.a.ready
 
根据消息是可以立即回复,决定要使用的组装消息:
 
H. 组装发往out.d的消息
 
其中:
a. 编码位编在第0位;
b. 因为toD中包含了AcquireBlock.BtoT和AcquirePerm,所以这里的条件实际上只包括AcquireBlock.{NtoB,NtoT}两个;
c. 把AcquireBlock.{NtoB,NtoT}转换为Get消息,编码值为1;相对比,正常的Get消息编码值为0;
d. 除去AcquireBlock.{NtoB,NtoT}的情况,如果是Put消息,编码值为1,其他情况下为0:
 
I. 组装要立即回复的消息
 
a. 组装从channel a来的AcquireBlock.BtoT和AcquirePerm消息:
 
b. 组装从channel c来的Release消息:
 
J. 转换从channel c来的ReleaseData消息
 
 
K. 处理channel B的消息
 
我们不会向in.b发请求消息,所以不用处理in.b。我们不支持Probe消息,所以不接收out.b的消息:
 
L. Grant消息需要添加sink域
 
a. 创建一个sink id pool:
 
 
b. 需要回复Grant消息是alloc一个id:
 
c. 从channel e受到GrantAck时,释放对应的sink id:
 
M. 未转换的out.d消息:直接移除编码位即可:
 
 
N. 记录访问的地址是否可写
 
重构一下,把w扩展为writable,这样比较好理解。
 
a. 创建一个寄存器组记录信息
 
 
b. 判断channel a访问的地址是否可写:
 
 
c. 当channel a请求输入时,记录是否可写的信息:
 
 
d. 从记录的信息数组中,获取返回的响应消息针对的地址是否可写:
 
 
e. 判断操作是否可以在同一个时钟周期内返回:
 
 
sourceWritableVec是一个寄存器组,其中的值每个时钟周期只刷新一次。在同一个时钟周期内,新存入的aWritableOk还没有来得及写入,不能使用dWritableOk这个从寄存器中获取的值,而只能直接使用aWritableOk。
 
f. 获取一个一直可以用的可写信息:
 
 
O. 转换AcquireBlock.{NtoB,NtoT}的响应消息:
 
 
P. 转换ReleaseData的响应消息:
 
 
Q. 把组装的消息分别发往out.a/in.d:
 
其中:
a. 第二个是in_d,不是in.d,即所有的组装消息先发往in_d,in_d则直接连到in.d上;
b. c_d/a_d先输出到Queue中,应该是为了增加吞吐量;
 
R. 不发起使用channel b/c/e的请求:
 
 
 
5. 整理组装的消息
 
1) 请求消息
 
A. a_a
 
包含两种消息:
a. AcquireBlock.{NtoB,NtoT}转换之后的Get消息;
b. 其他非即时回复消息:
 
B. c_a:ReleaseData消息转换之后的Put消息;
 
2) 回复消息
 
A. in_d:所有组装消息先输入in_d,而后输入in.d;
 
B. a_d:即时回复AcquireBlock.BtoT和AcquirePerm的Grant消息;
 
C. c_d:即时回复Release消息的ReleaseAck消息;
 
D. d_d:其他回复消息:
 

Rocket - tilelink - CacheCork的更多相关文章

  1. Rocket - tilelink - RegisterRouter

    https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA   简单介绍RegisterRouter的实现.   ​​   1. 基本介绍   实现挂在Tile ...

  2. Rocket - tilelink - Nodes

    https://mp.weixin.qq.com/s/KJ8pVH76rdxPOZ1vE3QlKA   简单介绍tilelink对Diplomacy Nodes的实现.   ​​   1. TLImp ...

  3. Rocket - tilelink - AsyncCrossing

    https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg   介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyMo ...

  4. Rocket - tilelink - mask

    https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg   讨论tilelink中使用MaskGen生成mask的用法.   1. tilelink中的ma ...

  5. Rocket - tilelink - Parameters

    https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ   简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析).   ​​   ...

  6. Rocket - tilelink - Bundles

    https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg   简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...

  7. Rocket - tilelink - TLBusWrapper.to

    https://mp.weixin.qq.com/s/jSnhBzU5_ayQCg5fWAcx-g 简单介绍TLBusWrapper.to()的实现.主要介绍确定this{...}对应代码的过程. 1 ...

  8. Rocket - tilelink - BusWrapper

    https://mp.weixin.qq.com/s/03BvgTNQtD75Guco6gUGQg   简单介绍BusWrapper的实现.   1. HasTLBusParams   定义SoC的挂 ...

  9. Rocket - tilelink - Xbar

    https://mp.weixin.qq.com/s/UXFHYEQaYotWNEhshro68Q   简单介绍Xbar的实现.   ​​   1. 基本介绍   用于为Xbar的输入和输出连接生成内 ...

随机推荐

  1. B. Working out 四角dp

    https://codeforces.com/problemset/problem/429/B 这个题目之前写过,不过好像..忘记了,今天又没有写出来,应该之前没有想明白... 这个应该算一个四角dp ...

  2. 教你配置windows上的windbg,linux上的lldb,打入clr内部这一篇就够了

    一:背景 1. 讲故事 前几天公众号里有位兄弟看了几篇文章之后,也准备用windbg试试看,结果这一配就花了好几天,(づ╥﹏╥)づ,我想也有很多跃跃欲试的朋友在配置的时候肯定会遇到这样和那样的问题,所 ...

  3. crontab自动启动小任务例子(每一分钟将当前日期打入一个文件)

      crontab -l #查看当前定时任务列表 显示没有,那么我们来安装一下(必须在root用户下) – yum install vixie-cron  – yum install crontabs ...

  4. Openwrt:添加"自定义软件包.ipk"

    我们已经尝试做的一件事情,是让移植软件到OpenWrt的操作变得非常容易.如果打开OpenWrt里的一个软件包的目录(OpenWrt/Package/* 或 OpenWrt/feeds/package ...

  5. [uva_la7146 Defeat the Enemy(2014 shanghai onsite)]贪心

    题意:我方n个军队和敌方m个军队进行一对一的对战,每个军队都有一个攻击力和防御力,只要攻击力不小于对方就可以将对方摧毁.问在能完全摧毁敌方的基础上最多能有多少军队不被摧毁. 思路:按防御力从大到小考虑 ...

  6. CTR学习笔记&代码实现5-深度ctr模型 DeepCrossing -> DCN

    之前总结了PNN,NFM,AFM这类两两向量乘积的方式,这一节我们换新的思路来看特征交互.DeepCrossing是最早在CTR模型中使用ResNet的前辈,DCN在ResNet上进一步创新,为高阶特 ...

  7. day_02~day_09的Python语法基础

    Python基础学习 day_02 使用方法修改字符串的大小写 将字符串首字母变成大写 >>> name = "ada lovelace" >>> ...

  8. 力扣题解-LCP 06. 拿硬币

    题目描述 桌上有 n 堆力扣币,每堆的数量保存在数组 coins 中.我们每次可以选择任意一堆,拿走其中的一枚或者两枚,求拿完所有力扣币的最少次数. 示例 1: 输入:[4,2,1] 输出:4 解释: ...

  9. orcle增删改操作及alter修改表字段操作

    orcle增删改操作:操作前确保当前用户有增删改的权限. --创建表 create table itcast( pid ), pname ) ); drop table itcast; --复制表 c ...

  10. Vue+Vuex 实现自动登录功能

    刚刚实现了Vue+Vuex的自动登录功能,在实现的时候遇到了一些问题,这里记录一下: 因为这个还不够完善,在写完下列代码后,又进行了补充,可以从https://www.cnblogs.com/xiao ...