鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

示例1:矩阵分析

简介

本示例主要针对使用for循环实现一维矩阵计算的程序进行优化,通过鲲鹏DevKit系统性能分析工具热点函数分析功能模块中热点函数的检测,发现矩阵计算的热点函数multiply,采用NEON指令进行优化,并对比优化效果。

环境准备

  1. 请确认服务器上已安装的操作系统是否兼容,GCC版本是否为7.3.0及以上,兼容性请参见DevKit兼容性查询助手
  2. 请确认服务器上是否已安装鲲鹏DevKit系统性能分析工具。
  3. 请从GitHub下载代码样例,执行以下命令赋予所有用户可读、可写和可执行权限。

    样例代码文件为multiply.c、multiply_simd.c、multiply_start.sh和multiplysimd_start.sh。

    chmod 777 multiply.c multiply_simd.c multiply_start.sh multiplysimd_start.sh

multiply一维矩阵运算热点函数检测

  1. multiply程序准备。
    编译multiply.c并赋予执行文件所有用户可读、可写和可执行权限。
    gcc -g multiply.c -o multiply && chmod 777 multiply
  2. 采用热点函数分析该程序,找到热点函数和指令。

    单击系统性能分析后面的,选择“通用分析”,打开新建任务页面,选择“热点函数分析”,参数配置完成后单击“确认”启动热点函数分析任务。

    图1 新建热点函数分析任务
    表1 任务配置参数说明

    参数

    说明

    分析类型

    热点函数分析。

    分析对象

    应用。

    模式

    Launch application。

    应用路径

    输入程序所在的绝对路径,本示例将代码样例放在服务器“/opt/testdemo/multiply/multiply”路径下。示例路径里面第一个multiply为文件夹,第二个multiply为可执行程序。

    采样时长(s)

    20秒。

    采集调用栈

    开启。

    采样范围

    用户态。采样范围分用户态、内核态、所有。本示例发现所有的CPU消耗都在用户态,所以只采集用户态的数据。

    dwarf

    开启。

    C/C++ 源文件目录

    用于采集过程时关联源码。本示例使用/opt/testdemo/multiply/。

    其他参数

    默认。

  3. 查看采集分析结果。
    图2 热点函数分析结果总览

    图2中可查看整个采集运行时长,程序运行的时钟周期数占比等信息。

    图3 源码关联

    单击对应蓝色函数名,可查看源码中对应行数。

优化运算

  1. 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. 采用热点函数分析该程序,找到热点函数和指令。

    再次新建热点函数分析任务,单击系统性能分析后面的,选择“通用分析”,打开新建任务页面,选择“热点函数分析”,参数配置完成后单击“确认”启动热点函数分析任务。

    图4 再次新建热点函数分析任务
    表2 任务配置参数说明

    参数

    说明

    分析类型

    热点函数分析。

    分析对象

    应用。

    模式

    Launch application。

    应用路径

    输入程序所在的绝对路径,本示例将代码样例放在服务器“/opt/testdemo/multiply/multiply_simd”路径下。

    采样时长(s)

    20秒。

    采集调用栈

    开启。

    采样范围

    用户态。采样范围分用户态、内核态、所有。本示例发现所有的CPU消耗都在用户态,所以只采集用户态的数据。

    dwarf

    开启。

    C/C++ 源文件目录

    用于采集过程时关联源码。本示例使用/opt/testdemo/multiply/。

    其他参数

    默认。

  3. 查看采集分析结果。
    图5 热点函数分析结果总览

    图5中可查看整个采集运行时长、程序运行的时钟周期数,multiply_neon函数占用时钟周期降低。