F6XXXX#
F62014 SYMBOL_NOT_FOUND#
错误描述
Kernel代码生成阶段变量未定义,日志上下文含UNDEFINED_VAR关键字。
可能原因
子图中的Operation缺少
need_alloc属性。CodeGen依赖该属性生成变量定义语句,缺失导致变量定义缺失。
处理方式
设置日志级别为INFO:
export ASCEND_PROCESS_LOG_PATH=<用户指定日志路径> export ASCEND_GLOBAL_LOG_LEVEL=1 # 0:DEBUG, 1:INFO, 2:WARN, 3:ERROR
并行编译改为串行:修改
tile_fwk_config.json中"parallel_compile": 1,重编安装。执行用例,获取日志及kernel代码:
日志:
{日志路径}/debug/plog/pypto-log*.logKernel代码:搜索
kernel_aicore/文件夹内TENSOR*.cpp
分析日志:
F60XXX / F61XXX类错误 → 一般为上游数据异常,结合PASS日志分析。
其他类型 → 结合上下文分析。
示例:以kernel代码中TileOp调用参数不符合预期为例。
按上述步骤收集日志。
找到不符合预期的TileOp调用,如:
TAdd<LastUse3Dim<0, 1, 1>>(ubTensor_0, ubTensor_0, ubTensor_2);
以上述代码为关键字搜索日志。
往上找第一个
Op CodeGenNPU Start,即该TileOp生成起点,向后逐行检查。若怀疑PASS数据问题,搜索
Gen OP IS获取Operation Dump信息:Gen OP IS: <2 x 2 x 16 x 16 x DT_FP32> %152@5#(0)MEM_UB = !10010 TILE_ADD(...) ...
其中
!10010为该OP唯一标识码,可在PASS图或日志中搜索。PASS定位详见 pass.md。
F63001 COMPILE_CODE_FAILED#
错误描述
Kernel代码编译失败。
若bisheng编译器报错日志不完整,可在日志中找到
compile cmd is:后的make命令,手工执行以获取完整错误信息。
可能原因
堆栈溢出(
error: stack frame size exceeds limit):函数栈帧超过限制。PTO指令数据类型不匹配(
the 2nd parameter maybe need a type):前端接口参数传递错误,或使用了PTO-ISA不支持的数据类型。硬件指令与平台不匹配(
does not support the given target feature):编译参数为Vector但代码含Cube指令(或反之)。变量未定义(
use of undeclared identifier):运行时动态Shape/Offset变量缺失,数据来源于Function::GetDynParamTable。
处理方式
堆栈溢出:参考 算子编译报堆栈溢出错误。
数据类型不支持:重新分析算子计算流程,选用硬件支持的数据类型。
指令与平台不匹配:
确认Block子图是否纯Vector或纯Cube(CodeGen不得混用)。
确认PASS对
Function::IsCube()的设置是否正确。
变量未定义:联合PASS排查
Function::GetDynParamTable返回的变量集合是否存在遗漏。
编译时长统计#
整体耗时#
执行算子后屏幕输出Compiler Monitor统计:
[Compiler Monitor] Stage: CodeGen(completed) | Stage elapsed: 1.2s | Total elapsed: 1.2s
[Compiler Monitor] Compilation finished 6/6 | Total functions: 6
[Compiler Monitor] Stage timing (aggregated by stage):
CodeGen 1.2s (sum over 6 functions)
Pass 0.0s (sum over 6 functions)
Prepare 0.0s
单kernel文件编译时长#
在
kernel_aicore/下找到目标TENSOR*.cpp,文件底部复制bisheng编译命令。cd到output上一层目录,执行该命令确认可行。用
time统计:time bisheng -c -O3 -g -x cce ... -o .../TENSOR_xxx.o .../TENSOR_xxx.cpp
若编译时间较长且单kernel文件超过5K行,联合PASS考虑调整子图切分。