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

基于AddressAdjuster介绍LazyModule的实现。

 
 
1. AddressAdjuster
 
​​
 
地址适配器,根据chip_id & mask对地址进行区分:
a. 与chip_id & mask相同的在本地(local)处理;
b. 不同的使用远端(remote)处理;
 
2. LazyModule的实现:lazy val module
 
1) AddressAdjuster是一个中间节点,他有一个上游节点(对应一个输入边),两个下游节点(对应两个输出边):
​​
 
2) 计算需要Local节点处理的地址:
​​
效果相当于:local_address = chip_id & mask
 
以channel A为例:
​​
根据地址是否应当由local处理:val a_local: Bool = local_address === (parent.a.bits.address & mask.U)
a. 设置parent.a.ready由谁输入;
b. 设置parent.a.valid输出到谁;
c. 把parent.a.bits输出到local.a.bits/remote.a.bits;
 
3) 错误处理
 
计算local能处理的地址范围:
​​
 
parent的地址是否包含在local中:
​​
 
地址没在范围内,或者执行不支持的操作,则为错误:
​​
 
对local节点channel A的地址进行适配:
​​
a. 如果没出错,则使用parent.a.bits.address;
b. 如果出错,则使用错误地址:errorSet.base.U;
 
错误的地址会把操作导向错误处理设备:errorDev。
 
4) 小结
 
这里有两层适配:
a. 根据parent.a.bits.address & mask是否与chip_id & mask相等,决定parent对接的是local还是remote;
b. 根据local是否能处理对接到他的地址,决定是否把地址适配成为错误处理地址;
 
3. Node的实现:val node
 
AddressAdjuster中的node,用于与其他节点相连接以组成拓扑结构,以及用于协商参数。
 
​​
 
1) clientFn & managerFn
 
clientFn为dFn,用于把参数向下游传递,managerFn为uFn,用于把参数向上游传递:
​​
 
​​
 
​​
 
clientFn和managerFn返回一个参数:val a = uFn(p),
然后复制成n个:Seq.fill(n)(a)
 
这里,clientFn的返回值被复制成2个,managerFn的返回值被复制成1个。
 
2) managerFn
 
managerFn是uFn,使用两个输出边的参数(UO),生成一个输入边的参数(UI):
​​
 
生成的参数如下:
​​
很遗憾的是,因为AddressAdjuster没有被使用,所以也无法得知这个新生成的参数(UI)如何使用。
 
从其实现上,可以得到如下信息:
a. endSinkId:AddressAdjuster的endSinkId是local和remote的endSinkId之和;
b. minLatency:AddressAdjuster的minLatency是local和remote中的较小值;
c. managers:这个下面单看;
 
从endSinkId和minLatency两个参数看,UI是对两个UO的综合。
 
3) managers
 
a. checkMask
 
​​
AddressAdjuster的mask中的所有比特位,都在local/remote的AddressSet的mask中。
也就是说AddressAdjuster的mask中的比特,是local/remote的所有AddressSet的mask中比特的共同子集。
 
b. 使用AddressAdjuster的mask的AddressSet
 
mask之外的地址集合:AddressSet(id, ~mask)
其中,id从ids中取值:
​​
 
c. local的地址集合是remote的子集
 
​​
 
d. AddressSet(0, ~mask)中的地址漏洞(holes)
 
​​
ra: remote中的地址漏洞;
la: la中的地址漏洞;
holes: ra中的地址集合减去la中的地址集合;
 
这些地址漏洞中的地址要转发(route)到local中去处理,所以la就不算是漏洞,需要从ra中减掉。
 
e. newLocal
 
​​
 
newLocal的地址集合是原地址集合与(0, ~mask)的交集。如果是errorDev,那么还要处理ra的地址漏洞。
 
f. newRemote
 
​​
newRemote的地址集合是原地址集合与(id, ~mask)的交集。
 
问题1:为什么这里没有减去local与(id, ~mask)的交集?
 
g. newLocal + newRemote
 
UI的managers如下:
​​
 
问题2:为什么UI参数的managers中的地址集合,都是原local/remote地址集合与mask之外地址集合的交集呢?
 
因为不知道这个参数如何使用,所以这两个问题就不得而知了。
 
4. 另外一个Node:val chip_id
 
这也是一个Node。
所以AddressAdjuster中包含两个节点(node, chip_id),都可以与其他节点相连接。
 
