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 - RegisterRouter
https://mp.weixin.qq.com/s/DaJhf7hEoWsEi_AjwSrOfA 简单介绍RegisterRouter的实现. 1. 基本介绍 实现挂在Tile ...
- Rocket - tilelink - Nodes
https://mp.weixin.qq.com/s/KJ8pVH76rdxPOZ1vE3QlKA 简单介绍tilelink对Diplomacy Nodes的实现. 1. TLImp ...
- Rocket - tilelink - AsyncCrossing
https://mp.weixin.qq.com/s/v8plWCBD8vZkxykjJe4TCg 介绍AsyncCrossing的实现,主要介绍如何实现diplomacy Node和LazyMo ...
- Rocket - tilelink - mask
https://mp.weixin.qq.com/s/Gqv09RIgSSg5VKe-wb4aGg 讨论tilelink中使用MaskGen生成mask的用法. 1. tilelink中的ma ...
- Rocket - tilelink - Parameters
https://mp.weixin.qq.com/s/1I6DcONr0Mg7xiX8F1C7SQ 简单介绍TileLink相关的参数实现(具体问题暂时不展开,后续用到时再做分析). ...
- Rocket - tilelink - Bundles
https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg 简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...
- Rocket - tilelink - TLBusWrapper.to
https://mp.weixin.qq.com/s/jSnhBzU5_ayQCg5fWAcx-g 简单介绍TLBusWrapper.to()的实现.主要介绍确定this{...}对应代码的过程. 1 ...
- Rocket - tilelink - BusWrapper
https://mp.weixin.qq.com/s/03BvgTNQtD75Guco6gUGQg 简单介绍BusWrapper的实现. 1. HasTLBusParams 定义SoC的挂 ...
- Rocket - tilelink - Xbar
https://mp.weixin.qq.com/s/UXFHYEQaYotWNEhshro68Q 简单介绍Xbar的实现. 1. 基本介绍 用于为Xbar的输入和输出连接生成内 ...
随机推荐
- P1790 矩形分割(隐含的电风扇)
描述:https://www.luogu.com.cn/problem/P1790 有一个长为a,宽为b的矩形(1≤a≤6,2≤b≤6).可以把这个矩形看作是a*b个小方格. 我们现在接到了这样的一个 ...
- 网络流最小割 H - Internship I - Friendship
我觉得这两个最小割都还比较难. 第一个题目大意是给你一个网络,这个网络是由城市和中转站组成,终点是0,给你每一条边的流量, 问,从城市到终点最大流流完之后,是否可以增加一条路上的一条边的容量,使得最大 ...
- kafka学习 之 简介
文章目录 [Topics and Logs](http://kafka.apache.org/intro#intro_topics): Distribution: Producers: Consume ...
- 【基础】excel如何根据数据内容显示不同颜色。
需求: 店柜完成率排名相比上阶段升降,升显示绿色“↑“,降显示红色“↓”,持平显示黑色“-”. 步骤: 第一步 先计算两次排名的差值(本次排名-上次排名). 第二步 对差值列设置单元格格式,设置格式如 ...
- (2)通信中为什么要进行AMC?
AMC,Adaptive Modulation and Coding,自适应调制与编码. 通信信号的传输环境是变化不定的,信道环境时好时差.在这种情景下,我们不可能按照固定的MCS进行信号发送.假如信 ...
- [hdu1317]spfa
题意:给一个有向图,每个点有一个权值,从1个点出发,初始能量有100,每到达新的点,能量就会加上那个点的权值,当能量大于0时才能继续走,可以多次进入同一点.问能否到达目标点 思路:如果没正权环,则直接 ...
- ES6-10笔记(一)
大纲 (慕课的图先用着) scope-作用域 作用域是指程序源代码中定义变量的区域,规定了如何查找变量,也就是确定当前执行代码对变量的访问权限. JavaScript作用域共有两种主要的工作模型--词 ...
- 真香警告!扩展 swagger支持文档自动列举所有枚举值
承接上篇文章 <一站式解决使用枚举的各种痛点> 文章最后提到:在使用 swagger 来编写接口文档时,需要告诉前端枚举类型有哪些取值,每次增加取值之后,不仅要改代码,还要找到对应的取值在 ...
- python常识系列08-->logging模块基础入门
前言 努力从今天开始,成功从"零"开始. 一.logging模块是什么? 是Python内置的标准模块,主要用于输出运行日志 二.日志是什么? 日志是代码的必要组成部分 记录日志能 ...
- 11.3 Go 开发博客
11.2 Go 开发博客 1.1. MVC模式 MVC分层简化了分组开发.不同的开发人员可同时开发视图,控制器逻辑和业务逻辑. 耦合性低:视图层和业务逻辑层分离.相互独立,不受影响 重用性高:业务逻辑 ...