pyasc 架构详解:Python 算子编程到 Ascend C 代码生成的五模块流水线 pyasc 架构详解Python 算子编程到 Ascend C 代码生成的五模块流水线【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc导读本文基于 CANN pyasc 开源仓库的架构文档docs/architecture_introduction.md系统讲解 pyasc 的模块化架构一个用 Python 编写算子、最终在昇腾 AI 处理器Ascend NPU上以原生性能运行的编译与运行框架。pyasc 将整体划分为编译和运行模块、Python 前端模块、AST 转 ASC-IR 模块、ASC-IR 定义模块、Ascend C 代码生成模块五大核心模块前三个可统称为前端模块后两个统称为后端模块。读完本文你将理解asc.jit装饰器如何拉起整条编译链、Python 接口如何与 Ascend C 一一对应、AST 如何经过 ASC-IR基于 MLIR 的中间表示最终变成可执行 Kernel 二进制以及如何通过编译参数、环境变量与运行时配置掌控整个流程。pyasc 模块架构Python 界面、扩展 DialectASC-IR 与 EmitAsc-IR、Ascend C、基础组件四层结构pyasc 核心数据流从 asc.jit 修饰的 Python 代码经 AST 转 ASC-IR、代码生成、毕昇编译器编译到 runtime 运行输出一、整体架构前端与后端的划分pyasc 项目整体划分为五个核心模块模块之间的关系可参考上文核心模块关系图docs/figures/pyasc_flow.png编译和运行模块负责 JIT 拉起、编译流程组织、Kernel 加载与执行是整个框架的调度中枢Python 前端模块提供与 Ascend C API 一一对应的 Python 编程接口AST 转 ASC-IR 模块将 Python 抽象语法树AST转换为 ASC-IR 中间表示ASC-IR 定义模块基于 MLIR 定义 Ascend C 的方言DialectAscend C 代码生成模块将 ASC-IR 翻译为 Ascend C 代码并完成最终编译。其中编译和运行模块、Python 前端模块、AST 转 ASC-IR 模块可统称为前端模块ASC-IR 定义模块、Ascend C 代码生成模块可统称为后端模块。这一划分在仓库目录上体现得非常清晰前端代码位于python/目录后端代码位于include/与lib/目录。1. 前端模块目录结构├── python # python前端代码 │ ├── asc ## 用户可见的python包 │ │ ├── _C ### 占位目录用于存储后端自动生成的相关py文件 │ │ ├── codegen ### 解析python语法树生成后端mlir │ │ ├── common ### 公共代码例如python版本兼容性接口 │ │ ├── language ### 用户编写算子kernel代码所需要的接口尽量与Ascend C保持一致 │ │ │ ├── adv #### 高阶API内部文件应该与AscendC高阶API一一对应 │ │ │ ├── basic #### 基础API内部文件应该与Ascend基础API一一对应 │ │ │ ├── core #### 核心数据结构和枚举以及python侧新引入的语义 │ │ │ └── fwk #### TPipe/TQue等框架相关的文件 │ │ ├── lib ### 对于c侧库文件和接口的python封装 │ │ │ ├── host #### 对于Ascend C的Host侧接口的封装 │ │ │ └── runtime #### 对于acl runtime接口的封装 │ │ └── runtime ### python前端编译和运行代码 │ ├── src ## pybind相关代码cpp格式 │ └── test ## python格式的测试用例集 │ ├── generalization ### 泛化测试用例一类接口创建一个端到端的用例进行泛化测试使用npu或model执行校验结果正确性 │ ├── kernels ### 基础测试用例一类接口创建一个端到端的用例进行基础测试使用npu或model执行校验结果正确性 │ └── unit ### 单元测试用例应该尽量覆盖所有的python api能够正常生成合法的AscendC代码即可。 │ ├── codegen #### 测试python/asc/codegen目录下的接口 │ ├── language #### 测试python/asc/language目录下的接口 │ ├── lib #### 测试python/asc/lib目录下的接口 │ └── runtime #### 测试python/asc/runtime目录下的接口对照仓库实际内容python/asc/language 下正是adv/高阶 API如 Matmul、softmax 等、basic/基础 API如向量运算、数据搬运、标量操作、core/数据结构与枚举、fwk/TPipe/TQue 等框架类四个子包python/asc/codegen 存放语法树解析逻辑python/asc/runtime 存放编译与运行代码jit.py、compiler.py、launcher.py等python/asc/lib 下则有host/与runtime/两个封装目录与文档描述完全对应。2. 后端模块目录结构├── include # 后端头文件和td文件定义 │ └── ascir ## ASC-IR定义头文件和td文件 │ ├── API ### API Type定义 │ ├── Dialect ### 方言定义 │ │ ├── Asc #### Asc方言定义和Pass │ │ │ ├── IR ##### Asc方言IR定义 │ │ │ ├── Transforms ##### Asc相关Pass │ │ │ └── Utils ##### 公共实现 │ │ ├── EmitAsc #### 方言转换模块定义 │ │ │ └── IR ##### 方言转换模块IR定义 │ │ └── Utils ### 公共实现 │ └── Target ### 代码生成模块 │ └── Asc #### Ascend C代码生成模块 │ ├── Adv ##### 高阶API │ ├── Basic ##### 基础API │ ├── Core ##### 核心数据结构和枚举 │ ├── External ##### MLIR方言代码生成 │ └── Fwk ##### TQue等框架类 ├── lib # 后端头文件和td文件实现以下目录与include目录对应 │ ├── Dialect │ │ ├── Asc │ │ │ ├── IR │ │ │ ├── Transforms │ │ │ └── Utils │ │ └── EmitAsc │ │ └── IR │ ├── TableGen ## tablegen文件实现 │ │ └── include │ └── Target │ └── AscendC │ ├── Adv │ ├── Basic │ ├── Core │ ├── External │ └── Fwk后端实现同样与仓库目录一一对应include/ascir/Dialect/Asc 下定义了 Asc 方言 IR.td定义文件与 TransformsPass 列表见 lib/Dialect/Asc/Transforms如HoistTensorAllocation.cpp、GenerateBoilerplatePass.cpp、LegalizeKernelArgs.cpp等lib/Target/AscendC 下则按Adv/、Basic/、Core/、External/、Fwk/五个子目录组织 Ascend C 代码生成的实现。二、编译和运行模块asc.jit 驱动的 JIT 流水线1. 模块功能概述编译和运行模块通过JITJust-In-Time即时编译机制拉起。开发者需要导入项目顶层模块asc用装饰器asc.jit修饰核函数和Device 侧执行函数即可拉起整个编译和运行流程核函数Kernel 函数由 Host 侧发起调用、且被asc.jit修饰的函数Device 侧执行函数被asc.jit修饰的、除核函数之外的函数在 Device 侧被调用。关于核函数的标准定义可参考《Ascend C 编程指南》中的核函数章节。在 pyasc 中定义 Kernel 函数时通过asc.jit的小括号()传入编译参数执行 Kernel 函数时通过中括号[]传入运行时配置核数和 Stream注意Device 侧执行函数传递的 jit 编译参数是无效的仅 Kernel 函数生效。这一机制的源码入口在 python/asc/runtime/jit.pyJITFunction同时持有了codegenFunctionVisitor、compilerCompiler、launcherLauncher三类组件__getitem__方法解析kernel[...]中括号内的运行时配置_run方法则依次完成参数类型推导get_arg_type、编译选项提取extract_kwargs、编译与缓存_compile_and_cache以及最终启动_run_launcher。2. 编译流程与产物编译模块通过调用AST 转 ASC-IR、Ascend C 代码生成模块接口将 Python 前端代码转换为 Ascend C 代码并根据开发者配置的编译参数组装编译命令基于毕昇编译器生成 NPU 上可执行的 Kernel 文件。如需查看编译过程中生成的中间产物可设置环境变量PYASC_DUMP_PATH${dump_path}指定文件保存路径编译完成后切换到该路径查看。从 python/asc/runtime/compiler.py 的实现可以看到该目录下会依次落盘多个关键中间文件中间文件内容codegen.mlirPython AST 转换生成的原始 ASC-IRMLIR 文本ascir.mlir经 Pass 优化后的 ASC-IRascendc.cpp翻译得到的 Ascend C 源码input.ccebinary.o毕昇编译器生成的 Kernel 二进制编译过程中实际执行的 Pass 序列也在该文件中定义降级阶段lowering依次执行privatize_func、内联、符号 DCE、规范化、input_output_tensor、hoist_tensor_allocation、materialize_tensor、unify_pipe等 Pass后处理阶段postprocessing则执行declare_py_struct、generate_boilerplate、define_cube_only仅纯 Cube 模式、legalize_kernel_args、detect_kernel_type、detect_enable_debug等 Pass。3. JIT 编译缓存编译模块提供JIT 编译缓存功能缓存机制能够存储和复用已经编译的 Kernel 二进制避免重复编译从而提高编译效率和程序执行速度。JIT 编译缓存的影响因素包括编译选项compile_optionsKernel 参数运行时参数类型、ConstExpr 常量等全局变量由asc.jit修饰的 Kernel 函数代码本身。在源码层面python/asc/runtime/jit.py 的_gen_cache_factors将 codegen 选项、编译选项、常量表达式、参数类型、函数名拼接成缓存因子再由 python/asc/runtime/cache.py 的缓存管理器计算内存缓存键与文件缓存键实现两级缓存命中内存缓存直接复用CompiledKernel否则查询文件缓存仍未命中才真正编译并将二进制写入缓存。相关的环境变量配置如下环境变量含义默认值PYASC_HOME${home_path}缓存根目录当前用户目录PYASC_CACHE_DIR${cache_dir}具体缓存目录${home_path}/.pyasc/cache若需要强制开启编译跳过缓存可设置编译参数always_compileTrue对应 python/asc/runtime/compiler.py 中CompileOptions.always_compile字段。4. 运行流程运行模块解析开发者通过[]传递的运行时配置和 Kernel 函数的输入输出参数调用 Ascend C Runtime 接口加载编译模块生成的 Kernel 二进制并执行 Kernel 函数。对于 Kernel 函数的输入输出位于 Host 侧的场景运行模块会自动完成 Host 侧和 Device 侧之间的数据拷贝在 python/asc/runtime/launcher.py 的launch_kernel中通过MemoryHandle.copy_to_device()/copy_from_device()完成并在启动前通过check_memory_overflow校验 UB/L1/L0A/L0B/L0C/BT 各内存区是否超限。同时为了便于优化算子性能运行模块支持开发者使用msprof op 工具采集 profiling 数据生成内存热力图和仿真流水图等。launcher 中的MsprofLauncher负责记录系统周期时间戳并通过msprof_report_compact_info、msprof_report_api上报 Kernel 的任务信息与耗时。5. 编译参数和运行参数说明编译模块仅支持开发者设置以下参数若未设置参数kernel_type将由框架自动推导其余参数项采用默认值。参数名含义取值范围kernel_type核函数 kernel 类型asc.runtime.config.KernelType中支持类型opt_level毕昇编译器优化级别0, 1, 2, 3auto_sync毕昇编译器是否开启自动同步True/Falseauto_sync_log保存毕昇编译器同步插入信息的文件开发者自定义文件路径matmul_cube_only是否纯 Cube 模式只有矩阵计算True/Falsealways_compile是否开启强制编译True/False上述参数在 python/asc/runtime/compiler.py 的CompileOptions数据类中均有对应字段。其中kernel_type的取值范围在 python/asc/runtime/config.py 的KernelType枚举中定义包括AIV_ONLY、AIC_ONLY、MIX_AIV_HARD_SYNC、MIX_AIC_HARD_SYNC、MIX_AIV_1_0、MIX_AIC_1_0、MIX_AIC_1_1、MIX_AIC_1_2共 8 种类型分别对应纯向量核、纯 Cube 核以及各种混合AIV/AIC 软硬同步与不同配比模式。当kernel_type未显式指定时编译器会在postprocess_module中依据 IR 上的 kernel_type 属性自动推导mixed且非纯 Cube推导为MIX_AIC_1_2vector推导为AIV_ONLYcube推导为AIC_ONLY。从源码看opt_level会被转换为毕昇编译器的-O{n}参数默认-O3auto_syncTrue时会追加--cce-auto-sync及-mllvm -api-deps-filter参数并可选输出-cce-auto-sync-logmatmul_cube_onlyTrue时会追加define_cube_onlyPass 并影响 kernel 类型的自动推导。运行模块支持开发者通过[]传递如下运行时配置参数名含义取值范围是否必选项core_num运行核数不大于硬件实际可用核数是streamKernel 执行流—否对应 python/asc/runtime/launcher.py 中的LaunchOptions数据类core_num缺省时使用当前平台全部可用核通过rt.device_info查询且必须为正整数stream缺省时使用当前 Streamrt.current_stream()。6. 编译运行模块调用示例import asc import asc.runtime.config as config import asc.lib.runtime as rt asc.jit(kernel_typeconfig.KernelType.AIC_ONLY) def kernel_func(*params): do_something def global_func(*global_params): do_something kernel_params xxx kernel_func1, rt.current_stream() do_something仓库 examples/01_add/add.py 提供了完整的端到端示例vadd_kernel使用asc.jit修饰作为核函数内部通过asc.get_block_idx()按核切分数据、asc.LocalTensor分配片上缓冲区、asc.data_copy搬运数据、asc.set_flag/asc.wait_flag同步流水线、asc.add完成向量加法Host 侧vadd_launch通过vadd_kernelUSE_CORE_NUM, rt.current_stream()以 8 核启动 Kernel。运行方式为python examples/01_add/add.py -r Model # 使用 Model 仿真后端 python examples/01_add/add.py -r NPU # 使用 NPU 硬件后端三、Python 前端模块与 Ascend C 1:1 对应的编程接口1. 模块功能概述Python 前端模块提供与 Ascend C API 接口一一对应的 Python 编程接口旨在向 Python 用户提供完备的芯片开发能力。与 Ascend C 的接口分类相同Python 前端接口分为高阶 API、基础 API、核心数据结构和枚举、同步和内存管理框架类接口四类位于 python/asc/language 目录下。以 python/asc/language/init.py 的导出内容为例基础 APIbasicadd、mul、copy、data_copy、set_flag/wait_flag、reduce_sum、cast、duplicate、gather等向量计算、数据搬运、标量操作接口高阶 APIadvMatmul、softmax、exp/log/tanh等算子级接口核心数据结构和枚举coreLocalTensor、GlobalTensor、GlobalAddress、ConstExpr、DataTypefloat16/float32/int32等、各类枚举TPosition、HardEvent、CMPMODE等、array、range同步和内存管理框架类接口fwkTPipe、TQue、TQueBind、TBuf、TBufPool。这些接口在asc顶层包中直接可用见 python/asc/init.py 的__all__导出用户编写算子代码时无需逐层 import。2. Python 接口使用注意事项1数据类型由于 Python 变量本身无类型需要指明类型时可使用asc.int64或asc.float32等。函数或属性支持的数据类型与 Ascend C 一致。x_local in_queue_x.alloc_tensor(asc.float32) # 表示从Que中分配数据类型为float32的Tensor2常量表示在接口中某些参数需要作为常量表达式传递可使用asc.ConstExpr[origin_type]泛型标记会在最终翻译生成的 Ascend C 代码中生效表明参数为常量。例如以下代码中BUFFER_NUM和TILE_LENGTH为常量def vadd_kernel(x: asc.GlobalAddress, y: asc.GlobalAddress, z: asc.GlobalAddress, block_length: int, BUFFER_NUM: asc.ConstExpr[int], TILE_LENGTH: asc.ConstExpr[int]):ConstExpr的实现位于 python/asc/language/core/constexpr.py其在 JIT 编译时会进入编译时参数路径参与 IR 生成与缓存键计算而不是作为运行时参数传递参见上文jit.py中split_args对runtime_args与constexprs的拆分。3枚举类型通过asc.枚举类.枚举值的方式使用枚举类型的值避免使用未定义的枚举值防止运行时错误。以枚举类型Position中的枚举值VECIN为例in_queue_x asc.TQue(asc.TPosition.VECIN, BUFFER_NUM)4参数映射Python 接口与 Ascend C 接口 1:1 对应。对于接口参数按照以下顺序映射运行时必选参数 → 模板必选参数 → 运行时可选参数 → 模板可选参数。Ascend C 接口定义如下tempate typename T, bool tplRequire, bool tplOptional false __aicore__ inline void Func(const LocalTensorT rtRequire, int32_t rtOptional128);按照上述参数顺序规则对应的 Python 前端接口定义如下def func(rt_require: LocalTensor, tpl_require: bool, rt_optional: int 128, tpl_optional: bool False): ...对于GlobalTensor和LocalTensor的数据类型将DataType作为 Tensor 的成员变量x_local asc.LocalTensor(asc.float32, asc.TPosition.VECIN, 0, TILE_LENGTH * BUFFER_NUM) # 类型作为第一个变量传入四、AST 转 ASC-IR 模块Python 语法树到 MLIR 的桥接1. 模块功能概述本模块主要完成将 Python ASTAbstract Syntax Tree抽象语法树转换为 ASC-IRAscendC-IRAscend C 中间表示的功能。本模块由 JIT 编译模块调用输入 Python 源码及对应 AST 结构内容、参数、变量和相关配置等在模块内进行转换处理生成对应的 ASC-IR作为后续 Ascend C 代码生成模块的输入。本模块的核心是AST 语法树遍历根据不同的 AST 节点类型调用不同的处理接口生成对应的 IR 代码行并合理控制生成整体 IR 的结构。由于 ASC-IR 定义及创建 IR 的接口均在 C 侧因此本模块利用pybind11 机制为 ASC-IR 生成接口提供对应 Python 调用接口同时本模块使用TableGen 工具自动生成 Ascend C 相关的 pybind 绑定定义。模块入口代码文件为 python/asc/codegen/function_visitor.py其FunctionVisitor继承自 Python 标准库ast.NodeVisitor按 AST 节点类型分发处理。TableGen 自动化生成 pybind 绑定的相关实现位于 lib/TableGenGenPybindDefs.cpp、GenPybindDefsTypes.cpp、GenAPITypedefs.cpp等生成结果落入 python/asc/_C 目录供 codegen 与编译器调用。2. 约束1不支持的 Python 语法结构列表请参见 docs/python_syntax_support.md 中的不支持的语法接口列表章节。主要包括嵌套函数Nested Functions、global语句、核函数内的return语句不支持从核函数直接返回但支持核函数调用 Device 侧执行函数并获取其返回值等。2参数约束支持的输入参数类型布尔类型bool、整数类型int、浮点数类型float、NumPy 标量np.generic、NumPy 数组np.ndarray、模拟张量MockTensor、模拟值MockValue、张量torch.Tensor。不支持的输入参数类型不在上述支持范围内的参数类型均不支持比如字符串str、元组tuple、列表list和字典dict等。不支持的类型是指无法作为运行时参数但是可通过asc.ConstExpr作为编译时参数传递用于assert和其他编译时语句。模拟张量MockTensor、模拟值MockValue一般用于调试开发不在实际代码中使用。上述参数类型判定逻辑在 python/asc/runtime/jit.py 的JITFunction.get_arg_type中实现bool/int/float映射为PlainArgTypenp.ndarray/torch.Tensor维度大于 0映射为PointerArgType指针参数np.generic/零维torch.Tensor映射为标量参数Struct映射为StructArgType其余类型抛出TypeError。这与文档的约束清单完全一致。3函数使用约束仅支持Python 原生内置函数当前允许使用的范围为dict、float、int、isinstance、issubclass、len、list、range、repr、str、tuple、type。不支持任何非上述指定的函数包括 Python 标准库函数及第三方库函数。五、ASC-IR 定义模块基于 MLIR 的 Asc 方言1. 模块功能概述ASC-IR 是基于MLIRMulti-Level Intermediate Representationmlir.llvm.org定义的 Dialect。其设计目标包含实现 1:1 映射 Ascend C API可直接由 Python 代码通过 JIT 编译生成 Ascend C 代码。ASC Dialect 由Type、Attribute、Interfaces、Operation构成具体说明如下Type类型定义继承 MLIR 的TypeDef基类实现了LocalTensor、GlobalTensor、TQue、TBuf等类型的定义。Attribute属性定义包含 Ascend C 中关于Layout、Format、Event枚举类型属性等的定义。Interfaces接口定义包含API Interface和Type Interface。API Interface 为所有 Operation 类提供统一接口例如getAPIName接口获取 Ascend C API 的函数名、getComment接口获取 IR 的注释等Type Interface 提供基础数据类型的统一接口。Operation操作定义继承 MLIR 的Op基类主要提供APIOp类对应的 Ascend C API 操作包含TPipe、TQue、VecOp、SetFlag、WaitFlag以及高阶 API 接口的操作的定义。本模块的主要功能是将 Python 前端接口的参数列表映射成 Operation 类的参数arguments。映射规则类型模板参数不需映射在 IR 中非类型模板参数放在函数参数后参数的整体顺序为运行时必选参数 → 模板必选参数 → 运行时可选参数 → 模板可选参数参数名建议和 Ascend C API 保持一致。2. 目录结构说明详见本文后端模块目录结构说明即 include/ascir 与 lib/Dialect 目录。从仓库实现看include/ascir/Dialect/Asc/IR 下的.td文件TableGen 定义即 Type/Attribute/Interfaces/Operation 的声明来源配套实现位于 lib/Dialect/Asc/IRTypes.cpp、Attributes.cpp、Ops.cpp、OpInterfaces.cpp、TypeInterfaces.cpp等。3. 约束ASC-IR 中的 Operation 类命名规则为Dialect 下划线 Ascend C 类名 成员函数例如asc.Matmul.set_tensor_a之类的命名方式保证 IR 操作与 Ascend C API 的可追溯对应关系。六、Ascend C 代码生成模块ASC-IR 到 Ascend C 的翻译1. 模块功能概述本模块的核心功能是实现 MLIR 中间表示ASC-IR到 Ascend C 代码的转换逻辑。本模块主要负责解析 ASC-IR 中的各种结构并将其映射为等价的 Ascend C 语法结构如基础 API 接口、高阶 API 接口。从仓库实现看翻译入口位于 lib/Target/AscendC/Translation.cpp 的ir_to_ascendc接口即 python/asc/runtime/compiler.py 中Compiler.run_translation调用translation.ir_to_ascendc(mod)所对应其通过 lib/Target/AscendC/CodeEmitter.cpp 与 lib/Target/AscendC/EmitAsc.cpp 等组件完成对各类 IR 结构的解析与 Ascend C 代码文本的拼接。2. 目录结构说明详见本文后端模块目录结构说明。代码生成模块的按 API 分类实现分散在 lib/Target/AscendC 下Adv/高阶 API 的代码生成Matmul.cpp、Activation.cpp、Math.cpp、Normalization.cpp等Basic/基础 API 的代码生成DataCopy.cpp、VecVconv.cpp、VecReduce.cpp、Scalar.cpp、Reg.cpp等Core/核心数据结构与枚举的代码生成LocalTensor.cpp、GlobalTensor.cpp、ShapeInfo.cppExternal/MLIR 方言arith、func、math、memref、scf、emitc的代码生成Fwk/TQue.cpp、TBuf.cpp等框架类接口的代码生成。3. 端到端流程串联将五个模块串联起来一次完整的 pyasc 算子开发与运行流程如下开发者编写 Python 算子代码用asc.jit修饰核函数与 Device 侧执行函数Python 前端模块提供接口调用核函数kernelcore_num, stream触发 JIT编译和运行模块拉起FunctionVisitor遍历 Python AST通过 pybind 接口创建 ASC-IRAST 转 ASC-IR 模块生成的 ASC-IR 经 MLIR Pass 优化ASC-IR 定义模块提供方言与 Pass再经ir_to_ascendc翻译为 Ascend C 源码Ascend C 代码生成模块编译模块基于毕昇编译器将 Ascend C 源码编译为 NPU 可执行二进制运行模块通过 Runtime 接口加载并执行Host 侧数据自动拷贝到 Device 侧编译和运行模块。七、验证与调试手段单测覆盖仓库 python/test/unit 按codegen、language、lib、runtime四个维度覆盖 Python API确保能正常生成合法的 Ascend C 代码python/test/generalization 与 python/test/kernels 则提供端到端用例在 NPU 或 Model 仿真器上执行并校验结果正确性如test_vadd.py、test_matmul.py等。编译中间产物设置PYASC_DUMP_PATH后可在指定目录查看codegen.mlir、ascir.mlir、ascendc.cpp、binary.o便于逐级排查问题。后端 Pass 测试仓库 test/Dialect/AscendC/Transforms 提供了各 Pass 的.mlir测试用例如hoist-tensor-allocation.mlir、legalize-kernel-args.mlirtest/Target/AscendC 提供代码生成结果的.mlir测试可用于理解与验证各转换阶段的行为。profiling 性能采集运行模块支持 msprof op 工具采集 profiling 数据生成内存热力图和仿真流水图辅助算子性能优化。总结pyasc 通过编译和运行、Python 前端、AST 转 ASC-IR、ASC-IR 定义、Ascend C 代码生成五大模块的清晰分工实现了从 Python 算子代码到昇腾 NPU 可执行二进制的完整 JIT 流水线。前端让 Python 用户以接近原生 Python 的体验编写与 Ascend C 一一对应的算子代码后端则借助 MLIR 生态与毕昇编译器保证了生成代码的编译优化能力。理解这套架构是深入使用 pyasc 编写高性能算子、排查编译问题以及为社区贡献代码的基础。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考