4.4 TALCO-WFAA Accelerator Design
第四节里的 TALCO-WFAA Accelerator Design 讲的是:怎么把 TALCO 算法作用在 WFA-Adapt 上,做成硬件加速器。
它的目标和 TALCO-XDrop 一样:用固定的片上内存,加速任意长的序列比对,同时保证结果与软件 WFA-Adapt 一致。
但 WFA-Adapt 的计算模式和 X-Drop 很不一样,所以硬件结构也不同。下面按“整体思路 → 三大模块 → Phase 1 → Phase 2 → 回溯 → 与 WFA-FPGA 的区别 → 回退机制 → 总结”来讲解。
1. 整体思路:迭代执行 extend、reduce、compute
WFA-Adapt 的三角矩阵按 分数 逐行推进。
每一行对应一个 alignment score,列对应对角线 。
硬件要做的事情就是:
对每一行,先 extend(沿对角线匹配延伸),再 reduce(剪掉落后太多的对角线),最后 compute(计算下一行的最远到达位置和指针)。
TALCO-WFAA 把这个过程做成流水线:
- 个 extend 模块:并行做匹配延伸。
- 个 compute 模块:并行计算下一行的 cell offset 和指针。
- reduce 模块:做 WFA-Adapt 的剪枝。
图 8 展示了这个阵列。
每个 extend 和 compute 模块都配有一对 SRAM,用来存查询序列和参考序列,因为 WFA-Adapt 的访问模式不规则。
2. 数据表示与固定参数
- 序列还是用 3 bits 一个碱基 存 SRAM,字母表:
- M:一个 tile 内从起点到 marker 的 wavefront 数,设计时固定。
- :一个 wavefront 最多能容纳多少 cell,设计时固定。
- 如果某一行超过 ,硬件回退 CPU。
- WFA-Adapt 的打分参数在设计时固定。论文里设为:
- mismatch
- gap open
- gap extend
因为 gap open 和 gap extend 不同,分数依赖会跨两行。
所以 TALCO 里 WFA-Adapt 的 frontier 由两行组成,这和 Levenshtein 距离下一行就够不同。
3. Phase 1:正常计算并存储 traceback 指针
Phase 1 从 tile 起点算到 marker,任务和软件 TALCO 的 Phase 1 一样:
算分数、算指针、存指针。
3.1 extend 模块:沿对角线匹配延伸
每个 extend 模块收到一个 cell offset 和三角矩阵中的 K 位置。
它从参考序列和查询序列的对应位置开始,逐个比较碱基,直到遇到不匹配。
为了加速,硬件会同时比较多个连续碱基,然后用一个 reduction tree 找出最早不匹配的位置。
这样就能快速算出这条对角线能免费延伸多远。
extend 返回一个新的 offset,表示匹配延伸后的位置。
3.2 reduce 模块:WFA-Adapt 剪枝
所有 cell 的新 offset 算完后,reduce 模块启动。
它做的是 WFA-Adapt 的启发式剪枝:
把那些“落后太多”的外侧对角线丢掉。
具体来说,它根据新 offset 判断哪些 cell 离最远到达位置太远,然后剪掉。
另一个 reduction tree 用来确定新的边界:
这两个值存到专用 SRAM,供后续使用。
3.3 compute 模块:计算下一行
compute 模块根据当前 frontier 和 WFA 的递推公式,计算下一行每个 cell 的最远到达 offset。
论文里用到的公式是 WFA 的 (4) 到 (7),这里不需要完全展开,只要知道它做的是:
- 从 、、、 这些状态,算出新的 、、;
- 同时计算 traceback 指针;
- 把指针存到 SRAM。
为了保存这些状态,硬件用了四组寄存器数组,分别对应:
它们存的是每个 cell 的 offset。
这样,Phase 1 就正常地一行一行往前算,直到 marker。
4. Phase 2:传播 convergence pointer,检测收敛
到达 marker 后,进入 Phase 2。
这时:
- extend 和 reduce 模块照常工作;
- compute 模块不再存 traceback 指针,而是计算 convergence pointer;
- convergence pointer 存到寄存器 、、、 中;
- 不再使用 traceback pointer SRAM,节省内存。
convergence pointer 的作用和 TALCO-XDrop 一样:
表示当前 cell 的回溯路径,最终会落到 marker 上的哪个格子。
4.1 收敛检测
一个 frontier 是两行。
硬件用一个 reduction tree 检查:
当前 frontier 上所有 cell 的 convergence pointer 是否都指向 marker 上的同一个格子?
- 如果是,就判定 收敛。
- 如果否,就继续算下一行。
和 TALCO-XDrop 一样,未收敛不会报错,只是继续往后算,直到收敛或到达序列末尾。
4.2 收敛后回溯
一旦收敛,traceback logic 开始工作:
- 用收敛点作为回溯起点;
- 利用 SRAM 里存的 traceback 指针、、 等信息;
- 逐步生成 compact CIGAR(紧凑的比对描述)。
如果一直不收敛,但已经到达序列末尾,那么就从 开始回溯,其中 和 分别是参考序列和查询序列的长度。
生成的 compact CIGAR 会被送到 CPU 线程,再解包成完整的 CIGAR 输出。
5. 与 WFA-FPGA 设计的两点区别
论文提到,TALCO-WFAA 参考了 WFA-FPGA [43],但有两处不同:
-
状态存储方式
WFA-FPGA 用 SRAM 来算下一 wavefront 的 offset;
TALCO-WFAA 用专用寄存器来减少内存访问。
这更适合 ASIC,因为寄存器访问更快、更省电;而 WFA-FPGA 的设计更偏向 FPGA。 -
并行度
WFA-FPGA 有多个并行 extend 单元,但只有一个 compute 单元;
TALCO-WFAA 同时并行使用 多个 extend 和多个 compute 单元,充分利用 WFA-Adapt 的并行性。
6. 回退机制:保证正确性
和 TALCO-XDrop 一样:
- 如果某个 wavefront 的长度超过硬件预设的 ,硬件无法处理;
- 硬件返回 invalid flag;
- Host CPU 用软件重新算这个比对。
这样虽然牺牲一点吞吐,但保证结果永远正确。
7. 一句话总结
TALCO-WFAA 加速器把 WFA-Adapt 的计算拆成 extend、reduce、compute 三个步骤,用多个 extend 和 compute 模块并行执行。Phase 1 正常计算分数和 traceback 指针,存到 SRAM;到达 marker 后,Phase 2 让 compute 模块改为计算 convergence pointer,并用 reduction tree 检测所有回溯路径是否汇聚到 marker 上同一个格子。一旦收敛,就从该点回溯生成 compact CIGAR;若到末尾仍未收敛,就从 回溯。如果 wavefront 超过 ,则回退 CPU。这样就在固定片上内存下,实现了任意长序列的 WFA-Adapt 加速,并保证与软件结果一致。