4.1 带旁路的读写队列与解耦的存控逻辑
为了缓存因访问冲突或同步失败而被阻塞的读/写访问,我们为每个DSP核分别设置了读/写队列,直接缓存各个DSP核Load/Store单元发出的访问请求。为了缩短访问延迟,我们为读/写队列设置了旁路逻辑。当没有访问冲突且核间同步握手成功时,读写请求不需进入读写队列,由旁路逻辑将请求直接发送给相应的存控逻辑。这一设计缩短了访问延迟,有效增强了FSDP的传输效率。下图3给出了带旁路的读写队列结构。为了加快地址译码速度,本文将地址译码逻辑和访问控制逻辑进行了解耦处理,将译码器置于旁路逻辑之前,缩短控制逻辑的关键路径,提高了FSDP的访问速度。
图3 带旁路的读写队列
4.2 双模式操作与交叉访问
本文为FSDP设计了“私有”和“共享”两种工作模式。
在私有模式下,任意DSP核DSP-i只能读写与其对应通道内的两个存储体SAi和SBi(i=1,2,3,4),不能访问其他的通道;在共享模式下,每个DSP核可以读取另外三个通道的数据,但不能向其中写入数据。任意DSP核必须通过其对应通道的两个存储体与其他DSP核交换共享数据。
可见,在私有模式下,所有的存储体都不存在访问竞争,访问速度快。在共享模式下,FSDP不存在多核写冲突的问题,简化了维护数据一致性的硬件开销,提高了核间共享数据的传输速度,有利于提高嵌入式应用的实时性。
在任务流水的计算模式下,DSP核间的共享数据相继构成“生产者-消费者”关系:前一个核的计算输出直接作为下一个核的计算输入。为了有效支持这种传输模式,我们在FSDP中采用了交叉访问的机制:
当“生产者”DSP-i向存储体SAi写入第一块共享数据之后,释放该存储体,转而向SBi写入第二块共享数据;
“消费者”DSP-j(j≠i)启动读访问,从SAi读出第一块共享数据;
当这一过程完成后,双方交叉,DSP-i释放存储体SBi,向SAi写入第三块共享数据,DSP-j则从SBi读出第二块共享数据,依此类推,直至传输完成。
因此,在写入第一块共享数据之后,读写操作就可以并行执行。当双方的计算负载均衡,速度匹配的时候,DSP核之间可以进行流水传输,同步等待延迟最小,传输效率达到最高。
4.3 释放一致性模型与基于信号灯的快速同步机制
在共享存储的释放一致性(RC)模型中,同步操作包括“获取”和“释放”两种操作,分别用于取得对共享存储单元的独占性访问权和解除这一访问权。参照基本的RC模型,本文为FSDP设计了一套简洁、高效的控制逻辑和同步机制。