2.9 BSW DPMap DFG subgraphs
论文中,CU(Compute Unit)采用 2 级 ALU reduction tree,而 DPMap 负责把 BSW 的数据流图(DFG)划分成能映射到这棵 2 级树上的子图。下面我分三步帮你理解:先看 2 级 ALU 树长什么样、有什么限制;再看 BSW 单元格的 DFG 大概是什么;最后看 DPMap 如何一步步把 DFG 切成符合 CU 结构的子图。
1. 2 级 ALU reduction tree 的结构与限制
论文 Figure 7(d) 展示了 2 级 ALU 树的结构:
第一级: ALU1 ALU2
\ /
第二级: ALU3
|
output
- 第一级有 2 个 ALU:每个 ALU 可以接收多个输入(通常是 4 输入),执行加法、减法、取最大值、最小值、比较等操作。
- 第二级有 1 个 ALU:它接收第一级两个 ALU 的输出,再做一次归约(比如取最大值或相加)。
- 乘法器独立:因为乘法延迟长,不放在 ALU 树里,单独作为一个单元。
所以,一个 CU 在一个周期内最多能完成:
- 两个第一级操作;
- 一个第二级归约操作;
- 或者一个独立的乘法。
DPMap 的目标就是:把 BSW 的目标函数 DFG 切成若干个子图,每个子图恰好能塞进这样一棵 2 级 ALU 树。
2. BSW 单元格的目标函数 DFG
BSW 在计算一个单元格 ( (i,j) ) 时,通常要算三个值:( H(i,j) )、( E(i,j) )、( F(i,j) )。它们互相依赖,但可以表示成一个 DFG。
简化一下,只看 ( H(i,j) ) 的计算:
其中 ( S(X(i),Y(j)) ) 是匹配得分。这个操作可以画成 DFG:
H_diag ──┐
├── Add ──┐
S ────────┘ │
0 ──────────────────┼── Max ── H(i,j)
E ──────────────────┤
F ──────────────────┘
- S 节点:计算匹配得分(可能通过查表或比较,论文里称为
comp节点)。 - Add 节点:把 ( H_diag ) 和 S 相加。
- Max 节点:从 0、Add 结果、E、F 中取最大值。
类似地,E 和 F 也有自己的小 DFG,比如:
也会产生减法、取最大值等节点。
整个 BSW 单元格的 DFG 包含多个操作节点,有些节点有多个父节点(比如 Max),有些节点有多个子节点(比如 S 可能同时给多个加法用)。
3. DPMap 如何把 DFG 划分成 2 级 ALU 子图
DPMap 分三步:Partitioning(划分)、Seeding(播种)、Refinement(精化)。我们结合 BSW 的 DFG 来看。
3.1 Partitioning:分离“大块头”节点
算法 1 遍历 DFG:
- 遇到乘法节点:移除它的所有输入输出边。因为乘法器独立,不能和 ALU 树混用。
- 遇到比较/匹配得分节点(comp):移除它的输入边。
- 如果 comp 有多个子节点,并且子节点包含可交换操作(加法、取最大值等),就复制 comp 节点。
- 为什么?因为 comp 的结果要被多个子节点使用。如果只有一个 comp,多个子节点会争抢同一个父节点,导致数据必须通过寄存器文件传递。复制 comp 后,每个子节点都有自己的 comp 父节点,数据可以在 CU 内部直接流动,减少寄存器访问。
在 BSW 例子里,S(匹配得分)就是一个 comp 节点。它可能同时给多个加法用(比如 H 的计算和 E/F 的计算)。Partitioning 会把 S 复制成多个,每个加法配一个独立的 S 节点。
3.2 Seeding:找“汇合点”打包
算法 2 找两类节点:
- 有两个父节点的节点:这种节点很适合作为 2 级 ALU 树的第二级。因为第二级 ALU 正好有两个输入。
- 例如,一个 Max 节点有两个父节点:Add 和 E。那么 Max 可以放在第二级,Add 和 E 分别放在第一级。
- 算法会移除这个种子节点的输出边(因为输出要存寄存器),并移除它父节点的输入边(因为父节点的输入要从寄存器取)。这样,种子和它的两个父节点就打包成一个子图,正好映射到一个 2 级 ALU 树。
- 有多个子节点的节点:移除它的输出边,因为输出要被多个子节点使用,必须存寄存器。
在 BSW 中,Max 节点通常有多个父节点(0、Add、E、F)。但 2 级树第二级只能处理两个输入,所以不能直接把 4 输入的 Max 放进去。DPMap 会先通过 Partitioning 和 Seeding 把 Max 拆解或分组,让每个子图的第二级最多两个输入。比如,可以先两两取最大值,再合并。
3.3 Refinement:剩余节点两两配对
算法 3 反向遍历 DFG:
- 如果某个节点还有父节点(即有祖父),就移除它父节点的输入边。
- 这样做的目的是把剩下的节点每两个一组,映射到 2 级 ALU 树的第一级和第二级。
经过前两步,大部分复杂节点已经被分组,剩下的通常是比较简单的单父单子节点。Refinement 把它们两两配对,每个配对占用一个 CU 的第一级和第二级 ALU。
在 BSW 例子中,最后可能剩下两个 comp 节点(比如计算匹配得分的部分),它们被分别分到两个子图中,每个子图正好对应一个 2 级 ALU 树。
4. 用 Figure 9 的 BSW 例子走一遍
论文 Figure 9 展示了 BSW 的 DPMap 过程:
- (a) 原始 DFG:一堆节点和边,表示 BSW 单元格的完整计算。其中
comp节点代表匹配得分计算,它连接到多个子节点。 - (b) Partitioning:
- 移除
comp节点的输入边。 - 因为
comp有两个子节点,且子节点包含可交换操作,所以把comp复制成两个comp节点。 - 这样每个子节点都有自己的
comp父节点,数据流更独立。
- 移除
- (c) Seeding:
- 找到有两个父节点的节点(种子),把它们和父节点分组。
- 移除种子的输出边和父节点的输入边。
- 这些分组对应 2 级 ALU 树:父节点在第一级,种子在第二级。
- (d) Refinement:
- 剩下两个
comp节点,每两个一组,最终形成两个子图。 - 每个子图都能映射到一个 CU 的 2 级 ALU 树。
- 剩下两个
最终,DPMap 输出的是若干个子图,每个子图对应一条 VLIW 计算指令,在 PE 的 CU 上执行。
5. 一句话总结
CU 的 2 级 ALU 树限制了每个子图最多两个第一级操作和一个第二级归约。DPMap 通过 Partitioning 分离乘法和大输入节点、复制 comp 节点;通过 Seeding 把双亲节点和父节点打包成 2 级结构;通过 Refinement 把剩余节点两两配对。最终,BSW 的 DFG 被切成多个子图,每个子图正好塞进一个 2 级 ALU 树,实现高效可编程的 DP 计算。