2.3 Graph Path Finder (GPF) Engine
4.1 节中的 Graph Path Finder (GPF) Engine 是 PanGaea 加速器里专门用来加速 Graph Chaining(图链) 阶段的硬件模块。它的核心任务是:在 pangenome graph 上,快速计算两条线性链端点之间的最短路径,判断它们能否通过变异泡连通,从而把局部链跨顶点连接成候选图路径。
下面从背景、挑战、算法、硬件实现和工作流程几个角度来解释。
1. 为什么需要 GPF 引擎?
在 S2G 流水线中,Linear Chaining 只在同一个图顶点内部连接种子,输出局部链。
但 read 通常跨越多个顶点,所以需要 Graph Chaining 把不同顶点的局部链连起来。
图链阶段要解决的核心问题是:
给定一条局部链的终点(源顶点)和另一条局部链的起点(目标顶点),它们在图上是否可达?如果可达,最短路径是什么?路径上经过哪些顶点和变异泡?
这个问题本质上就是图上的最短路径搜索。
在 pangenome graph 中,图结构不规则,有分支、变异泡、长距离边。
在复杂区域,图遍历往往会主导整个图链阶段的运行时间。
如果只用通用 CPU 或 GPU 做,效率低、延迟高。
所以 PanGaea 设计了一个专用硬件引擎 GPF,来加速这个最短路径搜索过程。
2. GPF 引擎的核心功能
论文中描述:
“The GPF engine accelerates the graph chaining stage by computing shortest paths between linear-chain endpoints across graph vertices. It implements Dijkstra's shortest- algorithm using a priority-queue-based approach.”
翻译成通俗的话:
- 输入:图链阶段需要连接的两条局部链的端点,即源顶点和目标顶点。
- 任务:在 pangenome graph 上找一条从源到目标的最短路径,或者找前 条最短路径(shortest-)。
- 方法:使用 Dijkstra 算法 的变体,配合优先队列来管理待探索的顶点。
- 输出:候选路径,用于验证两条局部链能否跨顶点连接。
为什么是 shortest-?
因为图链阶段可能有多条候选路径都能连通,需要保留前几条最优的,供后续过滤和打分。
Dijkstra 本身是找单源最短路径,但这里只需要从源到目标的局部搜索,并且会剪枝,所以实际是限定范围的 Dijkstra。
3. 算法细节:Dijkstra + 优先队列 + 剪枝
Dijkstra 算法回顾
Dijkstra 用于在带权图中找单源最短路径。
基本步骤:
- 把源顶点加入优先队列,距离设为 0。
- 每次从优先队列取出当前距离最小的顶点。
- 遍历它的邻居,如果通过它到邻居的距离更短,就更新邻居距离,并把邻居加入优先队列。
- 重复直到队列为空或找到目标。
在 GPF 中,图的边权可能代表序列长度、变异代价或图距离。
目标是找到从源到目标的最小代价路径。
优先队列的作用
优先队列(通常用最小堆实现)保证每次取出的都是当前已知距离最小的顶点。
这是 Dijkstra 正确性的关键。
在硬件中,优先队列可以用堆控制器 + 比较器实现,论文 Table 1 中 GPF Engine 的 “Priority Queue Logic” 面积约 0.1540 mm²。
剪枝:距离阈值
论文提到:
“For each graph chain, the engine explores candidate paths from source to destination vertices, pruning branches that exceed predefined distance thresholds to constrain search complexity.”
意思是:
搜索时,如果某条分支的累计距离已经超过一个预设阈值,就把它剪掉,不再继续探索。
因为图链阶段并不需要全局最短路径,只需要找到足够好的、能验证可达性的路径。
剪枝可以大幅减少搜索空间,降低延迟和能耗。
4. 关键硬件组件
距离表(Distance Table)
论文:
“The distance table (a 16 KB SRAM) in the Path Reconstruct unit records visited vertices and their optimal costs, thereby avoiding redundant traversal of graph bubbles.”
距离表是一个 16 KB 的 SRAM,用来记录:
- 哪些顶点已经被访问过;
- 到达每个顶点的当前最优代价(距离)。
作用:
- 避免重复访问:如果某个顶点已经以更优代价访问过,就不需要再探索;
- 避免冗余遍历变异泡:变异泡可能有多条路径,距离表帮助快速判断哪条更优;
- 支持路径重建:记录前驱顶点,最终可以回溯出完整路径。
路径重建单元(Path Reconstruct)
除了距离表,还有逻辑用于根据距离表回溯路径。
当找到目标顶点后,从目标反向沿着前驱指针回到源,就得到一条候选路径。
这条路径就是图链阶段用来连接两条局部链的“桥”。
优先队列逻辑
用堆控制器和比较器实现,管理待探索的顶点集合。
每次取出距离最小的顶点进行扩展。
弧缓存(Arc Cache)
论文 Table 1 中还有 “Arc Cache 8 KB vertex cache”。
用于缓存顶点的邻接表(出边),减少访问 GLB 或 DRAM 的次数。
因为图遍历会频繁访问邻居,缓存能提高效率。
5. GPF 引擎的工作流程
结合论文,GPF 处理一条图链的大致流程是:
- 接收源顶点和目标顶点:来自当前 tile 中需要连接的两条局部链的端点。
- 初始化:源顶点距离设为 0,加入优先队列;距离表清空或初始化。
- 循环搜索:
- 从优先队列取出距离最小的顶点 ;
- 如果 是目标顶点,停止搜索,进入路径重建;
- 否则,遍历 的邻居 ;
- 计算通过 到 的新距离;
- 如果新距离小于距离表中 的当前最优距离,且不超过剪枝阈值:
- 更新距离表;
- 记录前驱;
- 把 加入优先队列。
- 路径重建:从目标顶点沿前驱回溯到源,得到一条候选路径。
- 输出:把路径信息(经过的顶点、边、代价)交给后续阶段,用于构建图链。
由于一个 tile 内可能有很多对局部链需要连接,GPF 会重复执行上述过程。
但距离表可以在多次搜索间复用部分信息,或者每个图链独立搜索。
6. 与其他模块的协作
- GLB(Global Buffer):GPF 需要访问图拓扑(顶点序列、邻接表),这些数据存在 Graph Topology Bank 中。GPF 通过 NoC 从 GLB 读取图数据。
- PE 阵列:PE 阵列负责线性链和 WFA 对齐等密集计算;GPF 是独立引擎,专门处理图遍历这种不规则、分支密集的搜索。
- 控制单元:主控制器调度 GPF 引擎,在合适的时机启动图链搜索。
- Traceback Logic:GPF 输出路径后,后续对齐阶段可能用到这些路径信息,但 CIGAR 由 Traceback 生成。
7. 直观比喻
把 pangenome graph 想象成一张城市地图,顶点是地点,边是道路,变异泡是环岛或岔路口。
图链阶段要判断:从 A 地到 B 地有没有路?哪条路最短?
GPF 引擎就像一个导航算法硬件加速器:
- 优先队列 = 待探索路口的优先列表;
- 距离表 = 记录到每个路口的最短距离,避免绕路;
- 剪枝 = 如果某条路已经绕太远,就不走了;
- 路径重建 = 找到目的地后,回溯出完整路线。
这样就能快速把两条局部链连接起来,形成完整的候选图路径。
8. 总结
GPF 引擎是 PanGaea 中专用于图链阶段最短路径搜索的硬件模块。
它用 Dijkstra + 优先队列 + 剪枝,在 pangenome graph 上快速寻找局部链端点之间的候选路径。
距离表记录已访问顶点和最优代价,避免冗余遍历;路径重建单元回溯出完整路径。
这样就把图链阶段最耗时的图遍历操作加速了,使得整个融合流水线能够高效运行。
一句话:GPF 引擎就像图上的导航加速器,用硬件实现带剪枝的 Dijkstra 搜索,快速判断两条局部链能否跨顶点连通,并找出最优路径。