
Ascend C 融合编译产物 ELF 解析实战基于 asc-tools 仓库 MatmulLeakyRelu 样例的 msobjdump 使用指南【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools本指南以 CANN asc-tools 仓库中的04_msobjdump样例examples/04_msobjdump/README.md为核心讲解如何在融合编译场景下用msobjdump工具对生成的算子 ELF 文件进行解析、信息打印、列表查看与解压提取。读完本文你将掌握 MatmulLeakyRelu 融合算子样例的完整编译运行流程以及msobjdump全部四个核心子命令--dump-elf、--verbose、--list-elf、--extract-elf的用法并能结合仓库源码理解其底层解析原理。背景为什么融合编译产物需要专门的解析工具在 Ascend C 算子开发中融合编译Fusion Compilation会将多个算子编译成一个统一的 ELF 交付产物例如本样例生成的demo可执行文件。这类产物内部往往内嵌了多个 device 侧 kernel 的 ELF 文件如.aicore_binary段直接使用readelf、objdump等通用工具难以直观获取其中蕴含的 kernel 元信息如 kernel 函数名、运行时 core 类型、硬同步方式、Cube/Vector 核占比等。msobjdump正是为此设计的配套工具。根据工具说明文档 docs/03_msobjdump.md它主要针对生成的算子 ELF 文件提供解析和解压功能并将结果信息以可读形式呈现方便开发者直观获得 kernel 文件信息。该工具的实现位于 utils/msobjdump/msobjdump/msobjdump_main.py入口描述为 objdump tool for Ascend C elf file。样例概述MatmulLeakyRelu 融合算子功能与计算公式本样例基于 MatmulLeakyRelu 算子演示融合编译场景下msobjdump工具的使用方式。样例通过编译 matmul_leakyrelu.asc 生成融合编译产物再使用msobjdump解析生成的 ELF 文件。MatmulLeakyRelu 的计算公式为C A * B Bias C C 0 ? C : C * 0.001即先完成矩阵乘加偏置Matmul Bias再对结果施加 LeakyReLU 激活非负值原样保留负值乘以斜率 0.001。样例规格项目内容样例类型OpTypeMatmulLeakyRelu输入 Ashape[1024, 256]数据类型float16格式ND输入 Bshape[256, 640]数据类型float16格式ND输入 Biasshape[640]数据类型float格式ND输出 Cshape[1024, 640]数据类型float格式ND核函数名matmul_leakyrelu_custom支持的产品及 CANN 软件版本产品CANN 软件版本Ascend 950PR / Ascend 950DT CANN 9.1.0Atlas A3 训练系列产品 / Atlas A3 推理系列产品 CANN 9.0.0Atlas A2 训练系列产品 / Atlas A2 推理系列产品 CANN 9.0.0目录结构├── 04_msobjdump │ ├── CMakeLists.txt // 编译工程文件 │ ├── data_utils.h // 数据读入写出函数 │ ├── matmul_leakyrelu.asc // Ascend C算子实现 调用样例 │ ├── scripts │ │ ├── gen_data.py // 输入数据和真值数据生成脚本 │ │ └── verify_result.py // 真值对比脚本 │ └── README.md // 样例说明文档其中 data_utils.h 封装了ReadFile/WriteFile两个工具函数供 Host 侧读写二进制数据文件使用gen_data.py 负责随机生成输入数据input/x1_gm.bin、input/x2_gm.bin、input/bias.bin与真值output/golden.binverify_result.py 负责将算子输出与真值做逐元素对比默认误差容限为1e-4。样例实现解析样例实现分为 Host 侧与 Kernel 侧两部分代码全部位于 matmul_leakyrelu.ascHost 侧GenerateTiling函数基于matmul_tiling::MultiCoreMatmulTilingTiling API 生成TCubeTilingTiling 参数。样例中显式设置了参与多核计算的核数为 2tilingApi.SetDim(usedCoreNum)原始 shape 为M1024, N640, K256并固定分块baseM256, baseN128、遍历方式FIRSTM。main函数通过 ACLAscendCL接口完成设备初始化、Host/Device 内存申请与拷贝最后以matmul_leakyrelu_customnumBlocks, nullptr, stream(...)方式调用核函数并将结果写回output/output.bin。Kernel 侧核函数入口matmul_leakyrelu_custom使用__mix__(1, 2)修饰声明为混合核Cube 核与 Vector 核配比 1:2这与后续msobjdump解析结果中出现的KERNEL_TYPE: MIX_AIC_MAIN、MIX_TASK_RATION: [1:2]一一对应。计算流程为CalcGMOffset依据blockIdx完成分核 GM 地址偏移计算A、B、C、Bias 各自的起始偏移matmulObj.Iteratetrue()循环迭代完成矩阵乘计算每次迭代计算baseM * baseNLeakyReluCompute通过LeakyRelu(reluOutLocal, reluOutLocal, (cType)0.001, ...)完成激活函数计算CopyOut通过DataCopy将结果从 Local Memory 搬回 Global Memory。从源码结构看该算子的混合核属性__mix__、参与核数2 核等信息都会以元数据形式固化在编译产物中这正是msobjdump解析输出的数据来源。编译运行样例在样例根目录下按以下步骤执行。1. 配置环境变量请根据当前环境上 CANN 开发套件包的安装方式配置环境变量source ${install_path}/cann/set_env.sh说明${install_path}为 CANN 包安装目录未指定安装目录时默认安装至/usr/local/Ascend下。2. 检查工具环境执行如下命令若能正常显示帮助信息则表示msobjdump工具环境正常msobjdump -h3. 编译并执行样例在样例目录下依次执行mkdir -p build cd build; cmake -DCMAKE_ASC_ARCHITECTURESdav-2201 ..;make -j; python3 ../scripts/gen_data.py ./demo python3 ../scripts/verify_result.py output/output.bin output/golden.bin各步骤含义cmake/make编译生成demo可执行文件gen_data.py生成输入与真值数据./demo在 NPU 上执行融合算子并产出output/output.binverify_result.py对比算子输出与真值。编译工程由 CMakeLists.txt 定义工程以ASC语言Ascend C构建demo可执行程序链接tiling_api、register、platform等库并通过--npu-arch${CMAKE_ASC_ARCHITECTURES}指定 NPU 编译架构。编译选项说明选项可选值说明CMAKE_ASC_ARCHITECTURESdav-2201默认、dav-3510NPU 架构•dav-2201对应 Atlas A2 训练系列产品/Atlas A2 推理系列产品和 Atlas A3 训练系列产品/Atlas A3 推理系列产品•dav-3510对应 Ascend 950PR/Ascend 950DT执行结果执行verify_result.py后若精度对比通过终端输出test pass!使用 msobjdump 解析融合编译产物样例中的demo为融合编译生成的 ELF 文件。若该 ELF 中包含.aicore_binary段msobjdump会自动提取该段内容并继续解析无需手工拆分中间文件。这一行为在源码中有明确实现ObjDump._detect_obj_type通过readelf检查段头中是否含.aicore_binary一旦命中即判定为TYPE_AICORE_BINARY类型随后调用_extract_aicore_binary用llvm-objcopy --only-section.aicore_binary将内嵌的 device ELF 提取到临时文件后继续解析见 utils/msobjdump/msobjdump/utils.py 中extract_aicore_binary_from_elf。解析融合编译产物msobjdump --dump-elf ./demo本样例实际输出如下.ascend.meta META INFO RUNTIME_IMPLICIT_INFO: L2Cache Hint Flag RUNTIME_IMPLICIT_INFO: Hardware Sync Flag VERSION: 1 RUNTIME_IMPLICIT_INFO: SIMD Printf Flag .ascend.meta. [0]: _Z23matmul_leakyrelu_customPhS_S_S_S_N7AscendC6tiling11TCubeTilingE_mix_aic KERNEL_TYPE: MIX_AIC_MAIN CROSS_CORE_SYNC: USE_SYNC MIX_TASK_RATION: [1:2] .ascend.meta. [0]: _Z23matmul_leakyrelu_customPhS_S_S_S_N7AscendC6tiling11TCubeTilingE_mix_aiv KERNEL_TYPE: MIX_AIC_MAIN CROSS_CORE_SYNC: USE_SYNC MIX_TASK_RATION: [1:2]输出解读.ascend.meta. [0]后的字符串是算子 kernel 函数的符号名mangled name即matmul_leakyrelu_custom的 C 修饰名后缀_mix_aic、_mix_aiv表明该融合产物内嵌了 AICCube 核与 AIVVector 核两份 kernel ELFKERNEL_TYPE: MIX_AIC_MAIN表示 kernel 运行时为混合核主任务类型对应源码 msobjdump_main.py 中K_TYPE_MAP的4: MIX_AIC_MAINCROSS_CORE_SYNC: USE_SYNC表示使用硬同步C_TYPE_MAP中1: USE_SYNCMIX_TASK_RATION: [1:2]表示 Cube 核/Vector 核占比为 1:2与核函数入口的__mix__(1, 2)声明一致VERSION: 1为 meta 信息版本号RUNTIME_IMPLICIT_INFO为运行时隐式信息如 SIMD Printf、硬件同步、L2Cache Hint 等标志。全量打印融合编译产物中的 device 信息msobjdump --dump-elf ./demo --verbose本样例实际输出如下.ascend.meta META INFO RUNTIME_IMPLICIT_INFO: DOUBLE_PAGE_TABLE_ADDR RUNTIME_IMPLICIT_INFO: FFTS_ADDR VERSION: 1 RUNTIME_IMPLICIT_INFO: SIMD_TRACE_SPACE .ascend.meta. [0]: _Z23matmul_leakyrelu_customPhS_S_S_S_N7AscendC6tiling11TCubeTilingE_mix_aic KERNEL_TYPE: MIX_AIC_MAIN CROSS_CORE_SYNC: USE_SYNC MIX_TASK_RATION: [1:2] .ascend.meta. [0]: _Z23matmul_leakyrelu_customPhS_S_S_S_N7AscendC6tiling11TCubeTilingE_mix_aiv KERNEL_TYPE: MIX_AIC_MAIN CROSS_CORE_SYNC: USE_SYNC MIX_TASK_RATION: [1:2] [elf heard infos] ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2s complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: unknown: 0x1029 Version: 0x1 Entry point address: 0x0 Start of program headers: 64 (bytes into file) Start of section headers: 33504 (bytes into file) Flags: 0x940000 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 3 Size of section headers: 64 (bytes) Number of section headers: 16 Section header string table index: 14 Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .text PROGBITS 0000000000000000 0000e8 006c94 00 AX 0 0 4 ...................................................................................... [15] .strtab STRTAB 0000000000000000 007ce0 0005fc 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), D (mbind), p (processor specific) There are no section groups in this file. Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x0000e8 0x0000000000000000 0x0000000000000000 0x006ca7 0x006ca7 R E 0x1000 LOAD 0x0070e8 0x0000000000007000 0x0000000000007000 0x000210 0x000210 RW 0x1000 GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0 ......--verbose在默认 meta 信息基础上追加打印 [elf header infos] 全量信息包括 ELF Header、Section Headers、Key to Flags、Program Headers 等。从源码实现看该模式对应ParseObjMode.MODE_VERBOSE通过readelf -aWget_all_section_symbols_in_file获取并打印文件全部段与符号信息。获取融合编译产物中的 ELF 文件列表msobjdump --list-elf ./demo对当前样例产物终端提示如下ELF file 0: demo.aicore.o该命令仅列出融合产物内嵌的 device ELF 文件名不落盘。从源码看_list_extracted_aicore_binary直接打印提取出的.aicore.o文件名若输入是.ascend.kernel.类型的单算子编译产物则会逐一列出其中各 kernel 的 ELF 文件。解压融合编译产物中的 ELF 文件mkdir -p objdump_out msobjdump --extract-elf ./demo执行上述命令默认在当前执行路径下落盘demo.aicore.o文件若需指定路径可通过--out-dir进行设置。落盘目录的处理逻辑见源码_set_out_dir未设置--out-dir时默认使用当前工作目录os.getcwd()。msobjdump 命令格式与字段说明命令格式汇总msobjdump共支持三种操作模式源码中对应ParseObjMode的MODE_DUMP_ELF、MODE_EXTRA_ELF、MODE_LIST_ELF# 解析 ELF 文件--dump-elf 必选--verbose 可选开启后全量打印 device 信息 msobjdump --dump-elf elf_file [--verbose] # 解压 ELF 文件--extract-elf 必选--out-dir 可选设置解压文件落盘路径 msobjdump --extract-elf elf_file [--out-dir out_path] # 获取 ELF 文件列表--list-elf 为可选获取 ELF 文件中包含的 device 信息文件列表并打印 msobjdump --list-elf elf_file命令行参数在 msobjdump_main.py 的parse_args中定义除上述选项外还支持短选项-d、-e、-l、-V、-o输入文件会经FileAction做有效性检查文件不存在或权限不足时报错若输入为.a静态库文件还会先用ar提取内部.o文件再解析。ELF 文件中常见字段说明下表来自 docs/03_msobjdump.md列出msobjdump解析输出的常见字段含义字段名含义是否必选打印说明.ascend.meta. ${id}表示算子 kernel 函数名称其中${id}表示 meta 信息的索引值。是不设置--verbose默认打印。VERSION表示版本号。是不设置--verbose默认打印。DEBUG调试相关信息包含如下两部分内容debugBufSize调试信息需要的内存空间。debugOptions调试开关状态。取值如下0调试开关关闭。1通过 DumpTensor、printf 打印进行调试。2通过 assert 断言进行调试。4通过时间戳打点功能进行调试。8通过内存越界检测进行调试。否不设置--verbose默认打印。DYNAMIC_PARAM算子 kernel 函数是否启用动态参数。取值分别为0关闭动态参数模式。1开启动态参数模式。否不设置--verbose默认打印。OPTIONAL_PARAM可选参数信息包含如下两部分内容optionalInputMode可选输入在算子 kernel 函数中是否需要占位。0可选输入不占位。1可选输入占位。optionalOutputMode可选输出在算子 kernel 函数中是否需要占位。0可选输出不占位。1可选输出占位。否不设置--verbose默认打印。KERNEL_TYPE表示 kernel 函数运行时 core 类型。否不设置--verbose默认打印。CROSS_CORE_SYNC表示硬同步 syncall 类型。仅 Atlas A3 训练系列产品/Atlas A3 推理系列产品Atlas A2 训练系列产品/Atlas A2 推理系列产品生效其他产品上不生效。USE_SYNC使用硬同步。NO_USE_SYNC不使用硬同步。否不设置--verbose默认打印。MIX_TASK_RATION表示 kernel 函数运行时的 Cube 核/Vector 核占比分配类型。否不设置--verbose默认打印。DETERMINISTIC_INFO表示算子是否为确定性计算。0不确定计算。1确定性计算。否不设置--verbose默认打印。BLOCK_NUM表示算子执行核数该字段当前暂不支持只打印默认值0xFFFFFFFF。否不设置--verbose默认打印。FUNCTION_ENTRY算子 TilingKey 的值。否不设置--verbose默认打印。elf header infos包括 ELF Header、Section Headers、Key to Flags、Program Headers、Symbol 表等信息。否设置--verbose开启全量打印。底层解析原理从 ELF 段到可读信息从源码结构看msobjdump的解析流程可以归纳为以下几步参见 msobjdump_main.py对象类型检测_detect_obj_type调用readelf -sW与readelf -SW读取符号表和段头信息依据是否包含_o_start/_json_startaclnn 打包交付件、.ascend.meta单算子编译产物、.ascend.kernel.多 kernel 产物、.aicore_binary融合编译产物等特征字符串将输入对象归入TYPE_BINARY_O_JSON、TYPE_ASCEND_META、TYPE_ASCEND_KERNEL、TYPE_AICORE_BINARY四类之一。内嵌 ELF 提取仅融合产物通过llvm-objcopy -O binary --only-section.aicore_binary将.aicore_binary段提取为临时.aicore.o文件之后所有解析均针对该临时文件进行结束后自动清理_clean。TLV 元数据解析.ascend.meta段内容按 TLVType-Length-Value结构组织。_get_elf_ascend_meta_op_tlv与_get_elf_ascend_meta_tlv依次读取type/length头各 2 字节再按类型解析对应字段。其中函数级 meta 类型映射关系F_TYPE_MAP包括KERNEL_TYPE、CROSS_CORE_SYNC、MIX_TASK_RATION、DETERMINISTIC_INFO、FUNCTION_ENTRY、BLOCK_NUM等算子级 meta 类型映射关系B_TYPE_MAP包括VERSION、DEBUG、DYNAMIC_PARAM、OPTIONAL_PARAM、RUNTIME_IMPLICIT_INFO等。数值到可读字符串的转换依赖K_TYPE_MAP、C_TYPE_MAP、RUNTIME_IMPLICIT_INFO_MAP等常量映射表例如K_TYPE_MAP[4] MIX_AIC_MAIN、C_TYPE_MAP[1] USE_SYNC。结果输出默认模式仅打印 meta 信息--verbose模式额外打印elf header infos全量段/符号信息--extract-elf将提取出的 ELF 拷贝到输出目录--list-elf仅打印内嵌 ELF 文件名。仓库自带的自动化测试用例见 tests/py_ut/testcase/msobjdump/test_msobjdump.py可进一步了解工具各类输入产物的预期解析行为。总结04_msobjdump样例完整演示了 Ascend C 融合编译场景下 ELF 产物解析的端到端流程先编译运行 MatmulLeakyRelu 融合算子生成demoELF再用msobjdump --dump-elf查看 kernel 元信息核类型、硬同步、混合核占比等用--verbose深入查看 ELF 头与段信息用--list-elf/--extract-elf列出并解压内嵌的 device ELF。理解msobjdump的输出字段与底层解析逻辑有助于开发者在算子调试、产物交付与性能定位时快速掌握 kernel 的真实编译形态。更多工具细节可参考 msobjdump 工具说明完整样例代码位于 examples/04_msobjdump。【免费下载链接】asc-toolsAscend C Tools仓是CANN基于Ascend C编程语言推出的配套调试工具仓。项目地址: https://gitcode.com/cann/asc-tools创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考