开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

性能分析过程

前提条件

  • 服务器和操作系统正常运行。
  • PC端已经安装SSH远程登录工具。
  • 目标环境上 鲲鹏性能定界工具 、系统性能分析工具已经安装完成,并正常运行。

操作步骤

  1. GitHub下载memory_bound.c、utils.h文件,上传到“/home/demo”目录,执行如下命令切换至源码目录。
    cd /home/demo
  2. 编译源码文件。
    gcc -O2 -o /home/demo/ddrc_before /home/demo/memory_bound.c -fopenmp
  3. 查看应用运行时间。
    ./ddrc_before

    执行命令后,发现应用运行时间为6372毫秒。可使用鲲鹏性能定界工具定位应用有无性能问题,若应用中确实存在优化项则优化源代码。当前应用运行时间作为时间开销的基线。

    图1 运行时间
  4. 使用鲲鹏性能定界工具定界。
    进入鲲鹏性能定界工具安装目录,xxx指版本号,请根据实际情况替换。
    cd /home/ksys-x.x.x-Linux-aarch64
  5. 采集应用的性能数据。
    ./ksys collect /home/demo/ddrc_before

    “/home/demo/ddrc_before”:指定采集的应用。

    图2 访存统计数据

    在访存统计数据部分,可以看出Node 0的ddrc_rd_bw的带宽较高,鲲鹏服务器从内存中读取数据时,会经过DDR处理器(DDRC设备),若程序存在内存瓶颈时,DDRC的读写带宽会出现异常高值。此时,需要关注程序中大量内存读写的代码部分,系统性能分析工具的访存统计分析聚焦内存性能数据采集,有更细致的用户提示和更详细的评判机制,推荐使用系统性能分析工具的访存统计进一步分析程序。

  6. 使用系统性能分析工具进一步分析程序。
    切换至系统性能分析工具安装目录,xxx指版本号,请根据实际情况替换。
    cd /home/DevKit-Tuner-CLI-x.x.x-Linux-Kunpeng
  7. 新建脚本文件,系统性能分析的访存统计分析没有针对应用的模式,因此使用脚本进行分析。
    1. 执行如下命令新建脚本。
      vim memory.sh
    2. “i”进入编辑模式。
    3. 在脚本中添加以下内容,xxx指版本号,请根据实际情况替换。
      /home/DevKit-Tuner-CLI-x.x.x-Linux-Kunpeng/devkit tuner memory &
      TUNER_PID=$!
      /home/demo/ddrc_before
      pkill -P $TUNER_PID 2>/dev/null
      kill $TUNER_PID 2>/dev/null
      wait $TUNER_PID 2>/dev/null
    4. 按“Esc”,输入:wq!,按“Enter”保存并退出。
    5. 赋予脚本文件权限。
      chmod 777 memory.sh
  8. 执行脚本文件,对应用进行访存统计分析。
    ./memory.sh
    图3 访存统计分析报告

    查看访存统计分析报告,工具提供的DDRC读带宽的参考瓶颈值为12500MB/s,实际采集到NODE 0的DDRC读带宽总值超过了50000MB/s,应用运行期间若DDRC读带宽超过了瓶颈值,则表示内存读取的相关代码存在优化点,推荐使用系统性能分析工具的Miss事件分析进一步查看是否存在内存命中率问题。

  9. 对应用进行Miss事件分析。
    ./devkit tuner miss /home/demo/ddrc_before
    图4 Miss事件分析报告

    查看Miss事件分析报告,发现函数MemoryBoundBench的LLC Miss Rate异常高,结合访存统计分析DDRC读带宽指标高的结果,需排查源码是否存在如下缓存命中率低的典型问题:

    1. 存在大量随机访问数组或链表。
    2. 频繁的内存复制或序列化。
    3. 算法没有局部性,导致Cache Miss。
  10. 查看源码文件,确定源码问题。
    vim /home/demo/memory_bound.c
    图5 源码文件

    源码中存在大量随机数的访问,且没有对内存的访问进行限制,可能会导致内存访问的随机性增加,易产生跨DIE跨片访问,导致内存命中率低。