5. 附录
 
AddressAdjuster.scala:
 
略

Rocket - diplomacy - AddressAdjuster的更多相关文章

  1. Rocket - diplomacy - AddressAdjuster分析

    https://mp.weixin.qq.com/s/UYVSO3XFJmhe5bUD_XbMLg   先介绍如何使用AddressAdjuster,然后分析UI参数的生成及使用.   ​​   1. ...

  2. Rocket - diplomacy - LazyModule的组织方式

    https://mp.weixin.qq.com/s/vaDUekxkFkOJLmzg5jCngw 简单介绍LazyModule/LazyModuleImp的组织方式. 1. LazyModule L ...

  3. Rocket - diplomacy - LazyModule的实例化(补)

    https://mp.weixin.qq.com/s/rgCRorjPYyyD6i7moIzbZg   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  4. Rocket - diplomacy - LazyModule的实例化

    https://mp.weixin.qq.com/s/9PsBt4_4qHx4i6C5XtuiUw   介绍LazyModule和Node构造方法的执行过程,即实例化过程.     1. NullIn ...

  5. Rocket - diplomacy - LazyModule

    https://mp.weixin.qq.com/s/FBU8fE4u9-UK6mRGQOlvbQ   介绍LazyModule的实现.     ​​   1. children   LazyModu ...

  6. Rocket - diplomacy - ValName

    https://mp.weixin.qq.com/s/so-2x5KLfYF0IMCCqNThwQ   简单调试ValName实现:   1. 使用     ​​   Desugar之后如下: ​​ ...

  7. Rocket - diplomacy - NodeHandle相关类

    https://mp.weixin.qq.com/s/GWL41P1G1BXm2sTeLmckdA   介绍NodeHandle相关的类.     ​​   1. NoHandle   顶层类(tra ...

  8. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  9. Rocket - diplomacy - 模块结构信息

    https://mp.weixin.qq.com/s/cTRxXwWNEeb4-XX_t4bRcg   讨论模块结构信息的来源及使用方式.     ​​   1. diplomacy   diplom ...

随机推荐

  1. ACM入门问题:最大利益问题

    设最大的利益为maxv,最小值为minv 1.求最大利益的简单算法 ;j<=n-;j++) ;i<=j-;i++) maxv =(maxv与R[j]-R[i]中较大的一个) maxv=ma ...

  2. Spring官网阅读(七)容器的扩展点(二)FactoryBean

    在上篇文章中我们已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍.其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程 ...

  3. 基础JS遇到的一些题01

    1.两种数组去重方法 const unique = arr =>{ let mySet = new Set(arr); /!* let newArr =[]; for (let i = 0 ;i ...

  4. MySQL数据类型笔记

    引言 作为一个做Java后端的开发者,无论是在自己平时项目学习实战还是工作中的真实项目,都离不开和数据库打交道.而MySQL作为当今最流行的关系型数据库之一,也成为了我们必须掌握的一门技术.最近在工作 ...

  5. hive元数据报错?试了很多方法都没辙?也许你漏了这一步

    进入hiveCLI后,输入show databases; 显示 FAILED: SemanticException org.apache.hadoop.hive.ql.metadata.HiveExc ...

  6. JAVA知识总结(三):继承和访问修饰符

    今天乘着还有一些时间,把上次拖欠的面向对象编程三大特性中遗留的继承和多态给简单说明一下.这一部分还是非常重要的,需要仔细思考. 继承 继承:它是一种类与类之间的关系,通过使用已存在的类作为基础来建立新 ...

  7. Redis学习笔记(二) 链表

    链表提供了高效的节点重排能力,以及顺序性的节点访问方式,并且可以通过增删节点来灵活地调整链表的长度. redis中链表应用广泛,如list中就使用了链表. 每一个链表节点使用listNode结构标识( ...

  8. docker 垃圾回收机制

    docker垃圾回收机制 作者: 张首富 时间: 2019-04-10 个人博客: www.zhangshoufu.com QQ群: 895291458 说明 对于Docker来说,存在镜像/容器/存 ...

  9. 【题解】合唱队形——LIS坑爹的二分优化

     题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...

  10. 【C#】CsvHelper 使用手册

    目录 简介 模块 读取 读取所有记录 逐条读取 读取单个字段 写入 写入所有记录 逐条写入 逐字段写入 特性 Index Name NameIndex Ignore Optional Default ...