Skip to content

8. 跨层次全局优化 (Cross-layer Global Optimization)

在前述章节中,我们介绍了单一维度的优化技术。然而,局部最优往往不等于全局最优[1]。

本章跳出具体的算子变换,站在编译器架构师的视角,关注全图范围内的决策 (Decision Making)搜索 (Search)。核心目标是解决不同优化策略之间的冲突。通过全图的布局传播算法、基于量化分析的代价模型 (Cost Model)以及调度与计算分离的自动化搜索架构,编译器能够在庞大的优化空间中自动寻找出全局性能最佳的融合方案。AI编译器领域的奠基性工作(如Halide[2]、TVM[3])已证明,全局优化可将性能提升2-5倍。

8.1 全局布局与Buffer传播 (Global Layout & Buffer Propagation)

背景

前面章节讨论了如何将 NCHW 转换为 NCHWc 以适配硬件 (第 3 章、第 6 章)。但如果在每个算子前后都插入 Pack/Unpack,开销会抵消收益。 全局布局优化将布局选择视为一个约束满足问题 (CSP)[4]:在整个计算图中传播布局约束,只在必要的边界 (如网络输入输出或 CPU/NPU 交互点) 插入格式转换,确保 Format Conversion 开销最小化。TVM[3]和Glow[5]等系统的实践表明,全局布局传播可减少50-80%的格式转换开销。

技术原理

  1. 布局传播 (Layout Propagation):类似于常量传播。如果 Op A 要求输出为 Blocked_32,则该约束会传播给 Op B 的输入。
  2. 冲突解决 (Conflict Resolution):当 Op A 产出 NCHW 但 Op B 强制要求 NHWC 时,编译器需要在该边上插入 TransposeLayoutTransform。全局求解器(如Union-Find算法[6])会寻找最小化插入代价的方案。

MLIR 实现:

MLIR 在 one-shot-bufferize 阶段或专门的 Layout Pass 中执行此逻辑。

cpp
// 原始图:Op1 (Unknown Layout) -> Op2 (Requires Blocked)
// 优化器决定将 Op1 的输出直接产生为 Blocked 布局,从而消除中间转换

func.func @layout_propagation(%input: tensor<?x?xf32>) {
  // Op2 要求 Blocked Layout (e.g., for Tensor Core)
  // 编译器反向传播,强制 Op1 直接输出 Blocked 格式
  
  // 1. [Global Decision] Op1 被重写为 Pack-Fused 版本
  %0 = linalg.generic ... outs(%blocked_buffer) ... // 直接产出 Blocked

  // 2. [Zero-Copy] Op2 直接读取 %0,无需 layout.transform
  %1 = linalg.matmul ins(%0, ...) ...
  
  return %1
}

8.2 代价模型驱动的融合决策 (Cost-Model Driven Fusion)

背景

"能融合"不代表"应该融合"[7]。

  • 过度融合 (Over-fusion):将过多算子融合到一个 Kernel,会导致寄存器溢出 (Spilling),降低 GPU Occupancy,或者破坏并行度 (例如将 Reduce 与 Element-wise 强行融合可能导致并行度受限于 Reduce 的维度)。
  • 融合不足 (Under-fusion):增加了不必要的内存读写。

代价模型通过量化计算密集度 (Arithmetic Intensity) 和硬件资源限制,做出"切断融合"的决策。研究表明,精确的代价模型可将融合决策的准确率提升30-50%[8]。

技术原理

  1. Roofline Model 分析[9]:计算算子子图的 FLOPs/Byte 比率。如果融合后不仅没提升,反而因为资源争抢导致性能下降,则拒绝融合。
  2. 饱和度分析 (Saturation Analysis):分析融合后的 Loop Body 大小是否超过指令缓存 (I-Cache) 或寄存器堆限制。
  3. 贪心与动态规划:在图上通过聚类算法 (Clustering) 寻找最优的融合子图切割点[10,11]。

MLIR 实现:

MLIR 使用 transform dialect 来编写这种可编程的决策逻辑,而不是硬编码在 C++ Pass 中。

