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

 
简单介绍FIFOFixer的实现。
 
 
1. 基本介绍
 
按照一定的策略把某一部分manager的fifoId摊平转换为一个fifoId,并为这个fifoId实现同步功能。这样上游节点看到的fifoId就减少了,所需要实现的同步功能就少了,减轻了其负担。
 
2. TLFIFOFixer.Policy
 
用于筛选Manager的策略:
 
定义了如下三种:
 
3. fifoMap
 
用于根据策略重新映射各个manager的fifoId:
 
1) 按策略分成两组:
 
符合策略的叫flatManagers,不符合的叫keepManagers。
 
2) 取得两组manager的fifoId:
 
如果某fifoId在两个组中都有,那么把它当做符合策略的使用。
 
根据注释:
a. 所谓flat,就是摊平,所有的fifoId都变成0;
b. 所谓keep,就是保持,compacted的意思是压缩,即保持每一个都不一样,但是压缩成为连续的自然数;
 
3) 构建两组老fifoId到新fifoId的映射:
 
a. 摊平的那一组,所有fifoId映射后的值都是0;
b. 保持的那一组,所有fifoId映射为从1开始的连续的自然数值;
 
4) 把两组映射合在一起:
 
 
5) fixMap
 
为每一个manager分配的fifoId:
A. 符合策略的manager的新fifoId为0;
B. 不符合策略的manager有两种情况:
a. 若原fifoId = None,新fifoId=None;
b. 若原fifoId != None,新fifoId为按顺序压缩后的新fifoId;
 
6) splatMap
 
重新映射,把符合策略的fifoId压缩为从0开始的自然数:
a. 不符合策略的manager的新fifoId为None;
b. 原fifoId=None的manager,新fifoId不变,也是None;
c. 符合策略的manager的新fifoId为按顺序压缩后的从0开始的自然数;
 
7) 对比
 
 
4. diplomacy node
 
需要调整下游节点传过来的fifoId,进行fix,也就是使用fixMap生成的新fifoId:
 
5. lazy module
 
用于实现内部逻辑:
a. 因为符合策略的manager的fifoId被摊平了,所以需要为他们做同步功能;
b. 不符合策略的manager各自具有不同的fifoId,其同步由client实现;
 
1) 成对出现的输入边和输出边
 
 
2) 处理下游的managers的fifoId
 
 
3) 是否属于符合策略的fifo的请求:
 
其中:
a. edgeIn表明使用的是转换之后的fifoId,根据diplomacy node中的用法,即fixMap中的fifoId;
b. _.fifoId==Some(0)表明address所属的manager符合策略;
c. 因为上游client看到符合策略的manager的fifoId都为0,而与之对应的下游manager的fifoId不一定为0,所以需要我们为这些请求做同步处理;
d. _.fifoId!=Some(0)表明address所属的manager不符合策略;
 
4) 找出符合策略的manager:compacted
 
a. f==Some(0):表明对应的manager符合策略;
b. 不符合策略的manager对应的None被flatMap过滤掉,不会存在于compacted中;
c. 符合策略的manager中,原fifoId为None的,被fifoId=s还原为None;
d. 符合策略的manager中,原fifoId不为None的,被fifoId=s重新编排为从0开始的自然数;
e. edgeOut表明使用的是下游manager;
 
5) a_id
 
把摊平的fifoId再提起来:
根据请求访问的地址,把请求分配到不同的fifo;原来fifo相同的还分配到同一个fifo。
 
a_noDomain表示manager属于符合策略的manager中原fifoId为None的那一部分。
 
6) 记录某source的请求是否需要做同步:
 
响应消息到来时,就不再需要做同步了。
 
7) 是否需要挂住停止发送请求:
 
a. 不需要Fifo的client不作处理:c.requestFifo;
b. 该client是否包含当前source;
c. 该client下属所有的source中是否有请求排斥其他请求:flight.slice(c.sourceId.start, c.sourceId.end).reduce(_ || _)
 
该client若要求挂住,需满足如下条件:
a. 当前请求源自该client;
b. 请求的第一个beat;
c. 该client下属的source中已经存在发出但仍未响应的请求;
d. a_noDomain || id =/= a_id
 
这里分析一下d:
a. a_noDomain
 
若a_noDomain为真,则表明两个请求的fifoId至少有一个为0。请求的fifoId=0表明对应的下游manager的fifoId=None,意为接收到的请求不一定会被按顺序响应。
 
若只有一个请求的fifoId=0,那么这两个请求对应着两个下游manager,无法保证响应顺序;
若两个请求的fifoId=0,因为可能存在两个以上下游manager的fifoId为None。所以虽然两个请求的fifoId都为0,但无法保证针对的是同一个下游manager。即便是同一个下游manager,也无法保证顺序。
 
b. id =/= a_id
 
意为这一次请求的a_id与上一次记录的id不同。
同时发出两个相同fifoId的请求,由下游manager保证这两个请求的响应消息安装先后顺序返回;
同时发出两个不同fifoId的请求,其响应顺序则无从保证。
 
