训练营简介 2025年昇腾CANN训练营第二季,基于CANN开源开放全场景,推出0基础入门系列、码力全开特辑、开发者案例等专题课程,助力不同阶段开发者快速提升算子开发技能。获得Ascend C算子中级认证,即可领取精美证书,完成社区任务更有机会赢取华为手机,平板、开发板等大奖。

报名链接:https://www.hiascend.com/developer/activities/cann20252#cann-camp-2502-intro

前言

在应用层开发中,程序崩了会有 Stack Trace。但在 NPU 算子开发中,如果你的 Kernel 写错了地址(比如访问了 -1 或者越界读写),可能会导致 AI Core 挂死,甚至把整个 SoC 芯片搞挂。

这时候,普通的日志工具(如 PLOG)往往来不及写盘。我们需要更底层的手段。 昇腾提供了一套类似飞机“黑匣子”的机制,能在芯片崩溃前的毫秒级瞬间,将寄存器状态内存快照抢救下来。

本期文章将教你如何提取并分析这些“遗言”,定位那些导致 Device Hang 的致命 Bug。

一、 核心图解:坠机现场的黑匣子

当 NPU 发生致命错误时,它会触发硬件中断(Exception)。

二、 第一道防线:Exception Dump

如果 NPU 还能响应,但算子执行失败(Return Error),我们可以通过配置 acl.json 来导出异常信息。

2.1 开启异常 Dump

在运行应用前,创建 acl.json 配置文件:

{
    "dump": {
        "dump_path": "./dump_output",
        "dump_mode": "all",
        "dump_exception": "on" // 【关键】开启异常 Dump
    }
}

在代码初始化时加载:

aclInit("acl.json");

2.2 分析 Dump 文件

运行出错后,dump_output 目录下会生成 .o.bin 文件。 我们需要使用 msnpureport 工具或者 MindStudio 进行解析。

解析报告中会指出:

  • Error Code: 例如 Aicore Memory Access Invalid (非法访存)。

  • PC (Program Counter): 报错时指令执行到了哪一行。

  • Snapshot: 此时 Scalar/Vector 寄存器的值。

实战技巧:拿着 PC 地址,去反汇编你的算子二进制(.o 文件),就能精确找到是哪一行汇编指令崩了。

三、 终极手段:黑匣子 (Black Box)

如果 NPU 彻底死机(Device Hang),SSH 都连不上,怎么办? 这时候需要带内管理工具 (ada)。通常在服务器重启后,黑匣子信息依然保留在非易失存储中。

3.1 提取黑匣子日志

使用 ada 工具(通常在 /usr/local/Ascend/driver/tools 下):

# 导出黑匣子信息
./ada-toolkit --cmd log --device 0 --save ./blackbox.log

3.2 解读天书 (Register Analysis)

打开日志,你会看到一堆十六进制的寄存器值。重点关注:

  1. MTE_ERR_STS: MTE(搬运单元)错误状态。

    • 如果某一位是 1,代表 Read Out of Bound(读越界)或 Write Violation(写保护区)。

  2. Vector_ERR_STS: 向量单元错误。

    • 常见于 Div 除以 0,或者 Log 负数(如果是浮点异常开启)。

  3. Core ID: 是哪个核挂的?

    • 如果是随机的核挂,可能是竞争冒险。

    • 如果总是 Core 0 挂,可能是 Tiling 边缘处理没写好。

四、 常见“死法”大赏

根据实战经验,90% 的死机源于以下原因:

4.1 越界写 (Out-of-Bound Write)

症状:算子 A 跑完了,跑算子 B 的时候挂了,或者跑完后 Host 收到乱码。 原因:算子 A 的 CopyOut 越界,改写了不该改的内存(踩内存),破坏了 OS 的页表或下一个算子的数据。 排查:检查 Tiling 逻辑中 DataCopylen 是否超出了 AllocTensor 的大小。

4.2 死锁 (Deadlock)

症状:程序卡住不动,风扇狂转。 原因

  • WaitFlag 等不到信号(Barrier 没配对)。

  • TQue 满了,生产者还在推;或者空了,消费者还在拉。 排查:检查代码控制流,确保每一条路径上的 EnQue/DeQue 次数严格一致。

4.3 栈溢出 (Stack Overflow)

症状:莫名其妙的 PC 跳转错误。 原因:在 Kernel 里声明了太大的数组(如 float temp[1024])。AI Core 的栈空间极小(通常几 KB)。 对策:大块内存必须从 GM 或 UB 申请,严禁在栈上开大数组。

五、 总结

调试是算子开发的阴暗面,但也是最锻炼内功的地方。

  1. 工具链:熟练使用 acl.json 导出 Dump,使用 ada 抓取黑匣子。

  2. 反汇编:学会用 objdump 看 CCE 生成的汇编代码,配合 PC 指针定位行号。

  3. 预防为主:最好的调试是防御性编程。在代码中多写 assert(仅 CPU 模式),多做边界检查。

当你能从一堆十六进制乱码中一眼看出“哦,这里 MTE 越界了”,你就真正成为了 Ascend C 的黑客级专家

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