NoC组件之Router微架构解析(八)虚通道分配的延迟优化
Chapter 8: High-Speed Allocators for VC-Based Routers
(本文版权归作者所有,任何形式的转载都请注明出处)
本章在第 7 章的基础上,进一步优化电路结构,追求更高的主频。
8.1 限制自由度,降低 VA 的复杂度
如 Fig 8.1 所示,若限制 flit 包传递只能在特定的 VN(Virtual Network)中传输,可以将 VA 拆分成多个小规模的电路,分别负责 NV/k 段的 VC 分配,其中 k 为 VN 数量。若 flit 包传递过程中不允许改变 VC,那么整个 VA1 逻辑会消失。
8.2 预先计算 VA1(Lookahead VA1)
如 Fig 8.2 所示,可以将 VA1 提前到上一 hop,即 LVA1,提前计算出下一 hop 的 outVC,并随 flit 传递。此时,LVA1 不在关键路径上,可以和 VA2 或者 SA 并行计算。但是由于不清楚下一 hop 输出 VC 是否可用,导致携带的 outVC 信息无法更改——在多个 inVC 竞争一个 outVC 时,只能排队等待。
当然,也可以将 LVA1 提前到写入 RxBuffer 前计算,便于获得outVCAvailable信息。但是,这种方式的 LVA1 仍在关键路径上,需要考虑到达 RxBuffer 之前的路径是否满足时序要求。
总之,此方法是以「扩充 flit 域段」和「可能导致吞吐下降」为代价,换取「主频提升」。
8.3 去掉 VA2
VA2 的作用是匹配 inVC 与 outVC,可以通过将 outVC 分配给 SA 胜出者,以消除 VA2。以下给出 3 种电路结构:
- VA1 与 SA 串行执行:
- VA1:筛选每个 inVC 输入的请求,每个 inVC 选择一个空闲且有信用的 outVC。
- SA1:每个 inPort 仲裁出来自唯一一个 inVC 的请求。
- SA2:每个 outPort 仲裁出一个 inPort 授权返回 Granted。
- VA1 与 SA 并行执行:因为进入 SA 只需要知道请求的 outPort 内存在可用的 outVC 即可,不需要知道具体是哪一个 outVC,所以 SA 没必要等待 VA1 执行结果。
- LVA1:提前已知唯一请求的 outVC,若该 outVC 空闲且信用足够,即可进入 SA;同时计算下一 hop 的 VA1。
8.4 投机执行 SA(Speculative SA)
不管 VA 是否成功分配,投机地执行 SA,可以切断 VA 与 SA 的依赖关系。此时存在以下 4 种情况:
- VA 仲裁失败,SA 仲裁失败:下一 Cycle 重试。
- VA 仲裁获胜,SA 仲裁失败:不投机,存在竞争,保留 VA 仲裁结果,下一 Cycle 重试 SA。
- VA 仲裁失败,SA 仲裁成功:投机失败,代价是本次轮空。
- VA 仲裁成功,SA 仲裁成功:投机成功,在流量较小的场景下,投机成功概率较高。
为了降低投机失败的概率,如 Fig 8.4 所示,可以做两套 SA 逻辑:一个只接收投机请求(未分配 VC 的 Head);另一个只接收非投机请求(已经分配过 VC 的 Head 或 Body/Tail)。
给非投机 SA 更高优先级——当存在一对相同 Input-Output 配对的 SA 仲裁成功时,屏蔽投机结果,以保证获胜 flit 总能通过。
如何保证非投机 SA 输出屏蔽掉投机 SA 输出?利用一个状态矩阵free(i, j):若free(i, j) = 1,表示非投机 SA 未输出Input[i]和Output[j]的 Granted。利用free(i, j)矩阵作为掩码,屏蔽掉非投机 SA 结果后,再输入投机 SA。
当然,可以采用更悲观的投机策略——不需要得到非投机 SA 的结果再实行投机 SA,而是直接用非投机 SA 的输入作为掩码:无论非投机是否仲裁获胜,该Input[i]-Output[j]配对一定不再执行非投机 SA。当流量较小时,后者执行非投机时由于竞争少,获胜概率较高;若流量较大,非投机更容易失败,会导致投机 SA 过度被屏蔽。
8.5 Switch 输入端口扩展
上述所有的结构基于 Switch 输入侧每个 Cycle 只允许来自同一 inPort 的 1 个 VC 通过。如 Fig 8.6 所示,可以扩展 Switch 的输入 N 为m × N,使得每 Cycle 同一 inPort 可以输出 m 个 flit。
若不允许跳转 VC,则不需要 VA,那么每个 VC 可以单独做 SA 仲裁,如 Fig 8.7 所示。
