昇腾社区首页
中文
注册

msdebug工具使用"-O0 -g"编译算子时,stack frame size超出限制

现象描述

出现以下报错:

[ 33%] Building CCE object cmake/npu/CMakeFiles/reduce_sum_custom_npu.dir///reduce_sum_custom.cpp.o  
error: stack frame size (16024) exceeds limit (16000) in function '_ZN7AscendC9ReduceSumIDhEEvRKNS_11LocalTensorIT_EES5_S5_i'
error: stack frame size (16024) exceeds limit (16000) in function '_ZN7AscendC9ReduceSumIDhEEvRKNS_11LocalTensorIT_EES5_S5_i'
2 errors generated.

解决措施

  • stack frame size未超过32768

    可通过修改编译选项扩大使能的栈空间进行解决。如下是msopgen工程的修改方法。

    打开cmake/Modules/CMakeDetermineCCECompiler.cmake文件,找到变量_CMAKE_CCE_COMPILE_OPTIONS的赋值语句,修改或新增如下三个字段,设置stack size到最大值0x8000:
    # 文件位置:cmake/Modules/CMakeDetermineCCECompiler.cmake
        set(_CMAKE_CCE_COMPILE_OPTIONS
    	"-mllvm -cce-aicore-function-stack-size=0x8000 \
             -mllvm -cce-aicore-record-overflow=false \
             -mllvm -cce-aicore-addr-transform \
             -mllvm -cce-aicore-jump-expand=true \
            -mllvm -cce-aicore-stack-size=0x8000"  # 此处完成修改
        )

    非msopgen工程中需修改编译选项的文件位置,需要用户根据实际的工程实现自行确定。

  • stack frame size超过32768
    1. 可考虑注释掉调试无关的部分代码行,使stack frame size小于32768,然后通过方法一进行解决。
    2. 步骤一无法使stack frame size小于32768,可在方法一中的文件修改处添加编译选项 --cce-ignore-always-inline=true ,解除强制inline限制,减小栈空间使用。

      编译器版本建议使用 2024-03 之后的版本,可使用 ccec -v查询编译器版本构建时间。