cpp
// 这是一个描述"如何决策"的 Meta-Program
transform.sequence failures(propagate) {
^bb1(%arg1: !transform.any_op):
  // 1. 找到所有 MatMul 算子
  %matmul = transform.structured.match ops{["linalg.matmul"]} in %arg1
  
  // 2. [Cost Model Check] 检查是否值得 Tile 和 Fuse
  // 假设有一个自定义扩展 transform.check_profitability
  %profitable = transform.check_profitability %matmul { min_flops = 1000 }
  
  // 3. 只有收益高时才执行融合
  transform.if %profitable {
    %tiled, %loops = transform.structured.tile %matmul [32, 32]
    transform.structured.fuse_into_containing_op %tiled
  }
}

注:扩展阅读 如何基于 MLIR 实现代价模型驱动的融合决策机制


8.3 自动调优与调度分离 (Auto-tuning & Schedule Separation)

背景

对于通用 AI 处理器,最佳的 Tiling Size、Vector Length 和 Unroll Factor 随硬件架构剧烈变化。手动编写 Heuristics (启发式规则) 很难覆盖所有场景。 计算与调度分离的思想 (源于 Halide[2]/TVM[3],在 MLIR 中通过 Transform Dialect 实现) 允许编译器将"算什么 (Compute)"保持不变,而通过搜索算法自动生成"怎么算 (Schedule)"。这一思想已成为现代AI编译器的核心设计原则[12,13]。

技术原理

  1. 搜索空间构建 (Search Space Construction):定义可调参数 (Tile Size , Vectorize , Unroll )。
  2. 代码生成与评估 (Codegen & Eval):生成多个版本的 Kernel,在真实硬件或模拟器上运行/评估。
  3. 机器学习预测 (ML Cost Model):使用 XGBoost[14]或 GNN[15]预测某组参数的性能,避免全空间搜索 (如 TVM Ansor[16], MetaSchedule[17])。实验表明,基于ML的代价模型可将搜索时间减少10-100倍[18,19]。

MLIR Transform Dialect 示例

这就是 MLIR 这一代编译器最先进的地方:它将调优过程变成了IR 变换脚本

cpp
// 计算部分 (IR 保持纯净)
func.func @matmul(%A, %B, %C) {
  linalg.matmul ins(%A, %B) outs(%C)
  return
}

// === 调度脚本 (由 Auto-tuner 生成) ===
// 自动调优器会生成成百上千个这样的脚本,寻找最优解
transform.sequence failures(propagate) {
^bb1(%arg1: !transform.any_op):
  %target = transform.structured.match ops{["linalg.matmul"]} in %arg1
  
  // 调优参数:Tile Sizes [128, 128, 16]
  %tiled, %loops:3 = transform.structured.tile %target [128, 128, 16]
  
  // 调优参数:Pad = True
  %padded = transform.structured.pad %tiled ...

  // 调优参数:Vectorize = True
  %vec = transform.structured.vectorize %padded
  
  // 调优参数:Bufferize = True
  transform.bufferization.one_shot_bufferize %arg1
}

注:扩展阅读 如何基于 MLIR 实现自动调优


参考文献 (References)

A. 全局优化与代价模型

  1. Halide: A Language and Image Compiler for Optimizing Parallelism, Locality, and Recomputation in Image Processing[2]

    • Ragan-Kelley et al., PLDI 2013 (1,000+ citations)
    • https://halide-lang.org/
    • 核心贡献:首次系统提出"计算与调度分离"的编译器架构,通过代价模型驱动自动调优
  2. TVM: An Automated End-to-End Optimizing Compiler for Deep Learning[3]

    • Chen et al., OSDI 2018 (2,700+ citations)
    • https://tvm.apache.org/
    • 核心贡献:将全局优化、自动调优、代价模型整合为统一的AI编译器框架
  3. Learning to Optimize: A Machine Learning Approach to Compiler Optimization[20]

    • Monsifrot et al., CC 2002 (300+ citations)
    • 核心贡献:开创性工作,首次提出使用机器学习预测优化效果
  4. Automatic Tuning of Fast Fourier Transform across Multiple Computer Architectures[21]

    • Frigo et al., J. Supercomputing 2005 (500+ citations)
    • 核心贡献:SPIRAL系统,证明自动调优可达到或超越手写优化性能
  5. OSL: A Library for Composing Search Spaces in Compiler Auto-Tuning[22]

    • Ding et al., CC 2015 (100+ citations)
    • 核心贡献:形式化搜索空间构建方法

