Page 98 - 《软件学报》2024年第6期
P. 98
2674 软件学报 2024 年第 35 卷第 6 期
( )
1. function MatchAndRewrite op
2. // 以可配置参数 vs 为例, 设置可选配置数值
3. configRange ← setRange(16,32,64,128,256)
4. // 设置开销函数子集, 默认使用开销函数全集
5. costSet ← setCostSet(BroadcastCost,FMACost,MemoryCost,...)
6. // 定义优化算法重写模式 1
7. pat1 ← rewritePattern1(op,...)
8. // 分析优化算法构造分析规则 1
9. rule1 ← func(op,...)
10. // 初始化分析模型 1
11. model1 ← initAnalyModel(rule1,costSet,configRange)
12. // 定义优化算法重写模式 2
驱动器, 负责将每对重写模式和分析模型进行注册. AutoConfig
13. pat2 ← rewritePattern2(op,...)
14. // 分析优化算法构造分析规则 2
15. rule2 ← func(op,...)
16. // 初始化分析模型 2
17. model2 ← initAnalyModel(rule2,costSet,configRange)
18. // 初始化 AutoConfig 对象
19. autoConfig ← initAutoConfig()
20. // 将分析模型 1 和重写模式 1 注册到 AutoConfig 对象中
21. autoConfig.register(model1,pat1)
22. // 将分析模型 2 和重写模式 2 注册到 AutoConfig 对象中
23. autoConfig.register(model2,pat2)
24. // AutoConfig 对象选择合适的算法和配置进行代码生成
25. autoConfig.populate()
26. end function
进一步地, 开发者需针对不同优化算法定义相应的重写模式和分析模型. 这些重写模式以 MLIR 为中间表示,
利用其多层级的 MLIR 方言来丰富语义表达. 优化分析模型结合分析规则、动态测量程序集合以及可配置参数的
取值范围, 共同定义了编译优化的配置空间以供编译优化过程中的搜索和决策使用. 在用户接口方面, 本文提出的
方法使用 rewritePattern 函数实现可配置的重写模式, 并使用 lambda 表达式来约定优化分析模型. 其中, rewritePattern
函数接受目标操作以及可配置参数, 并在函数体内使用各个操作的构造函数实现编译优化的代码生成逻辑. 同时,
为了构建分析模型, lambda 表达式通过其捕获列表传递动态测量程序集合, 通过参数列表传递可选配置数值集合.
该模型在 lambda 函数体内部完成构建, 详细的构建过程将在本文的第 4 节中展开讨论.
在定义了多种优化算法的重写模式和分析模型之后, 开发者需要初始化一个 AutoConfig 对象, 这一对象作为
对象的 populate 函数负责为每个重写模式选择最
优的配置项, 然后对不同的重写模式进行比较和评估, 最终选择出执行开销最小的重写模式和最佳配置项, 将其整
合进编译优化 Pass 及其工具链.
3.4 AutoConfig 的生态集成
本文将 AutoConfig 集成到了 Buddy Compiler 中, 展示了 AutoConfig 对深度学习编译器的适配能力及其在优
化深度学习计算任务方面的调优能力. Buddy Compiler 是一个基于 MLIR 的特定领域编译器, 它致力于打造面向
深度学习领域的软硬件协同编译生态. 如图 2(b) 所示, Buddy Compiler 中的多级中间表示编译工具 buddy-opt 会