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

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

#### 简介

矩阵化检查工具包含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是序列的长度。同时，它还具有良好的灵活性，可以根据需要选择不同的分解方式和计算算法。
  快速傅里叶变换优化的技术点是基于FFTW（Fastest Fourier Transform in the West）加速库实现优化的，在扫描中需要在待识别文件所在目录下添加对应的FFTW加速库头文件（fftw3.h、fftw3-mpi.h），这样才能够有对应优化建议结果。


C/C++支持以下13种领域优化技术，具体如表1所示。


**表1 C/C++支持的领域优化**

| 领域优化技术 | 描述 |
| --- | --- |
| 数学恒等变换 | 通过乘方展开的方式，替换为乘法运算使能向量化。 |
| 精度一致除转乘 | 外提计算倒数，将除法转为同精度的乘法计算。 |
| 通信隐藏优化 | 识别到代码中阻塞性通信函数调用前后，与通信变量无关的代码片段，提示将该无关片段移至函数后，并将阻塞性通信函数修改为非阻塞性通信函数，以提高代码并行性。 |
| 截断半径判断消除 | 将循环中依赖于循环变量的条件分支语句替换为条件表达式，从而消减分支预测失败带来的惩罚。 |
| 迭代算查拆分 | 针对循环中的条件分支语句，在代码结构复杂时，难以直接使用截断半径判断消除进行优化的代码，给出一个将循环结构按照条件分支进行拆分的优化建议示例代码。 |
| 粒子作用力迭代流程优化 | 针对循环中的条件分支语句，引入临时数组保存条件分支成立的结果，将原循环改写成两个，并将条件判断移至前一个循环改写成三目条件运算，后一个循环基于临时数组中存放的结果继续处理。 |
| 分子间作用力迭代展开 | 识别典型的分子间作用力核函数计算，对循环迭代进行展开，提高指令并行度。 |
| 定长循环完全展开 | 对上下界确定的最内层循环，自动添加编译制导语句进行循环完全展开，节省循环分支开销。 |
| 邻接表聚合 | 将处于同一计算阈值范围内的粒子聚合在同一分组，进而可对同一分组的粒子采用同种计算方式，消除计算前对粒子距离的判断。 |
| 邻接粒子作用力计算向量化 | 通过移动、拷贝或定义临时数组操作对循环内的代码进行重写，并对向量化循环添加制导语句，指导编译器实现向量化。 |
| 默认OpenMP线程数优化 | 将函数声明处默认的OpenMP线程数优化为OpenMP默认最大可用的线程数，实现多线程加速。 |
| SPMV向量化 | 对CSR格式的SPMV计算，自动向量化。 |
| 超越函数拟合优化 | 通过结合查表优化与泰勒展开，对特定输入范围内的超越函数进行拟合优化。 |


Fortran支持以下23种领域优化技术，具体如表2所示。


**表2 Fortran支持的领域优化**

| 领域优化技术 | 描述 |
| --- | --- |
| 数学恒等变换 | 通过乘方展开的方式，替换为乘法运算使能向量化。 |
| 消除冗余公共算子 | 提取公共子序列，通过临时数组存储该公共计算，实现跨Block的公共子序列提取，消除冗余计算。 |
| 单位阶跃计算优化 | 将循环中的判断及赋值语句中的sign函数，转为阶跃函数（max/min/merge）调用，使能向量化。 |
| 精度一致除转乘 | 外提计算倒数，将除法转为同精度的乘法计算。 |
| 查找算法领域优化 | 识别出代码中实现查找功能的代码，替换为二分查找算法，提高查找算法性能。 |
| 超大数据降维优化 | 检查代码中定义n维的数组，但只使用了m（m < n）维数组，此时存在访存优化机会重新定义为m维数组。 |
| 通信隐藏优化 | 识别到代码中阻塞性通信函数调用前后，与通信变量无关的代码片段，提示将该无关片段移至函数后，并将阻塞性通信函数修改为非阻塞性通信函数，以提高代码并行性。 |
| 归约计算并行化 | 当循环内存在归约计算时，通过循环展开，减少变量对自身依赖，增加并行度。 |
| 制导语句优化 | 通过制导语句，指导编译器实现向量化和预取优化。 |
| sin/cos算子融合 | 通过合并sin/cos计算，减少函数调用，实现性能加速。 |
| exp计算化简 | 将多个exp函数的乘法计算替换为单个exp函数内的加法计算，减少对exp函数的调用，进而减少计算量，实现性能加速。 |
| 循环合并 | 通过合并相邻循环，减少循环开销，提高数据局部性，实现性能加速。 |
| 常量计算消除 | 将常量除法转换为等价的乘法计算，提高计算性能。 |
| 数组维度交换 | 交换多维数组的维度，优化数组的访存性能，实现性能加速。 |
| 循环交换访存优化 | 针对循环迭代顺序与数组维度不一致，导致的访存不连续问题，通过数据流分析，拆分迭代过程并交换顺序。 |
| 集合通信优化 | 自动检查源码中点对点通信数据流，优化为广播集合通信。 |
| 向量掩码计算优化 | 将具有掩码的向量语句自动优化为Max、Min、Merge语句。 |
| 随机数算法优化 | 将并行计算中同步随机数生成算法优化为异步随机数生成。 |
| SPMV向量化 | 对CSR格式的SPMV计算，自动向量化。 |
| OpenMP嵌套循环优化 | 对包含多个OpenMP并行制导语句的嵌套循环，通过移除内层的OpenMP并行制导语句，解除OpenMP循环嵌套，从而避免线程冲突。 |
| 内存分配优化 | 通过分析内存申请和调用数据流，自动调整内存分配时机，消除分支访问时产生的冗余内存申请。 |
| 字符串对比优化 | 识别与循环无关的常量字符串比较运算，将其提至循环外部执行，降低冗余条件分支开销。 |
| 冗余中间数组访存消除 | 分析数组访问数据流，消除嵌套计算过程中产生的冗余中间数组访问。 |


