中文
注册

示例1:矩阵分析

简介

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

环境准备

  1. 请确认服务器上已安装的操作系统是否为Ubuntu 18.04、CentOS 7.6或openEuler 20.03,GCC版本是否为7.3.0及以上。
  2. 请确认服务器上是否已安装鲲鹏DevKit系统性能分析工具。
  3. 请从GithubGitee下载代码样例,执行以下命令赋予所有用户可读、可写和可执行权限。

    样例代码文件为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程序准备。
    1. 编译multiply.c并赋予执行文件所有用户可读、可写和可执行权限。
      gcc -g multiply.c -o multiply && chmod 777 multiply
    2. 将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 脚本内容
  2. 在程序运行的过程当中,创建系统级全景任务分析当前程序。
    创建系统全景任务,并启动分析。
    表1 任务配置参数说明

    参数

    说明

    分析对象

    系统

    分析类型

    全景分析

    采样类型

    系统设置、PCIe拓扑、系统性能和任务调度

    采样时长

    20秒

    采样间隔

    1秒

  3. 查看采集分析结果。
    图2 系统性能

    图2可以看到图形化界面的CPU核在采集时间内的利用率变化,当前有CPU核0的使用率(“系统性能”页签下%cpu的数值)接近100%,并且绝大部分消耗在用户态。由此说明,该程序全部消耗在用户态计算,没有其他IO或中断操作。

  4. 采用进程/线程分析方法,查看消耗CPU资源的进程。
    表2 任务配置参数说明

    参数

    说明

    分析对象

    系统

    分析类型

    进程/线程性能分析

    采样时长

    10秒

    采样类型

    全选

    采集线程信息

    开启

  5. 查看采集分析结果。
    图3 优化建议

    可得出multiply程序在消耗大量的CPU资源,同时绝大部分消耗在用户态中,可推测可能是代码实现算法差或Cache Miss问题。

    由于循环运行multiply程序,在采集时间内,可能会采集到多个multiply进程,如图4所示。对于每个multiply的进程,CPU的是使用率都接近100%。
    图4 进程/线程分析结果(多个multiply进程)
  6. 结束样例程序。

    通过jobs -l查看multiply程序运行pid(如果程序尚未结束,可看到后台运行的程序),通过kill -9结束进程。

    jobs -l
    kill -9 <multiply程序pid>
  7. 采用热点函数分析该程序,找到热点函数和指令。

    创建热点函数分析任务,并启动分析。

    表3 任务配置参数说明

    参数

    说明

    分析对象

    应用。

    应用路径

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

    分析类型

    热点函数分析。

    采样范围

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

    符号文件路径

    用于采集过程当中,获取函数名。本示例使用/opt/testdemo/multiply/multiply。

    采样时长

    20秒。

    采集调用栈

    开启。

    其他参数

    默认。

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

    图5中可查看整个采集运行时长、程序运行的时钟周期数和指令数。在下面的热点函数中,可得出multiply程序中的multiply函数占用了45%左右的时钟周期数。

    图6 源码关联

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

搜索结果
找到“0”个结果

当前产品无相关内容

未找到相关内容,请尝试其他搜索词