Page 77 - 《软件学报》2026年第6期
P. 77

2396                                                       软件学报  2026  年第  37  卷第  6  期


                        C(P ) ⩾ C(P), 这表明参数增长与计算复杂度增长之间存在严格的单调递增关系. 这种累乘效应使得即使
                           ′
                    因此
                 单个参数适度增长, 多个参数协同变化也能产生指数级的复杂度提升.
                    在 RISC-V 平台的资源约束环境下, 这些参数的不同取值区间会产生显著差异的性能挑战模式. 因此, 在每个
                 参数维度上可以独立地定义高、中、低复杂度区间, 且该划分在理论上与算子复杂度增长趋势一致.
                    算子在实际硬件平台上的性能变化主要受                3  类资源限制因素共同决定: 计算能力、缓存容量与内存带宽. 当
                 输入参数逐步增大时, 算子的执行时间会经历               3  个阶段: 计算受限、缓存溢出与带宽受限, 不同阶段之间的跃迁
                 点, 即构成高、中、低复杂度区间的临界边界. 首先, 计算饱和点反映了算子乘加操作量接近                            CPU  峰值算力的区
                 间, 当参数规模较小, CPU     能够在缓存命中率高的情况下维持线性加速, 此时性能主要由计算复杂度决定, 当参数
                 进一步增大, 乘加次数接近处理器吞吐极限, 计算速率开始下降, 进入计算饱和阶段. 其次, 缓存驻留边界由                              L2  缓
                                                                       C L2  为  L2  缓存容量), 所有数据均可缓存, 访
                 存容量决定, 设单次前向传播的特征张量大小为               S T , 若   S T ⩽ C L2  (其中
                             S T > C L2  时, 部分数据需要反复在主存与缓存之间调度, 访存延迟显著上升, 性能出现“阶跃”式变
                 存延迟最小; 当
                                                                                      S T  超过带宽可支持范围
                 化. 此外, 带宽受限区对应数据吞吐量超过内存带宽上限的位置, 当算子需读写的数据量
                 时, 内存访问成为主要瓶颈, 算子执行时间呈非线性增长. 因此, 性能变化在“完全缓存可驻留→部分缓存溢出→频
                 繁带宽竞争”这     3  个阶段间形成明显的拐点.
                    基于上述分析, 我们在每个参数维度上定义              3  档复杂度区间, 使其临界点与性能跃迁位置一一对应: 低复杂度
                 区对应参数取值使得算子数据完全驻留于缓存内, 计算量远低于                     CPU  峰值, 性能近似线性; 中复杂度区对应部分
                 数据溢出缓存, 但尚未达到带宽瓶颈, 访存开销开始主导, 性能随参数缓慢下降; 高复杂度区对应参数进一步增长
                 导致缓存频繁置换、主存带宽饱和, 执行时间曲线出现明显拐点.
                    以本文实验平台       (8 GB  内存、四核  1.5 GHz RISC-V CPU、2 MB L2  缓存) 为例进行具体说明. 当      batch  从  2
                 增至  4  时, 计算量虽翻倍但仍处缓存可控范围; 当超过            8  时, 中间张量规模超过     L2  容量的两倍, 需频繁访问主存,
                 性能急剧下降, 因而      [1, 2)、[2, 4)、[4, 8) 可合理定义为低、中、高复杂度区. 对于通道数            ( in C /out C ), 当值小于
                 64  时, 单层特征图仅占用约     256 KB  内存, 可完全缓存; 当增加至      128–256  时, 占用约  0.5–1 MB, 已接近  L2  缓存上
                 限的一半, 访存延迟显著上升; 超过         256  后溢出频繁、带宽占用迅速增大, 因此定义区间              [8, 64)、[64, 256)、[256,
                 512). 对于空间维度    (H/W), 在  32×32  以下时计算稳定, 扩展至    56×56  时单张特征图近     1 MB, 达到缓存临界; 至
                 112×112  时超出缓存两倍, 主存访问成为主要瓶颈, 因而采用             [8, 28)、[28, 56)、[56, 112) 划分.
                    这些临界点均由硬件资源约束推导而来, 并在实测中对应算子性能曲线的突变位置. 因此, 不同参数的高、中、
                 低分组既符合计算复杂度的单调递增规律, 又准确反映了硬件资源利用的分层边界. 当多参数共同作用于算子时,
                 其整体复杂度划分自然继承单参数划分的合理性, 实现了理论与实验的一致. 对于不同硬件平台, 只需根据其缓存
                 容量和内存带宽重新计算相应的临界点位置, 即可获得适配该平台的分组方案.
                  2.2.2    分组设计
                    RIVdoo  采用基于区间约束的参数空间分组方法, 将关键参数维度抽象为可复用的参数池并对参数空间进行
                 分组, 每个参数池包含低、中、高这           3  个复杂度区间. 不同算子往往涉及相同类型的参数维度, 例如批量维度、通
                 道维度和空间维度在卷积算子、池化算子以及大多数逐元素算子中普遍存在. 通过将这些共性参数抽象为统一的
                 参数池, 不同算子可以直接复用相同的参数区间定义, 避免了为每个算子单独设计参数空间的重复工作, 提升了本
                 方法的可复用性.
                    表  1  展示了  RIVdoo  定义的核心参数池及其复杂度区间划分. 部分参数维度               (如批量、通道、空间维度) 定义
                 了多个版本的参数池, 这是由不同算子的计算特性差异决定的. 例如, 卷积算子由于涉及输入输出通道的乘积计
                 算, 采用标准批量     [1, 2)、[2, 4)、[4, 8) 即可触发  3 个资源压力阶段; 而计算简单的逐元素运算算子          (如  ReLU、Add)
                 数据规模较小, 需要采用扩展批量          [1, 2)、[2, 8)、[8, 16) 才能达到相同的缓存溢出和带宽饱和效果. 这种差异化设
                 计确保不同算子在各自的低、中、高复杂度配置下, 实际触发的硬件资源压力保持在相同的量级范围内.
                    表  2  展示了各算子如何从参数池中选择并组合参数, 以及不同参数组合对                      RISC-V  平台资源的压力特征. 以
   72   73   74   75   76   77   78   79   80   81   82