8) 是否存在client要求同步:
 
 
9) 根据是否需要同步连接输入边和输出边的channel a/d:
 
 
10) channel b/c/e不做处理:
 
 
6. a_notFIFO重定义
 
是否需要为请求做序列化:
 
可以看到这个名字有两个问题:
a. 词不达意;
b. 名称中含有反转,理解时需要拐一个弯;
 
可以看到,后面使用时也多用其反转义项:
 
所以这里最好重新定义,反转一下意义:
 
修改后用处如下:
 
 

转载于:https://www.cnblogs.com/wjcdx/p/11343246.html

Rocket - tilelink - FIFOFixer相关推荐

  1. Rocket - tilelink - Delayer

    https://mp.weixin.qq.com/s/pc8f_DOJ7w8k8BeM9gPzVw   简单介绍Delayer的实现.   1. 基本介绍   以一定的概率延迟消息的传递.   类参数 ...

  2. Rocket - tilelink - Atomics

    https://mp.weixin.qq.com/s/TSwKL_qm-b-0e8x7r--hhg   简单介绍Atomics中数学运算.逻辑运算的实现.   ​​   1. io   Atomics ...

  3. 片上总线协议学习(1)——SiFive的TileLink与ARM系列总线的概述与对比

    link 片上总线协议学习(1)--SiFive的TileLink与ARM系列总线的概述与对比 finally 27 人赞同了该文章 一.背景介绍 随着超大规模集成电路的迅速发展,半导体工业进入深亚微 ...

  4. chisel(Rocket Chip)中如何参数化芯片系统

    2021.9.5 有些地方添加了一点自己的理解!!! 0 绪论 前面已经介绍了chisel的初级和高级参数化. 如何把这些东西有效的在系统中组织起来呢?如何在系统中快捷的使用他们?这篇文章主要解决这个 ...

  5. canal+mysql+rocket

    版本 canal.deployer-1.1.5 canal.admin-1.1.5 rocketmq-all-4.9.3-bin-release rocketmq-deshboard-master m ...

  6. Rocket - diplomacy - AddressAdjuster

    https://mp.weixin.qq.com/s/X0s5CWN84GEiwpNR7tiRgA 基于AddressAdjuster介绍LazyModule的实现.   参考链接:https://g ...

  7. 基于 RT-Thread智能车控制算法开发-河南科技大学ROCKET

    学校:河南科技大学 队伍名称: ROCKET 参赛队员:王思杰.王磊 胡彧奇.程钟鑫 带队教师:王新勇.付江涛 §01 引言   在第 16届全国大学生智能汽车竞赛中,我们选择了双车接力组这一比赛项目 ...

  8. 64位开源处理器Rocket该人士介绍

    最近大概读一点UCB发布时间Rocket处理器的源代码,的每个文件的源代码的功能有一定的一般理解,Mark一点点. Rocket是一家64bit标量处理器,5第一阶段管道,用途risc-v指令集.综合 ...

  9. 使用宝塔面板安装Rocket.Chat多功能团队聊天室

    安装 官方文档:https://rocket.chat/docs/ 环境要求:NodeJS 8.11.4.Mongodb 4.0.9.Nginx(非必需). 提示:由于官方建议的最低内存1G,所以51 ...

最新文章

  1. 论文解读 | 微信看一看实时Look-alike推荐算法
  2. js 点击最后一个 和倒数第二个_期货及期权品种的最后交易日,您都了解吗?...
  3. 深入解析Java AtomicInteger 原子类型
  4. 使用HTML完成简历
  5. PHP实例——获取文件的绝对路径
  6. 583. 两个字符串的删除操作
  7. T60 改LED 高压板连线方式。
  8. win10笔记本已连接充电器却不显示连接怎么解决?
  9. python_内置字符串
  10. Centos7 firewall防火墙常用配置
  11. php mysql简单留言本_超级简单的php+mysql留言本源码
  12. IDEA中使用JUnit4(单元测试框架)超详细!
  13. Thompson sampling
  14. 基于android手机实时监控ipcam视频之三:H.264的RTP打包解析
  15. inventor软件绘制百叶窗方法_Inventor教程之工具面板上的编辑功能
  16. 分享一种高效伪随机数生成算法
  17. 学习Cocos的第二天-序列帧动画
  18. Java面试系列——数据库(01)数据库的作用、分类、SQL语言、运算符
  19. 装X与务实并存!iPad越狱必装插件汇总
  20. Moveit配置方法

热门文章

  1. windows下手把手教你捕获数据包
  2. 谨慎Asp.net中static变量的用法
  3. VS-code中的Postman替代品
  4. kernel_mktime() 详解 —— Linux-0.11 学习笔记(四)
  5. 为自增(++)自减(--)运算符正名
  6. OpenGL高斯模糊
  7. 外中断---汇编学习笔记
  8. SpringBoot应用日志通过logstash远程上传到ES
  9. C语言再学习 -- C 预处理器
  10. 带你全面了解比特黄金(bitcoin gold)分叉