---
title: 矩阵化检查
description: "矩阵化检查用于对可矩阵化片段进行检查，并提供矩阵化修改建议。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24/usermanual/DevKit_Affinity_0019.html
sourcePath: /source/zh/kunpengdevkithistory/devkit_24/usermanual/DevKit_Affinity_0019.html
indexId: d949b416586478e6703db0a0142a2e0a910377aa5c0578b5946a1091e7c9acaa78
---
# 矩阵化检查

矩阵化检查用于对可矩阵化片段进行检查，并提供矩阵化修改建议。

#### 简介

矩阵化检查工具包含Stencil、GEMV和FFT三个技术点的检查与优化。工具支持C/C++/Fortran源码的检查与优化，检查流程在AST（抽象语法树Abstract Syntax Tree的缩写）上进行。其中，C/C++源码使用Clang进行AST的生成，Fortran源码使用Fparser进行AST的生成，优化流程则与各计算模式强相关。三个技术点简介如下：

- Stencil计算是科学应用中的一类重要计算，被广泛应用于偏微分方程求解、高斯赛德尔方法、流体力学计算以及地球系统模拟等方面。Stencil计算描述了一种在大量时间步迭代下遍历结构化网格并按固定模式更新网格点的算法。结构化网格中的每个点根据其邻居子集进行更新的固定模式称为Stencil。
- GEMV是矩阵向量乘法（General Matrix-Vector multiplication）的缩写，是一种常用的线性代数运算，它可以被高度优化以利用现代计算机体系结构的并行性和向量化指令。在计算机科学中，GEMV通常用于矩阵乘法的一部分，即将一个矩阵与一个向量相乘。
- 快速傅里叶变换（Fast Fourier Transform），即利用计算机计算离散傅里叶变换（DFT）的高效、快速计算方法的统称，简称FFT。这种方法的优点是计算效率非常高，可以在O(nlogn)的时间复杂度内完成计算，其中n是序列的长度。同时，它还具有良好的灵活性，可以根据需要选择不同的分解方式和计算算法。

C/C++/Fortran支持以下12种领域优化技术，其中C/C++支持数学恒等变换、精度一致除转乘、通信隐藏优化，Fortran全部支持，具体如下：

- 数学恒等变换：通过乘方展开的方式，替换为乘法运算使能向量化。
- 消除冗余公共算子：提取公共子序列，通过临时数组存储该公共计算，实现跨Block的公共子序列提取，消除冗余计算。
- 单位阶跃计算优化：将循环中的判断及赋值语句中的sign函数，转为阶跃函数（max/min/merge）调用，使能向量化 。
- 精度一致除转乘：外提计算倒数，将除法转为同精度的乘法计算。
- 查找算法领域优化：识别出代码中实现查找功能的代码，替换为二分查找算法，提高查找算法性能。
- 超大数据降维优化：检查代码中定义n维的数组，但只使用了m（m<n）维数组，此时存在访存优化机会重新定义为m维数组 。
- 通信隐藏优化：识别到代码中阻塞性通信函数调用前后，与通信变量无关的代码片段，提示将该无关片段移至函数后，并将阻塞性通信函数修改为非阻塞性通信函数，以提高代码并行性。
- 归约计算并行化：当循环内存在归约计算时，通过循环展开，减少变量对自身依赖，增加并行度。
- 制导语句优化：通过制导语句，指导编译器实现向量化和预取优化。
- sin/cos算子融合：通过合并sin/cos计算，减少函数调用，实现性能加速。
- exp计算化简：将多个exp函数的乘法计算替换为单个exp函数内的加法计算，减少对exp函数的调用，进而减少计算量，实现性能加速。
- 循环合并：通过合并相邻循环，减少循环开销，提高数据局部性，实现性能加速。


#### 前提条件

已成功登录鲲鹏DevKit。- “/opt”为工具默认安装目录，下文以此默认路径为例，请根据实际情况替换。
- 当前特性在Web界面中需要手动上传文件或压缩包；在插件工具中支持扫描本地工程，若源码为压缩包格式，请先解压然后选择解压后文件夹。


#### 操作步骤

1. 在页面左侧，“亲和分析”下拉选项中选择“矩阵化检查”，单击创建任务，如图1所示。
  图1 矩阵化检查

**表1 矩阵化检查参数说明**

| 参数 | 说明 |
| --- | --- |
| 任务名称 | 矩阵化检查任务名称，工具默认会自动生成任务名称，也可根据实际情况进行自定义修改。 |
| 源码文件存放路径 | 支持以下两种方式： 选择“已上传的源码”：单击填写框选择下拉框中的源码路径即可，也可以手动填写源码路径。 选择“上传源码”：单击“上传”按钮上传压缩包（上传过程中自动解压）或文件夹。 说明： 支持上传tar，tar.bz，tar.bz2，tar.gz，tar.xz，tbz，tbz2，tgz，txz，zip格式的压缩包，只允许同时上传一个压缩包。源码文件压缩包小于或等于1GB，解压后小于或等于剩余磁盘空间的一半。 只允许同时上传一个文件夹，文件夹小于或等于剩余磁盘空间的一半。 手动上传软件包时，需先检查是否存在上传目录，若不存在，则需创建工具指定路径，并给devkit用户开通读写和执行权限。 |
| 扫描文件或文件夹 | 指定需扫描的文件或文件夹。 支持树形结构路径选择，可通过树形结构选择所需扫描的文件或文件夹。 |
| 优化方法 | 选择优化方法。可选择： SME矩阵化 Stencil GEMV FFT 领域优化 计算优化：包括数学恒等变换、消除冗余公共算子、单位阶跃计算优化、精度一致除转乘、查找算法领域优化、归约计算并行化、制导语句优化、sin/cos算子融合、exp计算化简和循环合并。 访存优化：超大数据降维优化。 通讯优化：通信隐藏优化。 |
| 编译选项 | 选择编译方式。可选择： 填写编译命令 上传compile\_commands.json。关于如何上传JSON文件请参见生成JSON文件。 |
| 构建工具 | 选择构建工具。可选择： make cmake |


2. 单击“开始检查”，开始矩阵化检查。检查完成后，自动跳转至检查报告界面。如图2所示。单击顶部的“任务信息”进入任务信息页面可查看任务的详细信息。
  图2 矩阵化检查报告


3. 若检查结果中存在需要修改的源码文件，则可单击“查看建议源码”进入源码修改建议页面，如图3所示。
  图3 源码修改建议

  支持多个用户同时创建矩阵化检查任务。 用户可在任务进行过程中单击关闭，取消任务。 用户可以单击原始源代码模块右上角的上下键，进行上下切换。 检查失败或检查结果为无需修改时，会产生空白报告。
