2.8 BSW DFG
在 GenDP 中,把 BSW 的目标函数转换为 数据流图(DFG),是 DPMap 算法的第一步。只有先画出 DFG,才能后续把它划分成适合 2 级 ALU 树的子图。下面我一步步讲解 BSW 目标函数如何变成 DFG。
1. 先写出 BSW 的目标函数
BSW 计算一个单元格 时,需要计算三个矩阵:、、。
典型的仿射 gap Smith-Waterman 公式是:
其中:
- :匹配得分,由当前两个碱基决定;
- :gap opening penalty;
- :gap extension penalty;
- 、、、、:来自前一个波前的已知值。
这些值都是输入,而 、、 是输出。
2. 把每个操作变成 DFG 节点
DFG 中:
- 节点 = 一个操作,比如加法、减法、取最大值、比较、查表;
- 边 = 数据依赖,表示某个节点的输出是另一个节点的输入;
- 父节点 = 提供输入的操作;
- 子节点 = 接收输出的操作。
按照上面的公式,逐个操作建节点:
2.1 匹配得分节点:comp
- 操作:根据两个碱基查表或比较,得到匹配得分;
- 输入:、;
- 输出:;
- 节点类型:论文中称为 comp(Comparison / MatchScore)。
2.2 加法节点:计算对角线候选
- 操作:加法;
- 输入: 和 ;
- 输出:;
- 父节点: 和 comp。
2.3 减法节点:计算 E 的候选
- 操作:减法;
- 输入: 和 ;
- 输出:、。
2.4 最大值节点:计算 E
- 操作:取最大值;
- 输入:、、常量 0;
- 输出:。
2.5 减法节点:计算 F 的候选
- 操作:减法;
- 输入:、;
- 输出:、。
2.6 最大值节点:计算 F
- 操作:取最大值;
- 输入:、、0;
- 输出:。
2.7 最大值节点:计算 H
- 操作:取最大值;
- 输入:0、、、;
- 输出:。
3. 连边,形成 DFG
把上面的节点按数据依赖连起来:
H(i-1,j-1) ──┐
├── A1 (Add) ──┐
comp (S) ─────┘ │
│
H(i-1,j) ──── A2 (Sub) ──┐ │
├─ E (Max) ──┐
E(i-1,j) ──── A3 (Sub) ──┘ │
│
H(i,j-1) ──── A4 (Sub) ──┐ ├─ H (Max) ── H(i,j)
├─ F (Max) ──|
F(i,j-1) ──── A5 (Sub) ──┘ |
│
0 ────────────────────────────────────┘
这就是 BSW 一个单元格的 DFG。
节点清单:
| 节点 | 类型 | 说明 |
|---|---|---|
| comp | 比较/查表 | 计算匹配得分 |
| A1 | 加法 | |
| A2 | 减法 | |
| A3 | 减法 | |
| E | 最大值 | |
| A4 | 减法 | |
| A5 | 减法 | |
| F | 最大值 | |
| H | 最大值 |
4. 为什么 comp 节点会被复制?
论文 Figure 9(b) 说:
节点 comp 的输入边被移除,一个 comp 节点被复制成两个 comp 节点,因为它们的子节点都有另一个父节点且包含可交换操作。
在 BSW 的 DFG 中,comp 节点(匹配得分 )可能被多个子节点使用。比如:
- 在标准公式中, 只用于 (加法);
- 但在某些 BSW 实现中, 可能同时用于 H 和 E/F 的计算,或者 comp 节点代表比较操作,其结果被多个地方引用。
当 comp 有多个子节点,且每个子节点除了 comp 之外还有另一个父节点,并且子节点的操作是可交换的(如加法、取最大值),DPMap 就会复制 comp 节点,让每个子节点都有自己的 comp 父节点。
为什么复制?
- 如果不复制,多个子节点共享同一个 comp 父节点,那么 comp 的输出必须写入寄存器文件,再由多个子节点读取,增加 RF 访问。
- 复制后,每个子节点都有自己的 comp,数据可以在 CU 内部直接流动,减少 RF 访问。
- 复制是可交换操作允许的,因为加法、取最大值等操作满足交换律,复制不会改变结果。
在 BSW 例子中,Figure 9(b) 显示 comp 被复制成两个 comp 节点,每个子节点各配一个。
5. DFG 到 2 级 ALU 树的映射约束
CU 的 2 级 ALU 树结构是:
第一级: ALU1 ALU2
\ /
第二级: ALU3
|
output
约束:
- 第一级最多 2 个 ALU,每个可接收多个输入;
- 第二级 1 个 ALU,接收第一级两个输出;
- 每个 CU 最多一个 4 输入操作或一个乘法;
- 乘法器独立。
所以 DFG 不能直接整个塞进一个 CU。必须切成子图,每个子图满足:
- 最多两个第一级操作;
- 一个第二级归约;
- 边在子图内部表示 CU 内部数据移动;
- 边跨子图表示需要寄存器文件传递。
DPMap 的三步就是做这个切分。
6. 用 Figure 9 走一遍
- (a) 原始 DFG:就是上面画的那张图,包含 comp、A1–A5、E、F、H 等节点。
- (b) Partitioning:
- comp 的输入边被移除;
- comp 被复制成两个,因为它的子节点有多个,且操作可交换;
- 乘法节点(如果有)的输入输出边被移除;
- 4 输入节点的父边被移除。
- 结果:所有节点最多两个父节点。
- (c) Seeding:
- 找有两个父节点的节点(如 E、F、H 这些 Max 节点),把它们和父节点分组;
- 这些分组正好对应 2 级 ALU 树:父节点在第一级,Max 在第二级。
- (d) Refinement:
- 剩下的 comp 节点每两个一组,映射到 2 级 ALU 树;
- 最终形成若干子图,每个子图对应一条 VLIW 计算指令。
7. 一句话总结
把 BSW 目标函数变成 DFG,就是把公式中的每个操作(比较、加法、减法、取最大值)变成节点,把数据依赖变成边。
comp 节点因被多个子节点共享且操作可交换而被复制,以减少寄存器访问。DPMap 随后把这个 DFG 划分成多个子图,每个子图正好能映射到 CU 的 2 级 ALU 树:两个第一级操作加一个第二级归约。这样,BSW 的目标函数就能在 GenDP 的 PE 阵列上高效执行。