aicore exception#

问题现象描述#

AICore kernel执行期间发生异常(硬件trap、执行超时、core挂死)。

[Error]: aicore exception, device_id: 6, stream_id: 47, task_id: 2, retcode: 507015, kernelName: PyPTO_matmul_add_0_mix_aic
        Rectify the fault based on the error information in the ascend log.
PyPTO error: PyPTO Inner Error. Please rectify the fault based on the error information in the ascend log. (function PyPTOExceptionInfoCallBack)

可能原因#

  • Kernel代码存在内存越界访问。

  • 数据依赖边丢失(producer未写完consumer已读)。

  • Tiling/Shape参数与kernel不匹配。

  • MACHINE调度框架自身问题。

处理方式#

  1. export ASCEND_WORK_PATH=./wk,详细介绍请参考《环境变量参考》。

  2. 固定cce编译模式

    #调用示例
    @pypto.frontend.jit(debug_options={"compile_debug_mode": 2})
    def pypto_kernel():
    
  3. 开启singlecommit,每条指令单步跑

    /usr/local/Ascend/driver/tools/msnpureport config --set --singlecommit 1 -d device-id
    
  4. 重新执行用例

  5. plog日志里搜kernel_symbol_locator.cpp

        #示例
        grep -rn "kernel_symbol_locator.cpp" wk/log/debug/plog/plog-2341095_20260707170139095.log
    
        #寄存器信息
        62:[ERROR] IDEDD(2341095,python):2026-07-07-17:01:41.620.723 [kernel_symbol_locator.cpp:583][tid:2341490] [Dump][Exception] Error register information. coreId=6, coreType=0, AIC_ERR_0=0x0 AIC_ERR_1=0x0 AIC_ERR_2=0x0 AIC_ERR_3=0x40000000 AIC_ERR_4=0x0 AIC_ERR_5=0x0 BIU_ERR_0=0x0 BIU_ERR_1=0x0 CCU_ERR_0=0x0 CCU_ERR_1=0x63851b81 CUBE_ERR_0=0x4000036 CUBE_ERR_1=0x0 IFU_ERR_0=0xde06800 IFU_ERR_1=0x212c3 MTE_ERR_0=0x3bcdf8f6 MTE_ERR_1=0x13 VEC_ERR_0=0x0 VEC_ERR_1=0x0 FIXP_ERR_0=0xbcdf8f6 FIXP_ERR_1=0x13 AIC_COND_0=0x0 AIC_COND_1=0x0
        #PC信息
        64:[ERROR] IDEDD(2341095,python):2026-07-07-17:01:41.620.746 [kernel_symbol_locator.cpp:602][tid:2341490] [Dump][Exception] Error PC information. coreId=6, coreType=0, originalStartPC=0x124a00001130, fixedStartPC=0x124a00001000, originalCurrentPC=0x124a000010dc, fixedCurrentPC=0x124a000010d8, fixedPCOffset=0xd8.
        #符号信息
        65:[ERROR] IDEDD(2341095,python):2026-07-07-17:01:41.620.750 [kernel_symbol_locator.cpp:608][tid:2341490] [Dump][Exception] Error symbol information. coreId=6, coreType=0, symbol=TENSOR_s0_Unroll1_PATH0_hiddenfunc0_8_0_4294967296+0xd8.
    
        #如果symbol=TENSOR_s0_Unroll1_PATH0_hiddenfunc0_8_0_4294967296,即表示挂在该cce文件,如果symbol=PyPTO_matmul_add_0_mix_aic,即表示挂在框架aicore处理源码处。
    
  6. llvm-symbolizer –obj=${aicore_kernel_bin_file_path} fixedPCOffset

    • llvm-symbolizer通过apt install llvm或yum install llvm安装

    • 触发aicore exception后,aicore_kernel_bin_fil会在${ASCEND_WORK_PATH}/extra-info/data-dump/device-id/目录下自动落盘。

    • fixedPCOffset,即65行中的0xd8,即core的cce指令基于aicore_kernel_bin_file基地址的偏移量。

        #示例
        llvm-symbolizer --obj=wk/extra-info/data-dump/5/PyPTO_matmul_add_0_host.o 0xd8
    
        void pto::TMatmul<(pto::AccPhase)0, pto::Tile<(pto::TileType)4, int, 32, 32, (pto::BLayout)1, -1, -1, (pto::SLayout)1, 1024, (pto::PadValue)0, (pto::CompactMode)0>, pto::Tile<(pto::TileType)2, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)1, 512, (pto::PadValue)0, (pto::CompactMode)0>, pto::Tile<(pto::TileType)3, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)2, 512, (pto::PadValue)0, (pto::CompactMode)0>, false, true, false>(pto::Tile<(pto::TileType)4, int, 32, 32, (pto::BLayout)1, -1, -1, (pto::SLayout)1, 1024, (pto::PadValue)0, (pto::CompactMode)0>::TileDType, pto::Tile<(pto::TileType)2, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)1, 512, (pto::PadValue)0, (pto::CompactMode)0>::TileDType, pto::Tile<(pto::TileType)3, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)2, 512, (pto::PadValue)0, (pto::CompactMode)0>::TileDType, unsigned short, unsigned short, unsigned short, bool)
        /root/pto-isa/include/pto/npu/a2a3/TMatmul.hpp:51:5
        void pto::TMATMUL_IMPL<(pto::AccPhase)0, pto::Tile<(pto::TileType)4, int, 32, 32, (pto::BLayout)1, -1, -1, (pto::SLayout)1, 1024, (pto::PadValue)0, (pto::CompactMode)0>, pto::Tile<(pto::TileType)2, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)1, 512, (pto::PadValue)0, (pto::CompactMode)0>, pto::Tile<(pto::TileType)3, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)2, 512, (pto::PadValue)0, (pto::CompactMode)0>>(pto::Tile<(pto::TileType)4, int, 32, 32, (pto::BLayout)1, -1, -1, (pto::SLayout)1, 1024, (pto::PadValue)0, (pto::CompactMode)0>&, pto::Tile<(pto::TileType)2, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)1, 512, (pto::PadValue)0, (pto::CompactMode)0>&, pto::Tile<(pto::TileType)3, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)2, 512, (pto::PadValue)0, (pto::CompactMode)0>&)
        /root/pto-isa/include/pto/npu/a2a3/TMatmul.hpp:161:5
        pto::RecordEvent pto::TMATMUL<pto::Tile<(pto::TileType)4, int, 32, 32, (pto::BLayout)1, -1, -1, (pto::SLayout)1, 1024, (pto::PadValue)0, (pto::CompactMode)0>, pto::Tile<(pto::TileType)2, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)1, 512, (pto::PadValue)0, (pto::CompactMode)0>, pto::Tile<(pto::TileType)3, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)2, 512, (pto::PadValue)0, (pto::CompactMode)0>>(pto::Tile<(pto::TileType)4, int, 32, 32, (pto::BLayout)1, -1, -1, (pto::SLayout)1, 1024, (pto::PadValue)0, (pto::CompactMode)0>&, pto::Tile<(pto::TileType)2, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)1, 512, (pto::PadValue)0, (pto::CompactMode)0>&, pto::Tile<(pto::TileType)3, signed char, 32, 32, (pto::BLayout)0, -1, -1, (pto::SLayout)2, 512, (pto::PadValue)0, (pto::CompactMode)0>&)
        /root/pto-isa/include/pto/common/pto_instr.hpp:661:5
        void TMatmulImpl<true, (TransMode)0, true, TileTensor<int, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)5>, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)3>, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)4>>(TileTensor<int, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)5>&, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)3>&, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)4>&)
        /root/miniconda/envs/mq/lib/python3.10/site-packages/pypto/lib/include/tileop/cube/impl/mmad_impl.h:63:9
        void TMatmul<true, (TransMode)0, true, TileTensor<int, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)5>, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)3>, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)4>>(TileTensor<int, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)5>&, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)3>&, TileTensor<signed char, TileOp::Layout<Std::tuple<unsigned long, unsigned long>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 1ul>>, Std::tuple<Std::integral_constant<unsigned long, 32ul>, Std::integral_constant<unsigned long, 32ul>>>, (Hardware)4>&)
        /root/miniconda/envs/mq/lib/python3.10/site-packages/pypto/lib/include/tileop/cube/cube_pto.h:307:5
    
        /data/m00794585/pypto/wk/pypto/kernel_aicore/TENSOR_s0_Unroll1_PATH0_hiddenfunc0_8_7936091181990093848_0_aic.cpp:45:1
    
  7. 基于上述信息,即表示core在TENSOR_s0_Unroll1_PATH0_hiddenfunc0_8_7936091181990093848_0_aic.cpp:45处TMatmul操作。

  8. 找到挂的位置后,可以通过aicore print打印问题cce指令涉及的参数,以便定位问题。

