zoukankan      html  css  js  c++  java
  • Rocket

    https://mp.weixin.qq.com/s/6McbqOKM4fu4J5vdpZvxKw

     
    简单介绍异步队列(AsyncQueue)的实现。
     
    0. 异步队列
     
    异步队列的两端分属不同的时钟域,拥有各自的复位逻辑。
    异步队列用于存值的一端为上游端(source),用于取值的一端为下游端(sink)。
     
    1. AsyncQueueParams
     
    异步队列的参数,包含如下几项:
    a. depth
     
    队列深度,表示队列可以存储几个元素;
     
    b. sync
     
    表示流水线的级数。
     
    c. safe
     
    使用valid来标识ridx和widx是否合法;是否要把一端的reset同步到另一端。
     
    d. narrow
     
    标识数据同步通道的宽度。如果数据同步通道为窄,则每次只同步一个数据。否则,为所有数据提供同步通道。
     
    2. AsyncBundleSafety
     
     
    safe相关要在队列两端同步的信号(这里略去不做详细介绍):
     
    个人认为更名为AsyncSafetyBundle更好,因为本质上是一个Bundle,Safety是修饰词,前置为宜。如白马和马白不是同一个意思。
     
    3. AsyncBundle
     
    要在队列两端同步的数据,包括:
    a. 待读取元素的索引号:ridx;
    b. 待写入元素的索引号:widx;
    c. 数据:mem;
    d. 数据索引号:index;
    e. safe相关的bundle(valid和reset);
     
    c和d重构如下:
    如果数据同步通道为窄通道,则mem这个Vec只包含1个元素,而index则是当前数据通道中元素的索引号。
    如果数据同步通道为宽通道,则mem这个Vec包含depth个元素,每一个元素都有自己的同步通道,就不需要index来指示元素索引号了,所以此时index为None。
     
    PS. option是一个隐式方法,定义如下:
     
    4. GrayCounter
     
    格雷码计数器。
     
    5. AsyncValidSync
     
    用于支持AsyncBundleSafety,这里不做具体介绍。
     
    6. AsyncQueueSource
     
    异步队列的上游端。上游端写数据。
     
    1) io
     
    a. enq:输入;
    b. async:用于数据同步的端口;
     
    2) 实现
     
    a. enq
     
    当对方valid,而我方ready,亦即io.enq.fire()时,把io.enq.bits存入mem中。
     
    注意,此index为新定义的index,非io.async.index:
     
    b. mem
     
    也要注意区分mem和io.async.mem。
     
    mem的定义为:
    存储的元素个数为队列深度params.depth。
     
    根据数据同步通道的宽窄,来决定同步一个,还是全部同步:
     
    c. widx
     
    source端为写端,widx是一个格雷码计数器,会被同步到sink端:
     
    d. ridx
     
    读取的元素索引号。sink端为读端。ridx从sink端同步而来。
     
    e. ready
     
    队列不满,则可以ready。
    可以看到io.enq.ready也取决于sink_ready。在不考虑safe的情况下,sink_ready一直为true。
     
    7. AsyncQueueSink
     
    与AsyncQueueSource对应,这里略去。
     
    8. FromAsyncBundle
     
    x是一个AsyncBundle,构造一个sink端与之连接。从AsyncBundle到DecoupledIO,即From AsyncBundle to DecoupledIO。
     
    9. ToAsyncBundle
     
    x是一个ReadyValidIO,构造一个source端与之连接。从ReadyValidIO到AsyncBundle,即To AsyncBundle from ReadyValidIO。
     
    10. AsyncQueue
     
    创建异步队列的两端,并把它们相连。
     
    CrossingIO定义如下:
  • 相关阅读:
    CAS简介
    Volatile的3大特性
    dsf对矩阵进行搜索
    JVM
    REST风格
    自定义Starters(自动配置Bean)
    反射和注解的原理
    mybatis的注解开发
    Java的多线程安全
    mybatis(3)
  • 原文地址:https://www.cnblogs.com/wjcdx/p/10909757.html
Copyright © 2011-2022 走看看