矩阵化检查
矩阵化检查用于对可矩阵化片段进行检查,并提供矩阵化修改建议。
简介
矩阵化检查工具包含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++支持以下10种领域优化技术,具体如表1所示。
领域优化技术 |
描述 |
---|---|
数学恒等变换 |
通过乘方展开的方式,替换为乘法运算使能向量化。 |
精度一致除转乘 |
外提计算倒数,将除法转为同精度的乘法计算。 |
通信隐藏优化 |
识别到代码中阻塞性通信函数调用前后,与通信变量无关的代码片段,提示将该无关片段移至函数后,并将阻塞性通信函数修改为非阻塞性通信函数,以提高代码并行性。 |
截断半径判断消除 |
将循环中依赖于循环变量的条件分支语句替换为条件表达式,从而消减分支预测失败带来的惩罚。 |
迭代算查拆分 |
针对循环中的条件分支语句,在代码结构复杂时,难以直接使用截断半径判断消除进行优化的代码,给出一个将循环结构按照条件分支进行拆分的优化建议示例代码。 |
粒子作用力迭代流程优化 |
针对循环中的条件分支语句,引入临时数组保存条件分支成立的结果,将原循环改写成两个,并将条件判断移至前一个循环改写成三目条件运算,后一个循环基于临时数组中存放的结果继续处理。 |
分子间作用力迭代展开 |
识别典型的分子间作用力核函数计算,对循环迭代进行展开,提高指令并行度。 |
定长循环完全展开 |
对上下界确定的最内层循环,自动添加编译制导语句进行循环完全展开,节省循环分支开销。 |
邻接表聚合 |
将处于同一计算阈值范围内的粒子聚合在同一分组,进而可对同一分组的粒子采用同种计算方式,消除计算前对粒子距离的判断。 |
邻接粒子作用力计算向量化 |
通过移动、拷贝或定义临时数组操作对循环内的代码进行重写,并对向量化循环添加制导语句,指导编译器实现向量化。 |
Fortran支持以下12种领域优化技术,具体如表2所示。
领域优化技术 |
描述 |
---|---|
数学恒等变换 |
通过乘方展开的方式,替换为乘法运算使能向量化。 |
消除冗余公共算子 |
提取公共子序列,通过临时数组存储该公共计算,实现跨Block的公共子序列提取,消除冗余计算。 |
单位阶跃计算优化 |
将循环中的判断及赋值语句中的sign函数,转为阶跃函数(max/min/merge)调用,使能向量化 。 |
精度一致除转乘 |
外提计算倒数,将除法转为同精度的乘法计算。 |
查找算法领域优化 |
识别出代码中实现查找功能的代码,替换为二分查找算法,提高查找算法性能。 |
超大数据降维优化 |
检查代码中定义n维的数组,但只使用了m(m<n)维数组,此时存在访存优化机会重新定义为m维数组 。 |
通信隐藏优化 |
识别到代码中阻塞性通信函数调用前后,与通信变量无关的代码片段,提示将该无关片段移至函数后,并将阻塞性通信函数修改为非阻塞性通信函数,以提高代码并行性。 |
归约计算并行化 |
当循环内存在归约计算时,通过循环展开,减少变量对自身依赖,增加并行度。 |
制导语句优化 |
通过制导语句,指导编译器实现向量化和预取优化。 |
sin/cos算子融合 |
通过合并sin/cos计算,减少函数调用,实现性能加速。 |
exp计算化简 |
将多个exp函数的乘法计算替换为单个exp函数内的加法计算,减少对exp函数的调用,进而减少计算量,实现性能加速。 |
循环合并 |
通过合并相邻循环,减少循环开销,提高数据局部性,实现性能加速。 |
前提条件

- “/opt”为工具默认安装目录,下文以此默认路径为例,请根据实际情况替换。
- 当前特性在Web界面中需要手动上传文件或压缩包;在插件工具中支持扫描本地工程,若源码为压缩包格式,请先解压然后选择解压后文件夹。
操作步骤
- 在页面左侧,“亲和分析”下拉选项中选择“矩阵化检查”,单击
创建任务,如图1所示。
表3 矩阵化检查参数说明 参数
说明
任务名称
矩阵化检查任务名称,工具默认会自动生成任务名称,也可根据实际情况进行自定义修改。
源码文件存放路径
- 手动填写源码文件的绝对路径。
- 单击右侧“选择文件夹”,选择源码文件存储文件夹。
扫描文件或文件夹
指定需扫描的文件或文件夹。
支持树形结构路径选择,可通过树形结构选择所需扫描的文件或文件夹。
优化方法
选择优化方法。可选择:
- SME矩阵化
- Stencil
- GEMV
- FFT
- 领域优化
- 计算优化:包括数学恒等变换、消除冗余公共算子、单位阶跃计算优化、精度一致除转乘、查找算法领域优化、归约计算并行化、制导语句优化、sin/cos算子融合、exp计算化简、循环合并、截断半径判断消除、迭代算查拆分、粒子作用力迭代流程优化、分子间作用力迭代展开、定长循环完全展开、邻接表聚合、邻接粒子作用力计算向量化。
- 访存优化:超大数据降维优化。
- 通讯优化:通信隐藏优化。
编译选项
选择编译方式。可选择:
- 填写编译命令
- 上传compile_commands.json。关于如何上传json文件请参见生成json文件。
构建工具
选择构建工具。可选择:
- make
- cmake
- 单击“开始检查”,开始矩阵化检查。检查完成后,自动跳转至检查报告界面。如图2所示。单击顶部的“任务信息”进入任务信息页面可查看任务的详细信息。
- 可单击
对需修改的源码文件按照路径或建议项数量进行排序。
- 可单击界面右上角“下载报告”,选择“下载报告 (.csv)”或“下载报告 (.html)”,下载分析报告到本地进行查看。或单击任务右侧“
”按钮,选择“下载报告 (.csv)”或“下载报告 (.html)”,下载分析报告到本地进行查看。
- 指定扫描文件/文件夹中包含FFT技术点,选择“下载报告(.html)”下载离线报告,下载的文件是一个zip包,解压后包含html离线报告文件和FFT-SME库(fftm.zip)压缩包。
- 指定扫描文件/文件夹中包含Stencil技术点,选择“下载报告(.html)”下载离线报告,下载的文件是一个zip包,解压后包含html离线报告文件和优化文件(optimization_files.zip)压缩包。
表4 报告结果参数说明 参数
说明
源码文件统计
需修改文件数
源码文件路径下扫描出需要修改的文件总数。
需修改代码行
需要修改的代码行数。
建议项总数
建议修改的项目总数。为了更好更快地在鲲鹏平台上运行程序,我们建议您按照建议项进行修改。
需修改的源码文件
显示需要修改的源码文件和建议项数量,通过单击操作列“查看建议源码”可以快速进入对应的源码文件建议页面。
- 可单击
- 若检查结果中存在需要修改的源码文件,则可单击“查看建议源码”进入源码修改建议页面,如图3所示。
- 支持多个用户同时创建矩阵化检查任务。
- 用户可在任务进行过程中单击关闭,取消任务。
- 若需要修改当前成功或失败任务的配置,可单击当前任务名称右侧的
按钮进行重启任务操作。
- 检查失败或检查结果为无需修改时,会产生空白报告。