aicore print#

功能说明#

AiCore Print用于在AICore kernel中打印tensor数据和调试信息,支持GM、UB、L1内存层次和多种数据类型。

对外接口#

接口名称

功能

适用场景

Ascend 950PR

AiCoreLogF

格式化日志打印

打印地址、标量、提示信息

支持

AiCorePrintShape

打印Shape信息

查看tensor shape维度

支持

AiCorePrintGmTensor

打印GM Tensor

查看Global Memory数据

支持

AiCorePrintUbTensor

打印UB Tensor

查看Unified Buffer数据(仅AIV kernel)

支持

AiCorePrintL1Tensor

打印L1 Tensor

查看Circular Buffer数据(仅AIC kernel)

不支持

AiCorePrintL0CTensor

打印L0C Tensor

查看Accumulator Buffer数据(仅AIC kernel)

支持

支持的数据类型#

AiCore Print支持以下数据类型:

浮点类型

  • Ascend 950PR:支持

  • fp32float

  • fp16half

  • bf16bfloat16_t

整数类型

  • Ascend 950PR:支持

  • int8int8_t

  • uint8uint8_t

  • int16int16_t

  • uint16uint16_t

  • int32int32_t

  • uint32uint32_t

  • int64int64_t

  • uint64uint64_t

FP8类型(平台限制):

  • Ascend 950PR:支持

  • fp8_e4m3float8_e4m3_t

  • fp8_e5m2float8_e5m2_t

  • fp8_e8m0float8_e8m0_t

  • hifloat8hifloat8_t

