首先,为每个存储体设置3个“信号灯”寄存器,分别对应除本通道之外的其他3个DSP核,作为同步/互斥操作的硬件锁。“信号灯”寄存器映射了全局共享的物理地址,通过公共配置总线与四个DSP核相连。每个“信号灯”具有“点亮”和“熄灭”两种状态,分别表示存储体内的共享数据“已写入”和“已读出”。DSP核通过同步指令改写“信号灯”寄存器的状态,实现核间的同步操作。具体的数据一致性协议为:

当“生产者”DSP-i向某个存储体写入共享数据后,将其“信号灯”置为“点亮”状态。若这批共享数据有2~3个“消费者”,则点亮相应的2~3个“信号灯”。在某个“信号灯”处于“熄灭”状态时,相应的DSP核对该存储体的读请求全部进入读队列等待。

当“消费者”DSP-j读出某个存储体的共享数据后,将该存储体与自己对应的“信号灯”置为“熄灭”状态。当某个存储体的所有3个“信号灯”都“熄灭”时,该存储体被释放,处于可写状态;否则,DSP核对该存储体的写请求全部进入写队列等待。

“点亮”和“熄灭”信号灯的顺序一致性由DSP核对公共配置总线的独占性访问来保证。

需要说明的是,DSP核不一定要将其对应的存储体写满才能点亮“信号灯”,一次同步操作所传输的数据量最小可以是一个字节,最大不超过单个存储体的容量。

由于FSDP的访存通路与同步操作通路(即配置总线)是相互分离的,因此可能出现同步操作指令通过配置总线先于访存指令提前执行的错误情况。本文通过软件延迟槽的方式解决这一问题:由编译器通过指令调度技术,在最后一条共享数据的读指令和“熄灯”指令之间插入1~2条无关指令或空操作(NOP),作为等待共享数据返回的延迟槽,确保最后一个读请求被处理之后再执行“熄灯”操作。具体所需的软件延迟槽数量取决于DSP流水线的设计。对于本文而言,如果DSP核在发出Load指令的第3拍没有接收到返回的数据,则暂停指令派发,因此只需要2个延迟槽。图4给出了两个DSP核i和j传递共享数据的实例。

(a)延迟槽与同步操作的程序实例

(b)存储体的内容变化与信号灯状态