4.1 TALCO-XDrop Accelerator Design
第四节 TALCO-XDrop Accelerator Design 讲的是:怎么把 TALCO 算法(作用在 X-Drop 上)做成硬件加速器。
核心目标是:用固定的片上内存,加速任意长的序列比对,同时保证结果和不做 tiling 的 X-Drop 完全一致。
下面按“整体架构 → 计算流程 → Phase 1 → Phase 2 → 回溯 → 回退机制 → 一句话总结”来讲解。
1. 整体位置:协处理器 + Host CPU
论文图 6 展示了整体结构:
- Host CPU:负责发任务、收结果。
- Controller:连接 Host 和多个 TALCO-Align 单元。
- 多个 TALCO-Align 单元:并行执行比对。
- Device Memory:存放序列和最终结果。
Host CPU 把一对对序列的地址发给 TALCO-Align 单元。
每个单元独立算一个比对。
如果某个比对因为 wavefront 长度超过硬件限制 而失败,硬件会返回一个 invalid flag,Host CPU 就用软件重新算这个比对。
这样虽然会慢一点,但保证了结果正确。
2. TALCO-XDrop 单元内部结构
图 7a 是 TALCO-XDrop 阵列的硬件设计,关键部件有:
- PE 阵列:一组处理单元,按 systolic 方式排列。
- FIFO:暂存上一 stripe 最后一行的 H 和 D 值。
- Traceback Pointer SRAM:每个 PE 专用,存 traceback 指针。
- Start/Stop SRAM:存每个 stripe 的起止位置。
- Reduction Tree:判断多个 PE 算出的 convergence pointer 是否收敛到同一个格子。
- Convergence Pointer SRAM:存每个 wavefront 的收敛结果。
- Traceback Logic:从收敛点或最大分点开始回溯。
- 寄存器 H_max、H_max':跟踪最大分数。
你可以把它理解成一条流水线:
PE 阵列负责算分数和指针 → SRAM 存下来 → Reduction Tree 检测收敛 → Traceback Logic 回溯 → 输出给软件。
3. 数据表示与参数
- 序列用 3 bits 一个碱基 存 SRAM,支持扩展 DNA 字母表: 其中 表示模糊字符。
- M:一个 tile 内从起点到 marker 的 wavefront 数,设计时固定。
- B_max:一个 wavefront 最多能容纳多少个 cell,设计时固定。
- 如果某个 wavefront 超过 ,硬件回退 CPU。
- 打分参数可以运行时传入:
- 替换矩阵
- gap open 罚分
- gap extend 罚分
4. 计算流程总览
TALCO-XDrop 的硬件计算和软件 TALCO 一一对应:
| 软件 TALCO | 硬件 TALCO-XDrop |
|---|---|
| Phase 1:算分数,存 traceback 指针 | PE 阵列算分,指针存 SRAM |
| 到达 marker | 用寄存器标记 |
| Phase 2:传播 convergence pointer | PE 做 pointer redirection,Reduction Tree 检测收敛 |
| 收敛后确定 | Convergence Pointer SRAM 存结果 |
| 回溯当前 tile | Traceback Logic 从 回溯 |
| 下一个 tile 用 marker 分数初始化 | FIFO / SRAM 保存 marker 分数 |
5. Phase 1:正常算分、存指针
5.1 PE 阵列怎么算?
X-Drop 是按 wavefront(反对角线) 推进的。
硬件把 wavefront 切成一条条 stripe,每个 stripe 有 行。
图 7 的例子中 。
每个 PE 负责计算一部分格子,公式就是 Needleman-Wunsch + affine gap:
其中:
- :插入状态
- :删除状态
- :最终分数
- :匹配/错配分数
每个格子还会生成一个 traceback 指针,共 4 bits:
- 2 bits 表示 是从 、 还是对角线来的;
- 1 bit 表示 的方向;
- 1 bit 表示 的方向。
这样回溯时才能知道每一步怎么走。
5.2 X-Drop 剪枝怎么实现?
硬件维护一个运行中的最大分数 。
当某一列所有格子的分数都低于:
就停止这个 stripe,后面的格子不再计算。
这就是 X-Drop 的剪枝,图 7 中白色的“未计算区域”就是被剪掉的。
5.3 跨 stripe 怎么衔接?
一个 stripe 算完后,最后一行的 和 值存入 FIFO。
下一个 stripe 需要这些值来继续算。
如果上一 stripe 的某些值没算,就初始化为 。
5.4 指针存哪里?
Phase 1 的 traceback 指针存到每个 PE 专用的 SRAM bank。
另外,每个 stripe 的起始和结束位置也存到额外 SRAM,因为 X-Drop 的边界随 变化,回溯时要用。
6. Phase 2:传播 convergence pointer,检测收敛
到达 marker 后,进入 Phase 2。
这时 不再存 traceback 指针,而是计算 convergence pointer。
6.1 pointer redirection
每个 PE 根据当前格子的 traceback 指针,找到它在上一 frontier 对应的格子,然后继承那个格子的 convergence pointer。
这样,convergence pointer 就沿着回溯路径一层一层往 marker 方向传播。
6.2 Reduction Tree 检测收敛
一个 wavefront 被多个 PE 分成若干子集。
每个 PE 算出一个 convergence pointer,表示“我这个格子的回溯路径最终会落到 marker 上的哪个格子”。
Reduction Tree 会检查:
当前 wavefront 上所有格子的 convergence pointer 是否都指向 marker 上的同一个格子?
- 如果是,就在 Convergence Pointer SRAM 里存下那个格子的索引,按当前 wavefront 索引寻址。
- 如果不是,就存 ,表示还没收敛。
当所有子集的指针都相同,就判定 收敛。
6.3 收敛后还要做什么?
收敛后,硬件继续算分,直到:
这里 是 Phase 2 中看到的最大分数。
- 如果收敛点对应的分数最终成为最大,就从 收敛点 开始回溯。
- 否则,从 对应的格子 开始回溯。
这处理了局部比对中最大分可能出现在收敛点之后的情况。
一旦在某个 frontier 上检测到收敛,硬件并不会立刻停止,而是继续计算分数,同时维护一个 Phase 2 的最大分 。这个继续计算的过程会一直进行,直到满足以下两个终止条件之一:
-
出现了比 Phase 1 最大分更高的分数。 -
到达序列末尾(或 wavefront 超过硬件限制,回退 CPU)
如果一直算到末尾都没有出现更大的分数,就说明 Phase 1 的 就是全局最大分。
为什么不能无限算下去?
因为有两个硬性停止条件:
- 到达序列末尾:不可能再有新的格子了,所以停止;
- wavefront 超过硬件限制 :硬件无法处理,返回 invalid flag,Host CPU 用软件重新算。
所以,即使 一直不满足,计算也不会无限进行,而是会在序列末尾自然停止
7. 回溯:Traceback Logic
一旦确定回溯起点,Traceback Logic 就开始工作:
- 从起点出发,根据 SRAM 里的 traceback 指针一步步走;
- 使用 Start/Stop SRAM 里的 stripe 起止信息;
- 走出当前 tile 的 partial alignment;
- 把路径发给软件,由软件拼接成完整比对。
然后进入下一个 tile:
- 用 marker 的分数初始化下一个 tile;
- 重复 Phase 1 和 Phase 2。
8. 回退机制:保证正确性
硬件设计时固定了 。
如果某个 wavefront 的 cell 数超过 ,硬件无法处理,就:
- 返回一个 invalid flag;
- Host CPU 用软件重新算这个比对。
这样虽然牺牲了一点吞吐,但保证了结果永远正确。
这是 TALCO 相比 GACT-X 的一个重要优势:GACT-X 会贪心选错,而 TALCO-XDrop 宁可回退也不出错。
9. 和 GACT-X 的关系
TALCO-XDrop 和 GACT-X 很像,都是 systolic PE 阵列 + X-Drop banding。
区别是:
- GACT-X 只有 Phase 1 的贪心 tiling;
- TALCO-XDrop 多了图 7a 灰色框里的 Phase 2 逻辑:
- pointer redirection;
- Reduction Tree;
- Convergence Pointer SRAM;
- 收敛后回溯。
所以 TALCO-XDrop 可以保证与完整 X-Drop 等价,而 GACT-X 不能。
10. 一句话总结
TALCO-XDrop 加速器用 systolic PE 阵列计算 X-Drop 的分数和 traceback 指针,Phase 1 把指针存进 SRAM;到达 marker 后,Phase 2 用 pointer redirection 和 Reduction Tree 检测所有回溯路径是否汇聚到 marker 上同一个格子;一旦收敛,就从那个格子开始回溯,输出当前 tile 的 partial alignment;然后用 marker 分数初始化下一个 tile。如果 wavefront 超过硬件限制,就回退 CPU。这样就在固定片上内存下,实现了任意长序列的加速,并保证结果与软件 X-Drop 一致。
。