昇腾社区首页
中文
注册

错误码0x4

定位思路

***********************2. AICERROR code***********************
#AI Core error错误码及解释。
code  : 0x4

该错误码含义是函数调用深度超过设置值,cce算子函数之间的调用层次超过了阈值,而这个阈值是由一个寄存器来控制的,关于阈值说明如下。

【5:2】:T,调用栈溢出阈值,超过T+1的嵌套调用都会上报可屏蔽错误,由于UB作为调用栈,其大小是有限的,现在我们假设每个函数调用占用4KB堆栈,而UB保留16KB作为总堆栈,所以初始复位值为3。

默认值V100 ISA是3(现在V200 ISA默认值改成了2),只要嵌套不超过4层就不会有问题,所以推测有如下两种情况:

  • cce代码中有超过4层的算子调用。
  • cce代码中有修改该寄存器的操作,将阈值修改变小了。

定位步骤

  1. 查看日志1. Basic Information模块中的device id、core id、task id、stream id、node name、kernel name、算子地址等信息找到对应的出错算子。
    ***********************1. Basic information********************
    #AI Core error发生时设备的基本信息。
    #kernel name:算子名称。
    #op address: 算子代码在ddr内存的地址
    #args address:算子参数在ddr内存的地址。
    error time   : 2020-08-26-11:24:07
    device id    : 0
    core id      : 0
    task id      : 60
    stream id    : 517
    node name    : trans_TransData_167
    kernel name  : te_transdata_16b6e15e2a5cc7f70_33e5fb7ae8478ddb
    op address   : 0x101000120000
    args address : 0X101000053000
  2. 检查对应算子是否有超过4层的调用。
    • 如果有则已经完成问题定位。
    • 如果没有则执行3
  3. 检查cce代码中是否有直接设置或修改寄存器的场景。
    • 如果有则已经完成问题定位。
    • 如果没有则需要进一步定位问题。

设置CTRL指令参考

对于要实现atomic_add的场景,设置CTRL指令参考如下,以FP32为例。

uint64_t ctrl_reg = get_ctrl();
uint64_t config_reg = (ctrl_reg | ((uint64_t)1 << 60)) ;    // uint64_t configReg = (ctrlReg | ((uint64_t)1 << 60)) & (~((uint64_t)0 << 61));这个更标准一些
set_ctrl(config_reg);
set_ctrl(ctrl_reg);    // 指令还原