1. 项目概述
在嵌入式系统芯片(SoC)的设计中,我们常常面临一个核心矛盾:如何在不显著增加芯片面积和功耗的前提下,榨取出更多的性能。尤其是在多媒体处理、实时信号分析或健康监测这类计算密集且对延迟敏感的应用中,通用处理器(CPU)往往力不从心。这时,硬件加速器(Hardware Accelerator)就成了我们的“秘密武器”。这些为特定任务量身定制的专用电路单元,能以极高的能效比完成计算,比如JPEG编解码、FFT变换或AES加密。
然而,事情并没有那么简单。当你把十几个、甚至几十个这样的加速器塞进一颗芯片,并通过一条共享总线(Bus)将它们与处理器、内存连接起来时,新的瓶颈出现了——通信。想象一下早高峰时只有一条车道的高速公路,所有的加速器都像车辆一样,争抢着使用这条总线来传输数据。冲突、等待、延迟,这些通信开销会迅速吞噬掉加速器并行计算带来的性能红利。这就是传统总线式SoC的典型困境。
为了解决这个问题,业界引入了点对点(Point-to-Point, P2P)互连。这就像在拥堵的高速公路旁,为某些交通流量特别大的站点之间修建了专用匝道。P2P通道能提供更高的带宽和更低的延迟,但它并非没有代价:每增加一条专用连线,都会占用宝贵的布线资源,增加芯片面积,并可能带来布局布线的复杂性。
于是,一个更深刻的设计问题摆在我们面前:我们究竟应该把有限的芯片资源(面积和布线长度)优先用于增加加速器的并行计算单元(并行化),还是用于构建更多的专用数据通道(P2P互连)?更关键的是,这两者并非独立。增加一个加速器的并行度,可能会改变数据流模式,从而影响哪些通信路径成为瓶颈;反之,增加一条P2P通道,缓解了通信压力,又可能让计算重新成为主要矛盾。这是一个典型的、相互耦合的系统级协同优化问题。
本文要探讨的,正是如何在总线式嵌入式SoC的框架下,对加速器并行化与P2P互连插入进行联合优化。我们的目标很明确:在给定的芯片面积和总P2P连线长度约束下,通过系统性地调整每个加速器的并行副本数量(并行度)以及决定在哪些加速器对之间插入P2P通道,使得整个SoC执行特定应用任务的总延迟(Latency)最小化。这不仅仅是两个独立优化问题的简单叠加,而是需要一套全新的设计流程和算法,来探索这个庞大且复杂的联合设计空间。
2. 系统建模与问题定义
在进行任何优化之前,我们必须先为要优化的对象建立一个精确且可计算的模型。这个模型需要能刻画加速器的工作方式、总线与P2P通道的通信特性,以及整个系统的调度行为。
2.1 应用与加速器模型
我们假设SoC上运行着M个应用子图(Application Subgraph),每个子图代表一个特定的数据处理流程,例如一个完整的图像处理管线。每个子图G_m由一组加速器节点(V_m)和它们之间的数据依赖边(E_m)构成。
对于第i类加速器(ACC_i),我们定义其关键参数:
- 计算时序:
in_i(输入延迟)、exe_i(执行延迟)、out_i(输出延迟)。这些参数通常通过RTL仿真和综合工具(如Modelsim和Design Compiler)在特定工艺节点下(例如130nm)精确获取。 - 执行次数:
n_i^m,表示在子图G_m中,ACC_i需要被调用的次数。 - 面积开销:
a_i(加速器核心逻辑面积)和ma_i(其本地存储器的面积)。 - 数据量:
d_{i,j}^m,表示在子图G_m中,从ACC_i传输到ACC_j的数据量。如果为0,则表示两者在该子图中无直接数据传输。
一个加速器的工作流程可以抽象为三个阶段:1)从主存或其他加速器的本地存储器读取数据(输入阶段);2)在内部并行单元上处理数据(执行阶段);3)将结果写回主存或其他加速器的本地存储器(输出阶段)。并行化主要影响执行阶段的吞吐量,而P2P互连则主要优化输入/输出阶段的数据传输延迟。
2.2 总线式SoC与调度模型
系统除了加速器,还包括处理器(面积pa)、主存(面积mma)和共享总线。总线有其固有的设置延迟b_set和传输每个数据单元的延迟b_t。如果两个加速器之间建立了P2P通道,则它们之间的数据传输延迟降低为p_t(通常p_t < b_t,且无需总线仲裁开销)。
当多个应用子图(即多个任务)在SoC上并发执行时,需要明确的调度策略。我们采用一个基于优先级的两级调度模型:
- 子图级优先级:由系统调度器(Schedule)决定。例如,一个实时心电图(ECG)分析任务可能比一个后台图片处理任务拥有更高的优先级。
- 加速器级优先级:在同一个子图内部,通过广度优先搜索确定数据流图中的层级。高优先级的子图中的加速器,总是比低优先级子图中的加速器优先获得总线访问权。同一子图同层级的加速器,则按索引顺序执行。
这个调度模型至关重要,因为它直接决定了总线冲突和加速器资源竞争的发生时机与严重程度,是准确估算系统总延迟(T_sum)的基础。
2.3 优化变量与约束
我们的优化目标是在一个庞大的离散空间中寻找最优解。优化变量集合Var包含两类:
- 加速器并行度:
p_i,表示第i类加速器的副本数量。p_i的取值范围是 [1, p_i_max],其中上限p_i_max由加速器自身的输入/输出瓶颈决定(公式:ceil((in_i + exe_i + out_i) / max(in_i, out_i)))。超过这个值,增加副本将无法带来性能提升。 - P2P互连插入:
l_{i,j},这是一个二元变量(0或1)。l_{i,j}=1表示在ACC_i和ACC_j之间插入一条P2P通道。只有那些在至少一个应用子图中存在数据传输(即Σ d_{i,j}^m > 0)的加速器对,才被纳入优化考虑。
优化必须在两个硬约束下进行:
- 面积约束:优化后的系统总面积
A_sum不能超过给定的上限A_const。A_sum = Σ (a_i * p_i + ma_i) + pa + mma + b_a - 布线长度约束:所有P2P通道的总曼哈顿连线长度
L_sum不能超过给定的上限L_const。L_sum的计算基于一个预定义的加速器布局(每个加速器被放置在一个固定的矩形区域内),(x_i, y_i)是ACC_i的中心坐标。L_sum = Σ Σ (|x_i - x_j| + |y_i - y_j|) * l_{i,j}
2.4 优化目标与挑战
最终,我们的优化问题形式化如下:
最小化 T_sum (系统总执行延迟) 约束条件: A_sum ≤ A_const 且 L_sum ≤ L_const这里的核心挑战在于T_sum的估算。由于存在总线冲突、加速器资源竞争以及复杂的调度策略,T_sum无法用一个简单的解析公式来表达。最直接的方法是使用周期精确的事件驱动仿真器,但这在优化循环中调用成千上万次将是不可承受之重。因此,我们需要一种既快速又足够准确的估算方法。
我们提出了一种基于图的延迟估算方法。其核心思想是将整个系统的执行过程建模为一个有向无环图(DAG),称为G_time。图中的节点是加速器实例,边代表三种延迟:
- 数据传输延迟:同一个子图内,加速器A执行完后,其输出数据传到加速器B输入所需的延迟。这取决于是否使用P2P通道。
- 总线冲突延迟:不同子图的加速器竞争总线使用权导致的额外等待时间。
- 加速器冲突延迟:同一个加速器的不同实例(来自不同子图)竞争其计算资源导致的等待时间。
通过拓扑排序算法,我们可以高效地找出这个图中的关键路径,其路径长度就是系统总延迟T_sum的估计值。这种方法将仿真复杂度从O(T_sum * N)降低到了O(N + L),其中N是加速器类型数,L是图中的边数,使得在优化循环中快速评估候选方案成为可能。
3. 协同优化算法设计
面对(Π p_i_max) * 2^D这样一个随加速器数量和互连边数指数级爆炸的设计空间,穷举遍历(Traversal)是不现实的。传统的贪心算法(Greedy)虽然快,但容易陷入局部最优。模拟退火算法(SAA)通过随机扰动寻找更优解,但在如此大的空间中,要达到令人满意的解所需的迭代次数依然很高。
我们提出了一种三阶段的混合优化算法,旨在以接近线性的复杂度,获得与最优解差距很小的优质解。
3.1 算法框架总览
算法的整体流程分为三个步骤,如下图所示(此处用文字描述):
- 优化子空间生成:分析初始(未优化)系统的关键路径,识别性能瓶颈。针对瓶颈相关的每一个优化变量(某个
p_i或l_{i,j}),生成一个“种子解”。这个种子解将该变量向优化方向调整一步(如p_i从1变为2,或l_{i,j}从0变为1),其他变量保持不变。每个种子解定义了一个以它为起点的优化子空间。由于最优解必然至少改善了一个瓶颈变量,因此所有子空间的并集包含了全局最优解。 - 子空间内的贪心引导:在每个子空间内,不再随机开始搜索。我们运行一个改进的贪心算法,以种子解为起点,迭代地选择“性价比”最高的变量进行优化。每次迭代都计算所有可优化变量的一个“效能度量”(Metric),选择度量最高的变量增加其值(
p_i++或设置l_{i,j}=1),直到违反面积或布线约束为止。这个过程产生两个重要输出:a) 一个质量很高的初始解;b) 一个记录了各变量在整个贪心过程中“受青睐程度”的优化方向向量。 - 基于引导的模拟退火:在每个子空间内,以上一步得到的优质初始解和优化方向向量,启动一个改进的模拟退火算法。与传统SAA的完全随机扰动不同,新解的生成会倾向于向优化方向向量指示的“好变量”进行扰动。同时,算法加入了一个合理性检查:只有当新解在当前约束下已无法通过贪心规则进一步改进时,才计算其
T_sum。这避免了大量时间浪费在对明显劣质的中间状态进行评估上。
最后,算法并行搜索所有子空间,并输出所有子空间中找到的最佳解作为最终结果。
3.2 成本效益度量与优化方向
这是算法的核心创新点之一。如何定义变量优化的“性价比”?
对于加速器并行化(p_i),其效能度量metric_para定义为:metric_para = (性能收益) / (面积成本占比)
- 性能收益:估算将该加速器并行度增加1时,其在所有位于关键路径上的实例所能减少的总执行时间之和。
- 面积成本占比:增加一个该加速器副本所带来的面积增量,除以当前剩余的可分配面积预算 (
A_const - A_current)。
对于P2P互连插入(l_{i,j}),其效能度量metric_p2p定义为:metric_p2p = (性能收益) / (布线长度成本占比)
- 性能收益:估算在ACC_i和ACC_j之间建立P2P通道后,所有位于关键路径上的、从i到j的数据传输所能节省的总时间。
- 布线长度成本占比:建立这条P2P通道所需的曼哈顿长度,除以当前剩余的可分配布线长度预算 (
L_const - L_current)。
这种度量方式实现了跨维度比较。它允许算法在“用一点面积换性能”和“用一点布线长度换性能”之间做出公平的权衡,从而进行真正的协同优化。
优化方向向量的生成则更具启发性。在贪心引导的每一步,每个变量都有一个度量值。算法记录下所有迭代步骤中各个变量的度量值。最终,优化方向向量中每个元素的值,是其对应变量在所有迭代中的度量值的加权和,且近期迭代的权重更高。这意味着,一个在贪心搜索后期仍被频繁选中的变量,很可能对性能提升持续有益,因此在模拟退火阶段应被赋予更高的扰动概率。这相当于将贪心搜索获得的启发式知识,注入到了后续的随机搜索过程中。
3.3 算法复杂度与优势
该算法的整体复杂度是线性的:O(1 + (Σ p_i_max + D) + Num_K * K)。
1:初始关键路径分析。(Σ p_i_max + D):所有子空间中贪心引导步骤的总迭代次数上界。Num_K * K:所有子空间中模拟退火的总迭代次数(Num_K是每个子空间的迭代数,K是子空间个数)。
相比于指数复杂度的遍历法,和虽然线性但解质量不稳定的传统贪心法,以及需要极大迭代次数才能接近最优的传统模拟退火法,我们的算法在求解质量和运行时间之间取得了卓越的平衡。实验表明,在多个基准测试中,该算法所得解与最优解(遍历法所得)的平均性能差距仅为2.33%,而运行时间均小于17秒。
4. 实验验证与深度分析
我们使用了一系列基准测试来验证方法和算法的有效性,包括一个真实的心电图(ECG)处理案例、一个媒体处理案例和三个随机生成的案例。加速器的时序和面积信息通过SMIC 130nm工艺库综合得到。
4.1 系统模型准确性验证
首先,我们将模型估算的系统延迟 (T_sum) 和面积 (A_sum) 与RTL级仿真和综合的结果进行对比。在多个测试案例中,延迟估算的平均误差仅为2.38%,面积差异小于4%。误差主要来源于模型采用了分支模式下的最坏情况输入延迟估算,以及未计入P2P接口和小型控制器的面积。这证明了我们的系统模型具有足够的精度,可以作为优化算法的可靠基础。
4.2 算法性能对比
我们将提出的算法与三种传统算法进行对比:
- 遍历算法:全局最优解,但复杂度极高,在稍大的设计空间即无法完成。
- 传统贪心算法:运行极快,但解的质量不稳定,与最优解差距最大可达16.6%。
- 传统模拟退火算法:设置固定迭代次数(160次),结果优于贪心但依然不稳定,与最优解差距平均为6.83%。
我们的算法在所有测试案例和约束条件下都表现稳定。如图8和图9所示,其性能始终紧追遍历算法的最优解,最大差距不超过4.6%,平均差距2.33%。在运行时间上(表3和表4),它比传统模拟退火算法更短(<17秒 vs ~20秒),且随着问题规模增大,时间增长平缓,而遍历算法则很快因组合爆炸而失败。
注意:在实际工程中,遍历法仅适用于极小规模的问题验证。我们的算法在可接受的时间内提供了接近最优的解决方案,这对于具有数十个加速器节点和互连边的真实SoC设计具有重大实用价值。
4.3 关键影响因素剖析
除了验证算法本身,我们还利用模型和算法深入分析了影响协同优化效果的几个关键因素。
调度模式的影响:我们测试了从“周期模式”(各���图交替执行)到“突发模式”(同一子图连续执行多次)的五种调度策略。如图11所示,突发模式下的初始延迟最高,因为同一类型的加速器连续执行,加剧了资源竞争。但有趣的是,在突发模式下,协同优化带来的性能提升幅度最���(14.8%)。这是因为优化手段(增加并行度或P2P通道)正是为了缓解这种密集冲突。这给我们的启示是:对于任务调度模式已知的系统,优化可以更有针对性,收益也更显著。
应用特征的影响:我们定义了一个“计算-内存比”c_m,即系统中所有加速器计算延迟之和与所有数据传输延迟之和的比值。c_m > 1表示应用是计算密集型,反之则是内存(通信)密集型。
如图12所示,在媒体处理(计算密集型)案例中,当面积约束很紧(10%开销)时,c_m很高(5.58),计算是主要瓶颈。此时,加速器并行化的贡献远大于P2P互连。随着允许的面积开销增加,并行化逐渐饱和,通信瓶颈开始凸显,P2P互连的优化效果占比才逐步上升。这直观地展示了两种优化手段如何随应用特征和资源约束动态地扮演不同角色。
约束边界的确定:图13揭示了一个重要现象:在固定面积开销(30%)的情况下,随着允许的P2P布线长度增加,系统性能先提升后进入平台期。存在一个“拐点”(本例中为40%),超过这个点后,再增加布线资源对性能已无改善。这意味着,对于给定的面积预算,存在一个最优的、最小的P2P布线长度预算,超过该值的布线资源将被浪费。这为芯片架构师在早期进行资源预算分配提供了直接的定量依据。
5. 实操要点与工程启示
基于上述研究和实验,我将分享一些在具体项目中应用此类协同优化方法时的实操心得和注意事项。
5.1 模型构建的准确性是关键
算法的有效性完全建立在系统模型的准确性之上。在实践中有几个易错点:
- 延迟参数的提取:
in_i,exe_i,out_i不能简单地从单独测试加速器获得。必须将其放入一个包含总线接口和存储器的最小测试平台中进行仿真,以捕获真实的接口握手和缓冲延迟。使用脚本自动化这一提取过程至关重要。 - 数据量的统计:
d_{i,j}^m需要通过对应用算法在代表性输入数据上进行分析或仿真来获得。对于可变数据量的应用,应使用最坏情况或典型情况下的值。低估数据量会导致优化算法低估通信开销,从而做出错误决策。 - 布局预估的合理性:
L_sum的计算依赖于一个预定义的、粗略的加速器布局。这个布局应基于设计经验,将通信频繁的模块放置得近一些。虽然优化算法可以迭代不同的布局顺序,但一个完全不合逻辑的初始布局会导致算法在布线约束下找不到可行解。建议使用早期平面规划工具的输出作为参考。
5.2 约束条件的设定艺术
面积约束A_const和布线长度约束L_const不是随意给出的,它们本身也是设计权衡的结果。
- 从松弛约束开始:初次探索时,可以设置一个非常宽松的约束,运行优化算法。观察结果中
A_sum和L_sum的实际值,这给出了达到某个性能水平所需的“最低资源需求”。然后,再根据芯片的总体面积和布线资源预算,逐步收紧约束,观察性能的衰减曲线(如图13),从而确定一个性价比最高的约束点。 - 约束的耦合性:面积和布线约束并非完全独立。增加P2P通道不仅增加布线长度,其接口逻辑也会占用少量面积。在精确建模时,应在面积公式
A_sum中加入P2P接口的面积项。我们的模型将其归入加速器本地存储器或总线控制器,是一种简化,在高精度要求下需要修正。
5.3 算法实现的工程化技巧
将学术算法转化为可用的设计工具需要一些工程处理:
- 热启动与增量优化:在架构探索阶段,设计参数经常微调。不必每次都从头开始优化。可以将上一次优化的结果作为本次优化的初始解,并适当缩小模拟退火的初始“温度”和搜索范围,能极大加快收敛速度。
- 并行化部署:算法中各个优化子空间的搜索是相互独立的。这天然适合于并行计算。在多核CPU或服务器集群上,可以并行运行K个子空间的优化过程,从而将总运行时间缩短为单个子空间优化时间的量级。
- 结果的可视化与解释:优化算法输出的是一个变量集合
Var_opt。工具应能将其可视化,例如生成一个标明了并行度和P2P连接的加速器网络图,并列出关键路径的变化。这能帮助设计师直观理解优化器为何做出这样的选择,增加对结果的信心。
5.4 超越总线:向更复杂互连的演进
本文聚焦于“总线+P2P”的混合互连。但在更复杂的SoC中,可能会遇到多层总线、环形总线或部分连接的NoC。我们的方法可以扩展:
- 建模扩展:系统模型中的通信延迟计算部分需要扩展,以支持多种互连类型。例如,为环形总线或一个简单的2D Mesh NoC定义其延迟模型。
- 变量扩展:优化变量可以不再仅仅是“是否插入P2P”,而是“选择哪种类型的互连”。例如,变量可以变为
l_{i,j} ∈ {0(总线),1(P2P),2(NoC路由)}。这会使搜索空间变大,但算法框架依然适用。 - 功耗作为第三维约束:在实际设计中,功耗往往是比面积更严格的约束。可以将动态和静态功耗模型集成到系统中,将优化问题从“面积、布线约束下最小化延迟”变为“面积、布线、功耗约束下最小化延迟”,或进行多目标优化。
总线式嵌入式SoC中加速器并行化与点对点互连的协同优化,是一个典型的系统级设计空间探索问题。它要求设计师跳出单个模块优化的局部视角,从整个芯片系统的通信-计算平衡出发进行决策。本文提出的建模方法和优化算法,提供了一套系统化的、自动化的工具链思路。其核心思想——识别瓶颈、定义成本效益度量、在引导下进行启发式搜索——可以广泛应用于其他具有复杂权衡的芯片架构设计问题中。最终,这项工作的价值在于,它让设计师能够在设计早期,就以量化的方式回答那个关键问题:“我这颗芯片里,宝贵的硅面积和金属布线资源,到底应该用来多算一点,还是应该用来更快地传数据?”