4.2 TALCO-XDrop not Convergence
如果没有收敛,TALCO 不会停下来等待,也不会直接出错,而是继续往后计算更多的 frontier,直到满足下面两个终止条件之一:
- 到达比对末尾;
- wavefront 长度超过硬件限制 ,触发回退 CPU。
下面分算法层面和硬件层面说明。
1. 算法层面:未收敛就继续推进
回顾 Algorithm 1 的 Phase 2:
else
ConvPrcurr ← redirect(Prf, ConvPrprev)
if Clast was updated in the current tile then
ConvPrlatt ← ConvPrcurr[Clast]
end if
if all pointers in ConvPrcurr point to a marker cell then
C_tb ← Cx
break
else if f has reached the end of the alignment then
C_tb ← ConvPrlatt
break
end if
ConvPrprev ← ConvPrcurr
end if
如果 Reduction Tree 检测到没有收敛,那么:
all pointers ... point to a marker cell为假;- 算法不会
break; - 执行
ConvPrprev ← ConvPrcurr; - 然后
j ← j + 1,Sprev ← Scurr,进入下一个 frontier; - 在新的 frontier 上重新计算 convergence pointer,再次检查是否收敛。
也就是说,未收敛只是意味着 Phase 2 还要多算几层,而不是失败。
2. 什么时候才会停止 Phase 2?
Phase 2 只在以下情况结束:
情况 A:收敛了
当前 frontier 上所有格子的 convergence pointer 都指向 marker 上的同一个格子 。
此时:
然后跳出内层循环,开始回溯当前 tile。
情况 B:到达比对末尾
如果一直不收敛,但已经算到了序列末尾,那么算法会检查:
else if f has reached the end of the alignment then
C_tb ← ConvPrlatt
break
这里 ConvPrlatt 是之前保存的、局部最大分格子 Clast 对应的 convergence pointer。
如果 Clast 在当前 tile 内更新过,就用它作为回溯起点。
对于全局比对,Clast 就是终点 ;对于局部比对,Clast 是当前最大分格子。
所以,即使完全不收敛,到达末尾后仍然能确定一个正确的回溯起点。
3. 硬件层面:Reduction Tree 未收敛怎么办?
在 TALCO-XDrop 加速器中:
- 每个 PE 计算自己负责的格子的 convergence pointer;
- Reduction Tree 检查当前 wavefront 的所有子集是否都指向 marker 上的同一个格子;
- 如果收敛,就把那个格子的索引写入 Convergence Pointer SRAM,并通知 Traceback Logic;
- 如果没有收敛,Reduction Tree 不会产生有效的
C_tb,硬件继续计算下一个 wavefront。
具体行为:
-
继续推进 wavefront
硬件会继续让 PE 阵列计算下一个 frontier 的分数和 convergence pointer,再次送入 Reduction Tree 检测。 -
末尾检测
硬件中有逻辑判断是否已经到达参考序列和查询序列的末尾。
如果到达末尾仍未收敛,就使用之前保存的Clast或ConvPrlatt作为回溯起点。 -
超过 则回退
如果某个 wavefront 的 cell 数超过硬件预设的 ,硬件无法继续处理。
此时会返回一个 invalid flag,Host CPU 用软件重新算这个比对。
这保证了正确性,但会牺牲一点吞吐。
所以,未收敛本身不会导致回退;只有 wavefront 太长才会回退。
4. 未收敛会影响什么?
- 不影响正确性:TALCO 仍然保证与完整 banded 算法结果一致。
- 只影响效率:Phase 2 需要多算一些 frontier,这些 frontier 属于冗余计算,会在下一个 tile 中重算。
- 收敛越快,效率越高:论文实测,低错误率时效率 95–97%,最差也超过 85%。
如果一直不收敛,效率会下降,但不会出错。
5. 一句话总结
如果 Reduction Tree 没有检测到收敛,TALCO 不会停止或报错,而是继续计算下一个 frontier,直到所有回溯路径汇聚到 marker 上同一个格子,或者到达比对末尾。到达末尾仍未收敛时,就用之前保存的局部最大分格子对应的 convergence pointer 作为回溯起点。如果 wavefront 超过硬件限制,则回退 CPU。未收敛只增加冗余计算,不影响结果正确性。