示例1:矩阵分析
简介
本示例主要针对使用for循环实现一维矩阵计算的程序进行优化,通过鲲鹏DevKit系统性能分析工具热点函数分析功能模块中热点函数的检测,发现矩阵计算的热点函数multiply,采用NEON指令进行优化,并对比优化效果。
环境准备
multiply一维矩阵运算热点函数检测
- multiply程序准备。- 编译multiply.c并赋予执行文件所有用户可读、可写和可执行权限。
        gcc -g multiply.c -o multiply && chmod 777 multiply 
- 将multiply.c程序绑定CPU核,并使用后台启动脚本multiply_start.sh启动程序,使得程序循环运行多次,以便有时间运行系统级别的采集任务,同时nohup命令使得即使退出账户之后会继续运行相应的进程,防止任务中断。
        nohup bash multiply_start.sh >>multiply.out 2>&1 & 程序运行的标准输出(1)将会保存到multiply.out文件,错误信息(2)会重定向到multiply.out文件。 其中multiply_start.sh脚本内容如下,如multiply_start.sh程序没有正常运行,可通过multiply.out文件检查错误信息,注意检查是否为window-style line endings问题。如果是,可以通过vi -b multiply_start.sh进行删除。 图1 脚本内容  
 
- 编译multiply.c并赋予执行文件所有用户可读、可写和可执行权限。
        
- 采用热点函数分析该程序,找到热点函数和指令。创建热点函数分析任务,并启动分析。 表1 任务配置参数说明 参数 说明 分析类型 热点函数分析。 分析对象 应用。 应用路径 输入程序所在的绝对路径,本示例将代码样例放在服务器“/opt/testdemo/multiply/multiply”路径下。示例路径里面第一个multiply为文件夹,第二个multiply为可执行程序。 采样时长(s) 20秒。 采集调用栈 开启。 采样范围 用户态。采样范围分用户态、内核态、所有。本示例发现所有的CPU消耗都在用户态,所以只采集用户态的数据。 dwarf 开启。 C/C++ 源文件目录 用于采集过程时关联源码。本示例使用/opt/testdemo/multiply/。 其他参数 默认。 
- 查看采集分析结果。
      从图2中可查看整个采集运行时长,程序运行的时钟周期数占比等信息。 图3 源码关联  单击对应蓝色函数名,可查看源码中对应行数。 
优化运算
- multiply_simd.c程序准备。multiply_simd.c是在multiply.c的基础上采用NEON指令进行优化的,编译multiply_simd.c并赋予执行文件所有用户可读、可写和可执行权限。gcc -g multiply_simd.c -o multiply_simd && chmod 777 multiply_simd 
- 采用热点函数分析该程序,找到热点函数和指令。创建热点函数分析任务,并启动分析。 表2 任务配置参数说明 参数 说明 分析类型 热点函数分析。 分析对象 应用。 应用路径 输入程序所在的绝对路径,本示例将代码样例放在服务器“/opt/testdemo/multiply/multiply_simd”路径下。 采样时长(s) 20秒。 采集调用栈 开启。 采样范围 用户态。采样范围分用户态、内核态、所有。本示例发现所有的CPU消耗都在用户态,所以只采集用户态的数据。 dwarf 开启。 C/C++ 源文件目录 用于采集过程时关联源码。本示例使用/opt/testdemo/multiply/。 其他参数 默认。 
- 查看采集分析结果。
      从图4中可查看整个采集运行时长、程序运行的时钟周期数,multiply_neon函数占用时钟周期降低。 