平台限制说明:FP8和HiFloat8类型仅在Ascend 950PR上支持(SUPPORT_FP8_HF8_PRINT=1,对应__NPU_ARCH__ == 3510)。

其他平台不支持FP8/HiFloat8打印功能。

使用步骤#

1. 启用追踪日志#

修改配置文件:

framework/src/interface/configs/tile_fwk_config.json

"fixed_output_path": true,
"force_overwrite": false,

修改头文件:

framework/src/interface/machine/device/tilefwk/aicore_print.h

#define ENABLE_AICORE_PRINT 1

2. 重新编译安装#

rm -rf build_out/ && python build_ci.py && pip install build_out/pypto*whl --force-reinstall --no-deps

3. 在kernel CCE文件中添加打印代码#

重要流程说明

何时删除kernel_aic*目录

  • 首次运行或切换用例:删除kernel_aic*目录

  • 同一用例重复运行:保留kernel_aic*目录(保留修改)

步骤3.1:首次运行生成kernel CCE文件

首次运行或切换用例:

rm -rf kernel_aic* output/ wk/
export ASCEND_PROCESS_LOG_PATH=./wk && export ASCEND_GLOBAL_LOG_LEVEL=1 && python xxx.py

同一用例重复运行(已添加打印代码):

rm -rf output/ wk/
export ASCEND_PROCESS_LOG_PATH=./wk && export ASCEND_GLOBAL_LOG_LEVEL=1 && python xxx.py

步骤3.2:在生成的CCE文件中添加打印代码

查看生成的kernel文件:

