Page 104 - 《软件学报》2024年第6期
P. 104
2680 软件学报 2024 年第 35 卷第 6 期
块和循环顺序策略.
5.2 程序开销的动态测量
动态开销测量针对优化所在平台确定计算、访存和特殊指令开销的权重系数, 并传入优化分析模型来得到最
终的执行时间表达式. 为此, AutoConfig 维护了一个动态测量的程序集合, 其中的每个实例程序都体现了某一种程
序特性. 该集合允许用户进行删改和添加, 使得用户可以根据其优化需求来调整程序集合. AutoConfig 提供的集合
能够覆盖大部分与性能有关的 MLIR 操作, 并且这些动态测量的示例程序都源自实际的测试和优化片段. 这些示
例程序的种类和迭代次数都是可配置的, 用户可据此定制合适的示例, 确保得到的测量值既准确又可靠, 从而避免
随机误差的影响.
本节以 Broadcast 向量化算法的开销表示为例阐述动态测量流程, 涉及的测量开销如表 3 所示. 其中包括访存开
销 Cost Memory [vs] 、SIMD 计算开销 Cost FMA [vs] 和表示广播指令的特定操作开销 Cost Broadcast [vs] , 它们分别对应了优
化分析模型的 3 项权重系数 λ Arith 、 λ Memory 和 λ SpecIns . 具体来说, 在 SIMD 浮点计算场景中, λ Arith 是单条 FMA 指令
λ SpecIns , 在对 Broadcast 向量化算法的分析中, 等价于单条广播
的执行时间, λ Memory 则是单条访存指令的执行时间. 而
209
操作指令的执行时间, 因为该优化算法涉及的特殊指令只有广播指令. 其他优化算法中特殊指令也同理.
表 3 Broadcast 向量化算法的开销表示
开销表示 开销描述 示例程序描述
Cost Memory [vs] 将 vs 个元素进行访存操作 MemCopy示例程序的执行时间
Cost FMA [vs] vs个数据进行融合乘加操作的开销 FMA示例程序与MemCopy示例程序执行时间的差分
Cost Broadcast [vs] vs个数据进行广播操作的开销 BroadcastFMA示例程序与FMA示例程序执行时间的差分
为了量化这些开销, 本节使用动态测量程序集合中的特定子集在多个目标硬件平台上进行了实验. 其中访存
开销的测量选择内存拷贝示例程序, 其中包括使用向量方言的内存加载和存储指令. FMA 开销的测量选择了 FMA
示例程序, 该程序结合了访存指令和融合乘加指令. 表示广播指令的特殊指令开销的测量选择了 BroadcastFMA
的示例程序, 其中包括访存指令、广播指令和融合乘加指令. 以上示例程序均使用 2 的 20 次方作为计算负载尺
寸, 计算负载迭代 10 000 次, 通过测量总的执行时间来确定 Cost Memory [vs] 、 Cost FMA [vs] 和 Cost Broadcast [vs] 的量化
数值.
表 4 是在 AVX512 平台下的实验测量结果, 从中可以看出, 访存指令开销 Cost Memory [vs] 平均为 FMA 指令开
销 Cost FMA [vs] 和表示广播指令的特定操作开销 Cost Broadcast [vs] 的 20 倍左右. 在同样的硬件平台下, 这里得出的开
λ SpecIns 之间的比值是一致的, 因此这些数据可以为优化分析模型提供权重数
销比值与权重系数 λ Arith 、 λ Memory 和
值, 进而分析出整体算法的性能表现, 并选择合适的算法和配置进行代码生成.
表 4 开销表示的测量结果 (ms/每 10 000 次迭代)
测量开销 vs=1 vs=16 vs=32 vs=64 vs=128 vs=256
Cost Memory [vs] 12 028.5 1 648 1 751.5 1 779.5 1 989.5 2 345.5
Cost FMA [vs] 644 70 142 83 102 52
Cost Broadcast [vs] 738 175 204 303 154
6 实验设计、结果和分析
本节面向实际的深度学习计算负载场景, 在 AVX512 和 ARM Neon 两种 SIMD 平台上, 对 AutoConfig 的参数
配置及优化算法的选择进行探究, 并将基于分析模型的代码生成策略与 TVM 的自动调优策略进行跨平台的性能
比较. 其中, 在第 6.2 节会探究向量化长度参数的选取对优化性能的影响, 指出基于不同硬件平台的特性来确定参
数配置的意义. 在第 6.3 节会利用硬件信息和动态开销数据来计算不同算法的预测加速比, 以验证 AutoConfig 的
算法选择是否准确. 在第 6.4 节将 AutoConfig 与基于自动调优策略的 TVM 进行跨平台的代码生成性能比较.