#### 前提条件

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


#### 操作步骤

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

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

| 参数 | 说明 |
| --- | --- |
| 任务名称 | 矩阵化检查任务名称，工具默认会自动生成任务名称，也可根据实际情况进行自定义修改。 |
| 源码文件存放路径 | 支持以下两种方式： 手动填写源码文件的绝对路径。 单击右侧“选择文件夹”，选择源码文件存储文件夹。 |
| 扫描文件或文件夹 | 指定需扫描的文件或文件夹。 支持树形结构路径选择，可通过树形结构选择所需扫描的文件或文件夹。 |
| 优化方法 | 选择优化方法。可选择： SME（Scalable Matrix Extension）矩阵化 Stencil GEMV FFT 领域优化 计算优化：包括数学恒等变换、消除冗余公共算子、单位阶跃计算优化、精度一致除转乘、查找算法领域优化、归约计算并行化、制导语句优化、sin/cos算子融合、exp计算化简、循环合并、截断半径判断消除、迭代算查拆分、粒子作用力迭代流程优化、分子间作用力迭代展开、定长循环完全展开、邻接表聚合、邻接粒子作用力计算向量化、默认OpenMP线程数优化、常量计算消除、向量掩码计算优化、随机数算法优化、SPMV向量化、循环交换访存优化、超越函数拟合优化、OpenMP嵌套循环优化、字符串对比优化。 访存优化：超大数据降维优化、数组维度交换、内存分配优化、冗余中间数组访存消除。 通讯优化：通信隐藏优化、集合通信优化。 |
| 编译选项 | 选择编译方式。可选择： 填写编译命令 上传compile\_commands.json。关于如何上传JSON文件请参见生成JSON文件。 |
| 构建工具 | 选择构建工具。可选择： make cmake |


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

  可单击对需修改的源码文件按照路径或建议项数量进行排序。 可单击界面右上角“下载报告”，选择“下载报告 (.csv)”或“下载报告 (.html)”，下载分析报告到本地进行查看。或单击任务右侧按钮，选择“下载报告 (.csv)”或“下载报告 (.html)”，下载分析报告到本地进行查看。 指定扫描文件/文件夹中包含FFT技术点，选择“下载报告（.html）”下载离线报告，下载的文件是一个zip包，解压后包含html离线报告文件和FFT-SME库（fftm.zip）压缩包。 指定扫描文件/文件夹中包含Stencil技术点，选择“下载报告（.html）”下载离线报告，下载的文件是一个zip包，解压后包含html离线报告文件和优化文件（optimization_files.zip）压缩包。

**表4 报告结果参数说明**

| 参数 | 说明 |
| --- | --- |
| 源码文件统计 | 源码文件统计 |
| 需修改文件数 | 源码文件路径下扫描出需要修改的文件总数。 |
| 需修改代码行 | 需要修改的代码行数。 |
| 建议项总数 | 建议修改的项目总数。为了更好更快地在鲲鹏平台上运行程序，我们建议您按照建议项进行修改。 |
| 需修改的源码文件 | 显示需要修改的源码文件和建议项数量，通过单击操作列“查看建议源码”可以快速进入对应的源码文件建议页面。 |


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

  支持多个用户同时创建矩阵化检查任务。 用户可在任务进行过程中单击关闭，取消任务。 若需要修改当前成功或失败任务的配置，可单击当前任务名称右侧的按钮进行重启任务操作。 检查失败或检查结果为无需修改时，会产生空白报告。
