文档
注册

CPU域调试

本节介绍CPU域调试的方法:gdb调试、使用printf打印命令打印。

本节提供的调试方法基于运行验证算子工程章节中的算子程序进行调试,请先完成核函数运行验证章节的学习。

CPU调测过程中,配置日志相关环境变量,可以记录程序的运行过程及异常信息,有助于开发者进行功能调测。

关于环境变量的使用约束以及详细说明,可参见日志

gdb调试

可使用gdb单步调试算子计算精度。由于cpu调测已转为多进程调试,每个核都会拉起独立的子进程,故gdb需要转换成子进程调试的方式。针对Atlas 推理系列产品(Ascend 310P处理器)Atlas 训练系列产品,每个核会拉起1个子进程。针对Atlas A2训练系列产品/Atlas 800I A2推理产品,每个核会拉起3个子进程,1个Cube,2个Vector。

  • 调试单独一个子进程
    在gdb启动后,首先设置跟踪子进程,之后再打断点,就会停留在子进程中,设置的命令为:
    set follow-fork-mode child

    但是这种方式只会停留在遇到断点的第一个子进程中,其余子进程和主进程会继续执行直到退出。涉及到核间同步的算子无法使用这种方法进行调试。

  • 调试多个子进程

    如果涉及到核间同步,那么需要能同时调试多个子进程。

    在gdb启动后,首先设置调试模式为只调试一个进程,挂起其他进程。设置的命令如下:

    (gdb) set detach-on-fork off

    查看当前调试模式的命令为:

    ​​​​​​(gdb) show detach-on-fork

    中断gdb程序要使用捕捉事件的方式,即gdb程序监控fork这一事件并中断。这样在每一次起子进程时就可以中断gdb程序。设置的命令为:

    (gdb) catch fork

    当执行r后,可以查看当前的进程信息:

    (gdb) info inferiors
      Num  Description
    * 1    process 19613

    可以看到,当第一次执行fork的时候,程序断在了主进程fork的位置,子进程还未生成。

    执行c后,再次查看info inferiors,可以看到此时第一个子进程已经启动。

    (gdb) info inferiors
      Num  Description 
    * 1    process 19613
      2    process 19626

    这个时候可以使用切换到第二个进程,也就是第一个子进程,再打上断点进行调试,此时主进程是暂停状态:

    (gdb) inferior 2
    [Switching to inferior 2 [process 19626] ($HOME/demo)]
    (gdb) info inferiors
      Num  Description
      1    process 19613
    * 2    process 19626

    请注意,inferior后跟的数字是进程的序号,而不是进程号。

    如果遇到同步阻塞,可以切换回主进程继续生成子进程,然后再切换到新的子进程进行调试,等到同步条件完成后,再切回第一个子进程继续执行。

如下是调试一个单独子进程的命令样例:

gdb --args add_custom_cpu
set follow-fork-mode child
break add_custom.cpp:45
run
list
backtrace
print i
break add_custom.cpp:56
continue
display xLocal
quit

使用printf打印命令打印

在代码中直接编写printf(...)来观察数值的输出。样例代码如下:
printf("xLocal size: %d\n", xLocal.GetSize()); 
printf("tileLength: %d\n", tileLength);
搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词