---
title: 示例1：矩阵分析
description: "本示例主要针对使用for循环实现一维矩阵计算的程序进行优化，通过鲲鹏DevKit系统性能分析工具热点函数分析功能模块中热点函数的检测，发现矩阵计算的热点函数multiply，采用NEON指令进行优化，并对比优化效果。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/profiler/demo/KunpengDevKitDsug_0021.html
sourcePath: /source/zh/kunpengdevps/profiler/demo/KunpengDevKitDsug_0021.html
indexId: dc489059b712c88083fd9e4428ecc362d797fe35f145e16ae8c0d74ec71a0c9b65
---
# 示例1：矩阵分析

#### 简介

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


#### 环境准备

1. 请确认服务器上已安装的操作系统是否兼容，GCC版本是否为7.3.0及以上，兼容性请参见DevKit兼容性查询助手(https://www.hikunpeng.com/zh/developer/developtool)。
2. 请确认服务器上是否已安装鲲鹏DevKit系统性能分析工具。
3. 请从GitHub(https://github.com/kunpengcompute/devkitdemo/tree/main/Hyper_tuner/testdemo/multiply)下载代码样例，执行以下命令赋予所有用户可读、可写和可执行权限。
  样例代码文件为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函数占用时钟周期降低。
