错误码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. 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
- 检查对应算子是否有超过4层的调用。
- 如果有则已经完成问题定位。
- 如果没有则执行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); // 指令还原
父主题: 定位案例指南