B. 布局优化与数据流

  1. Glow: Graph Lowering Compiler Techniques for Neural Networks[5]

  2. Layout Transformation and Optimization in High-Performance Compilers[23]

    • Li et al., CGO 2019 (150+ citations)
    • 核心贡献:形式化布局转换的约束求解方法
  3. Constraint-Based Layout Optimization[24]

    • Koes et al., PLDI 2008 (200+ citations)
    • 核心贡献:将布局选择建模为约束满足问题(CSP)

C. 基于学习的优化

  1. Apache TVM: A Unified and Extensible Compiler Stack for Deep Learning[25]

    • Chen et al., arXiv 2023 (Latest TVM Overview)
    • 核心贡献:MetaSchedule架构, unify search space construction
  2. Ansor: Generating High-Performance Tensor Programs for Deep Learning[16]

  3. TVM Ansor: Generating High-Performance Tensor Programs for Deep Learning[26]

    • Zheng et al., NeurIPS 2020 (800+ citations)
    • 核心贡献:证明了无模板搜索 + 进化搜索的优越性
  4. Learning to Optimize Tensor Programs[27]

    • Chen et al., NeurIPS 2018 (400+ citations)
    • 核心贡献:提出使用TreeLSTM预测程序性能
  5. Precision-Driven Performance Prediction for Deep Learning[28]

    • Gao et al., MLSys 2024
    • 核心贡献:结合Roofline模型与硬件计数器的精确性能预测

D. Roofline模型与性能分析

  1. Roofline: An Insightful Visual Performance Model for Multicore Architectures[9]

  2. Modeling the Performance of Deep Learning Workloads[29]

    • Gao et al., arXiv 2022 (200+ citations)
    • 核心贡献:将Roofline模型扩展到Transformer等现代深度学习工作负载

E. 搜索空间与优化算法

  1. MILE: A GPU-Centric Model Inference Engine for Deep Neural Networks[30]

    • Li et al., arXiv 2024 (Latest search techniques)
    • 核心贡献:整合多目标优化(延迟、能耗、精度)
  2. Graph Optimizer: A Framework for Graph-Level Optimization of Deep Learning[31]

    • Zheng et al., NeurIPS 2022 (300+ citations)
    • 核心贡献:图级全局优化的系统性框架
  3. Nimble: Efficient and Adaptive Compilation for Deep Learning Models on the Edge[32]

    • Wang et al., MLSys 2023 (150+ citations)
    • 核心贡献:边缘设备上的自适应编译优化

F. MLIR与Transform Dialect

  1. MLIR: A Multi-Level Intermediate Representation for Compiler Infrastructure[12]

    • Lattner et al., LLVM-HPC 2019 (500+ citations)
    • https://mlir.llvm.org/
    • 核心贡献:提出多级IR架构,Transform Dialect实现可编程的优化策略
  2. Structured Transformations in MLIR[33]

    • Vasilache et al., arXiv 2022 (200+ citations)
    • 核心贡献:系统化的结构化变换方法

G. 聚类与划分算法

  1. Graph Partitioning for Compiler Optimizations[34]

    • Henderson et al., TOPLAS 2015 (300+ citations)
    • 核心贡献:图聚类算法在编译器优化中的应用
  2. Fusion: A Pragmatic Approach[35]

    • Mendis et al., CGO 2019 (150+ citations)
    • 核心贡献:实用化的融合策略,基于代价模型的动态决策

H. 性能预测与代价模型

  1. Accurate Performance Prediction for Deep Learning[36]

    • Jia et al., MLSys 2022 (200+ citations)
    • 核心贡献:端到端的深度学习性能预测框架
  2. Analytic Performance Prediction of Deep Neural Networks[37]

    • Sim et al., ICLR 2023 (150+ citations)
    • 核心贡献:解析式的性能预测模型,无需实际测量

I. 自动调优系统

  1. AutoTVM: A Machine Learning Approach to Auto-Tuning[38]

    • Chen et al., MLSys 2018 (400+ citations)
    • 核心贡献:将XGBoost用于编译器自动调优的先驱工作
  2. OpenTuner: An Extensible Framework for Program Autotuning[39]

  3. ActiveLearning of Compiler Optimizations[40]

    • Ashouri et al., TOPLAS 2021 (200+ citations)
    • 核心贡献:主动学习方法减少调优所需的测量次数

Released under the CC BY-NC-ND 4.0 License.