ls kernel_aicore/*.cpp

修改步骤: (1)在文件开头添加:#include "tilefwk/aicore_print.h" (2)在合适位置(数据加载或计算后的同步点)添加打印调用

打印接口调用格式:

AiCoreLogF(param->ctx, "format string", args...);
AiCorePrintShape(param->ctx, Shape2Dim(dim0, dim1), "name");
AiCorePrintGmTensor(param->ctx, (__gm__ T*)addr, end, begin, "name");
AiCorePrintUbTensor(param->ctx, (__ubuf__ T*)addr, end, begin, "name");
AiCorePrintL1Tensor(param->ctx, (__cbuf__ T*)addr, end, begin, l1_staging, "name");
AiCorePrintL0CTensor(param->ctx, (__cc__ T*)addr, end, begin, l0cShape0, l0cShape1, l0c_staging, "name");

步骤3.3:配置L1/L0C staging buffer(仅AiCorePrintL1Tensor / AiCorePrintL0CTensor需要)

// L1 staging buffer(从workspace分配)
__gm__ T* l1_staging = (__gm__ T*)(param->funcData->workspaceAddr);

// L0C staging buffer(从workspace分配,需32字节对齐)
__gm__ T* l0c_staging = (__gm__ T*)(param->funcData->workspaceAddr);

关键注意事项:首次运行或切换用例删除kernel_aic*,同一用例重复运行保留修改。

4. 运行测试并查看打印结果#

重要:以下命令必须一次性完整执行(使用&&连接),不要拆分为多个命令:

export ASCEND_PROCESS_LOG_PATH=./wk && export ASCEND_GLOBAL_LOG_LEVEL=1 && rm -rf output/ wk/ && python xxx.py && grep -rn "DumpAicoreLog" ./wk

命令说明

  1. export ASCEND_PROCESS_LOG_PATH=./wk:设置日志输出目录为./wk

  2. export ASCEND_GLOBAL_LOG_LEVEL=1:设置日志级别为INFO(级别1),开启日志输出

  3. rm -rf output/ wk/:清理旧日志和编译产物,避免干扰

  4. python xxx.py:运行测试用例,触发kernel编译和执行

  5. grep -rn "DumpAicoreLog" ./wk:搜索并打印所有AiCore Print输出(包含tensor数据和调试信息)

不同数据类型打印示例#

以下示例展示每种数据类型的打印用法。打印代码需在合适位置插入(如TLoad/TAdd后的同步点)。

浮点类型#

AiCorePrintGmTensor(param->ctx, (__gm__ float*)gmTensor_fp32.GetAddr(), 8, 0, "fp32_gm");

AiCorePrintUbTensor(param->ctx, (__ubuf__ half*)ubTensor_fp16.GetAddr(), 16, 0, "fp16_ub");

__gm__ bfloat16_t* l1_staging_bf16 = (__gm__ bfloat16_t*)(param->funcData->workspaceAddr);
AiCorePrintL1Tensor(param->ctx, (__cbuf__ bfloat16_t*)l1Tensor_bf16.GetAddr(), 16, 0, l1_staging_bf16, "bf16_l1");

整数类型#

AiCorePrintGmTensor(param->ctx, (__gm__ int8_t*)gmTensor_int8.GetAddr(), 16, 0, "int8_gm");

AiCorePrintUbTensor(param->ctx, (__ubuf__ uint8_t*)ubTensor_uint8.GetAddr(), 16, 0, "uint8_ub");

AiCorePrintUbTensor(param->ctx, (__ubuf__ int16_t*)ubTensor_int16.GetAddr(), 8, 0, "int16_ub");

AiCorePrintGmTensor(param->ctx, (__gm__ uint16_t*)gmTensor_uint16.GetAddr(), 8, 0, "uint16_gm");

AiCorePrintUbTensor(param->ctx, (__ubuf__ int32_t*)ubTensor_int32.GetAddr(), 16, 0, "int32_ub");

AiCorePrintGmTensor(param->ctx, (__gm__ uint32_t*)gmTensor_uint32.GetAddr(), 8, 0, "uint32_gm");

AiCorePrintGmTensor(param->ctx, (__gm__ int64_t*)gmTensor_int64.GetAddr(), 8, 0, "int64_gm");

AiCorePrintUbTensor(param->ctx, (__ubuf__ uint64_t*)ubTensor_uint64.GetAddr(), 8, 0, "uint64_ub");

FP8类型(平台限制)#

AiCorePrintGmTensor(param->ctx, (__gm__ float8_e4m3_t*)gmTensor_fp8e4m3.GetAddr(), 8, 0, "fp8e4m3_gm");

AiCorePrintGmTensor(param->ctx, (__gm__ float8_e5m2_t*)gmTensor_fp8e5m2.GetAddr(), 8, 0, "fp8e5m2_gm");

AiCorePrintGmTensor(param->ctx, (__gm__ float8_e8m0_t*)gmTensor_fp8e8m0.GetAddr(), 8, 0, "fp8e8m0_gm");

AiCorePrintGmTensor(param->ctx, (__gm__ hifloat8_t*)gmTensor_hf8.GetAddr(), 8, 0, "hifloat8_gm");

其他接口#

AiCorePrintShape:

AiCorePrintShape(param->ctx, Shape2Dim(sym_161_dim_0, sym_161_dim_1), "sym_161");
AiCorePrintShape(param->ctx, Shape3Dim(dim0, dim1, dim2));
AiCorePrintShape(param->ctx, Shape4Dim(dim0, dim1, dim2, dim3), "conv_out");

L1 Tensor打印示例:

__gm__ half* l1_staging = (__gm__ half*)(param->funcData->workspaceAddr);
AiCorePrintL1Tensor(param->ctx, (__cbuf__ half*)l1Tensor.GetAddr(), 16, 0, l1_staging, "fp16_l1");

L0C Tensor打印示例(L0C数据通过DMA搬运到GM staging buffer后打印):

__gm__ int32_t* l0c_staging = (__gm__ int32_t*)(param->funcData->workspaceAddr);
AiCorePrintL0CTensor(param->ctx, (__cc__ int32_t*)l0cTensor.GetAddr(), 1024, 0, 32, 32, l0c_staging, "int32_l0c");

AiCoreLogF:

AiCoreLogF(param->ctx, "GM address=%p", ((__gm__ float*)gmTensor.GetAddr()));
AiCoreLogF(param->ctx, "Shape=[%ld,%ld]", dim0, dim1);
AiCoreLogF(param->ctx, "INT8 input loaded");

注意事项#

  1. L1/L0C staging buffer对齐:l1_staging和l0c_staging地址必须32字节对齐,workspaceAddr默认满足要求。

  2. 打印数量控制:PRINT_BUFFER_SIZE当前为128KB(定义于framework/src/interface/machine/device/tilefwk/aicpu_common.h),若触发overflow warning,需增大该值后重新编译。

  3. FP8/HiFloat8支持平台:仅Ascend 950PR(__NPU_ARCH__ == 3510)支持(见SUPPORT_FP8_HF8_PRINT宏定义)。

  4. AiCorePrintL1Tensor支持平台:Ascend 950PR不支持;Atlas A2训练系列产品/Atlas A2推理系列产品、Atlas A3训练系列产品/Atlas A3推理系列产品支持(见SUPPORT_L1_COPY宏定义)。

  5. AIC (Cube核)中不能使用AiCorePrintUbTensor:AIC (Cube核)的标量处理器(SP)没有到UB地址空间的物理通路,无法从UB标量读取数据。编译期已通过static_assert拦截,在AIC kernel中调用AiCorePrintUbTensor会触发编译报错:

    error: static assertion failed: [AIC UB Print Error] AiCorePrintUbTensor is not supported on AIC (Cube) kernel.
    

    UB数据检查请在AIV (Vector核) kernel中完成,或在AIC中使用AiCorePrintGmTensor打印已搬到GM的数据。

  6. AiCoreLogF在AIC中打印UB数据值会触发运行时错误AiCoreLogF在AIC kernel中使用%f%d等格式打印UB数据值时(如((__ubuf__ float*)addr)[521]),编译器会生成一条从UB地址空间的标量load指令,AIC SP不支持此操作,触发MPU error 271:

    error from aicore error exception, core id is 0, error code = 271
    errorStr: The MPU address access is invalid
    

    %p打印地址值(不读取UB数据)是安全的。正确做法:AIC kernel中不直接读取UB数据值,将UB打印逻辑移到AIV kernel中。

  7. 不可通过DMA将UB数据搬到GM再打印:AIC (Cube核)上没有MTE3 DMA引擎(copy_ubuf_to_gmcopy_ubuf_to_gm_align_v2等intrinsic不支持cube target),TStoreVecOP_UB_COPY_OUT)的OpCoreTypeAIV,属于Vector核专用。在AIC kernel中调用这些接口会编译报错:

    error: function type '...' of 'copy_ubuf_to_gm' does not support the given target feature
    

常见问题#

1. 未看到打印输出#

检查:ENABLE_AICORE_PRINT=1、已重新编译安装,已指定日志落盘路径,已设置日志级别为info级别(1),grep搜索文件正确。

2. L1/L0C Print对齐WARNING#

确保l1_staging / l0c_staging地址32B对齐,workspaceAddr本身已对齐。

3. Overflow Warning#

减少打印数量或增大PRINT_BUFFER_SIZE后重新编译。

4. FP8/HiFloat8无法打印#

当前平台不支持(检查SUPPORT_FP8_HF8_PRINT宏;仅Ascend 950PR / __NPU_ARCH__ == 3510时为1)。

5. AiCorePrintL1Tensor找不到接口定义#

当前平台不支持(检查SUPPORT_L1_COPY宏)。

6. ld.lld: error: undefined symbol#

编译时出现ld.lld: error: undefined symbol链接错误,导致编译失败。

原因parallel_compile配置值大于1时,CodeGen会并行编译多个子图;在此模式下,部分编译单元之间的符号依赖未正确处理,导致链接失败。

解决方案:修改framework/src/interface/configs/tile_fwk_config.json,将parallel_compile设为1(编译线程数为1,即串行编译)。注意:该配置项表示并行编译线程数,而非布尔开关(1表示单线程,128等为多线程并行)。修改后重新运行即可解决。

"parallel_compile": 1

7. AIC kernel中调用AiCorePrintUbTensor编译报错#

AIC (Cube核) kernel中使用AiCorePrintUbTensor时,编译器会触发static_assert

error: static assertion failed due to requirement '!std::is_same_v<float, float>':
  [AIC UB Print Error] AiCorePrintUbTensor is not supported on AIC (Cube) kernel.
  AIC Scalar Processor cannot scalar-load from UB address space.
  Please use AiCorePrintUbTensor in AIV (Vector) kernel instead,
  or use AiCorePrintGmTensor to print data that has been moved to GM.

原因:AIC (Cube核)的标量处理器(SP)没有到UB地址空间的物理通路,无法从UB标量读取数据。

解决方案:将AiCorePrintUbTensor调用移到AIV (Vector核) kernel中,或使用AiCorePrintGmTensor打印已搬到GM的数据。

8. AIC kernel中使用AiCoreLogF打印UB数据值触发error 271#

在AIC kernel的CCE文件中使用如下代码:

AiCoreLogF(param->ctx, "ubTensor val=%f", ((__ubuf__ float*)ubTensor.GetAddr())[521]);

运行时触发aicore error:

error from aicore error exception, core id is 0, error code = 271
errorStr: The MPU address access is invalid

原因((__ubuf__ float*)addr)[521]会生成一条从UB地址空间的标量load指令,AIC SP不支持此操作。注意:AIC kernel中从UB地址空间标量读取无法在编译期被static_assert拦截(因为AiCoreLogF的变参模板在参数表达式求值后,__ubuf__属性已丢失),也无法在运行时拦截(MPU error是硬件trap,无软件恢复机制)。

解决方案

  • 将UB数据打印逻辑移到AIV kernel中

  • AIC kernel中仅使用%p打印UB地址值(不读取数据),这是安全的

  • 检查AIC kernel的CCE代码,删除所有对UB地址空间做[]下标访问的表达式

9. AIC kernel中尝试TStoreVec / copy_ubuf_to_gm搬运UB数据编译报错#

在AIC kernel中调用TStoreVeccopy_ubuf_to_gmcopy_ubuf_to_gm_align_v2等接口编译报错:

error: function type 'void (__gm__ void *, __ubuf__ void *, ...)' of 'copy_ubuf_to_gm' does not support the given target feature

原因:Cube核上没有MTE3 DMA输出引擎,所有从UB源地址搬迁数据的intrinsic均不支持cube target。TStoreVecOP_UB_COPY_OUT)的OpCoreTypeAIV,是Vector核专用操作。

解决方案:此类操作只能在AIV (Vector核) kernel中使用,不要在AIC kernel中调用。需要打印UB数据时,在AIV中完成。