使用电子图专门研究 Python

本文介绍了一个逐步优化数值计算的编译器系统,包含多个层级和相关技术:

  • 技术探索历程:从基本 MLIR 概念开始,逐渐深入到内存管理、线性代数和神经网络实现,每层都增加了新的计算表达和优化能力,现在准备构建第一个 Python 表达式的玩具编译器。
  • 使用 egglog 库进行项重写和优化

    • 平等饱和和 E-Graphs:回顾平等饱和和 E-Graphs 的关键概念,如通过 e-graph 解决相序问题,在线性代数中应用等式身份进行优化,e-graph 是一种紧凑表示等价表达式的数据结构。通过 egglog 库的示例展示了基本的简化操作,包括定义表达式模型、应用重写规则和可视化 e-graph。
  • 基础层

    • 表达式模型:以 Python 的 dataclasses 实现表达式模型,包括常量、变量、操作等类型。
    • 内置函数:提供 NumPy 风格的数学函数接口,方便用户使用并进行优化。
    • Term IR:提供用于项重写和平等饱和的中间表示,包含成本模型,用于指导优化引擎选择最有效的转换。
  • 转换层

    • 符号解释:通过interpret函数将 Python 函数转换为 IR 表示,便于应用优化。
    • IR 转换:将 IR 转换为 MLIR,涉及 AST 解析、函数映射和 MLIR 生成等步骤。
  • 优化层

    • 基本简化模块:实现基本的数学重写规则,如项转换、恒等、结合律等,用于简化表达式。
    • 三角化简模块:提供三角函数的化简规则,优化涉及三角函数的计算。
    • Egglog 优化器:整合重写规则,提供表达式提取、优化管道和 MLIR 生成等功能,支持规则的并行和顺序组合。
    • MLIR 生成:采用多遍翻译策略将优化后的表达式树转换为可执行的 MLIR 代码,包括表达式翻译、MLIR 方言使用和智能缓存机制。
  • MLIR 后端

    • 目标支持:支持 OpenMP 和基本循环两种编译目标,适应不同的执行需求。
    • 编译过程:包括常见初始转换、目标特定的降低和最终 LLVM IR 生成等阶段,通过MLIRCompiler类进行协调。
  • LLVM 运行时

    • LLVM 初始化:缓存初始化 LLVM 组件,设置目标架构和执行引擎。
    • 模块编译:提供直接模块编译和 IR 字符串编译两种方式,将代码编译为可执行模块。
  • JIT 引擎

    • 作为编译器的协调者,管理从 Python 函数到可执行机器代码的整个编译过程,包括前端编译、后端编译和完整的 JIT 编译。
    • 处理 LLVM 相关任务,如初始化、加载 OpenMP 运行时和创建执行引擎。
  • 调度器(Dispatcher)

    • 作为用户接口,将 Python 函数转换为优化的向量化内核,通过@kernel装饰器实现。
    • 管理编译后的函数生命周期,包括缓存调用和处理输入输出数组。

此外,还提供了多个外部资源链接,涵盖了 egglog 相关的研究和应用。

阅读 7
0 条评论