性能分析过程
前提条件
- 服务器和操作系统正常运行。
- PC端已经安装SSH远程登录工具。
- 目标环境上
鲲鹏性能定界工具 、系统性能分析工具已经安装完成,并正常运行。
操作步骤
- 从GitHub下载memory_bound.c、utils.h文件,上传到“/home/demo”目录,执行如下命令切换至源码目录。
cd /home/demo
- 编译源码文件。
gcc -O2 -o /home/demo/ddrc_before /home/demo/memory_bound.c -fopenmp
- 查看应用运行时间。
./ddrc_before
执行命令后,发现应用运行时间为6372毫秒。可使用鲲鹏性能定界工具定位应用有无性能问题,若应用中确实存在优化项则优化源代码。当前应用运行时间作为时间开销的基线。
图1 运行时间
- 使用鲲鹏性能定界工具定界。进入鲲鹏性能定界工具安装目录,xxx指版本号,请根据实际情况替换。
cd /home/ksys-x.x.x-Linux-aarch64
- 采集应用的性能数据。
./ksys collect /home/demo/ddrc_before
“/home/demo/ddrc_before”:指定采集的应用。
图2 访存统计数据
在访存统计数据部分,可以看出Node 0的ddrc_rd_bw的带宽较高,鲲鹏服务器从内存中读取数据时,会经过DDR处理器(DDRC设备),若程序存在内存瓶颈时,DDRC的读写带宽会出现异常高值。此时,需要关注程序中大量内存读写的代码部分,系统性能分析工具的访存统计分析聚焦内存性能数据采集,有更细致的用户提示和更详细的评判机制,推荐使用系统性能分析工具的访存统计进一步分析程序。
- 使用系统性能分析工具进一步分析程序。切换至系统性能分析工具安装目录,xxx指版本号,请根据实际情况替换。
cd /home/DevKit-Tuner-CLI-x.x.x-Linux-Kunpeng
- 新建脚本文件,系统性能分析的访存统计分析没有针对应用的模式,因此使用脚本进行分析。
- 执行如下命令新建脚本。
vim memory.sh
- 按“i”进入编辑模式。
- 在脚本中添加以下内容,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
- 按“Esc”,输入:wq!,按“Enter”保存并退出。
- 赋予脚本文件权限。
chmod 777 memory.sh
- 执行如下命令新建脚本。
- 执行脚本文件,对应用进行访存统计分析。
./memory.sh
图3 访存统计分析报告
查看访存统计分析报告,工具提供的DDRC读带宽的参考瓶颈值为12500MB/s,实际采集到NODE 0的DDRC读带宽总值超过了50000MB/s,应用运行期间若DDRC读带宽超过了瓶颈值,则表示内存读取的相关代码存在优化点,推荐使用系统性能分析工具的Miss事件分析进一步查看是否存在内存命中率问题。
- 对应用进行Miss事件分析。
./devkit tuner miss /home/demo/ddrc_before
图4 Miss事件分析报告
查看Miss事件分析报告,发现函数MemoryBoundBench的LLC Miss Rate异常高,结合访存统计分析DDRC读带宽指标高的结果,需排查源码是否存在如下缓存命中率低的典型问题:
- 存在大量随机访问数组或链表。
- 频繁的内存复制或序列化。
- 算法没有局部性,导致Cache Miss。
- 查看源码文件,确定源码问题。
vim /home/demo/memory_bound.c
图5 源码文件
源码中存在大量随机数的访问,且没有对内存的访问进行限制,可能会导致内存访问的随机性增加,易产生跨DIE跨片访问,导致内存命中率低。
父主题: 实践3:访存统计分析