Page 15 - 《软件学报》2025年第12期
P. 15

5396                                                      软件学报  2025  年第  36  卷第  12  期


                 记录每个函数的浮点指令序列. 给定待分析程序               P  和编译选项    C 1 和  C 2 , 首先调用  LLVM  中的  Clang  前端生成不
                 同编译优化选项对应的         IR  文件  (当有多个源代码文件时会基于         llvm-link  将其链接为一个   IR  文件). 接着, 使用
                 LLVM  中的  opt 工具调用优化遍    fpids 解析  IR  文件, 生成不同编译优化选项下每个函数对应的浮点指令序列.
                    (2) 浮点指令序列差异性计算模块. 本文基于            Python (版本  3.8.10) difflib  模块的  sequenceMatcher 类来计算不
                 同函数浮点指令序列的差异性系数; FI3D           会过滤掉那些差异性系数为零的文件/函数, 并将文件/函数按照差异性
                 系数降序进行排列.
                    (3) Delta-Debugging  代码搜索定位模块. 本文在   PLiner 中扩展实现了    Delta-Debugging  搜索定位机制, 复用了
                 PLiner 的语句精度增强变换模块. 此外, 为了提高          FI3D  的可用性, 在  PLiner 中扩展了对多问题文件的精化搜索支
                 持, 解决了   PLiner 不支持单精度浮点类型的问题, 修正了           PLiner 精度增强变换接口在实现上的一些缺陷              (例如
                 PLiner 对浮点数组精度增强存在缺陷).

                                                                                           定位报告
                                      指令记录        指令序列     差异性计算           代码搜索定位
                          程序 P
                        选项 C &C                             Python difflib
                             1  2   LLVM PASS fpids                       DDSearch  Multi-file
                                                    图 4 FI3D  实现架构

                  4.2   研究问题
                    本文实验主要回答如下         2  个研究问题.
                    (1) 研究问题   1: 本文工具  FI3D  是否能有效定位触发编译优化结果差异性的代码, 特别是多源问题代码?
                    (2) 研究问题 2: 本文工具    FI3D  定位触发编译优化结果差异性的代码是否比当前最先进工具                    PLiner 更高效?
                  4.3   实验设计
                    表  2  给出了实验所使用的测试用例.

                                                      表 2 实验程序集

                               程序         #文件/#函数个数          行数                功能简介
                              CG.A             1/7           1 066   共轭梯度不规则存取和通信 (A规模)
                              CG.B             1/7           1 066   共轭梯度不规则存取和通信 (B规模)
                              MG.A            1/15           1 385    多重网格长、短距离通信 (A规模)
                               SP.A           13/13          3 440      标量五对角线求解器 (A规模)
                               SP.B           13/13          3 440      标量五对角线求解器 (B规模)
                              LU.A            13/13          3 926     下上高斯-赛德尔求解器 (A规模)
                               sin             1/5           286             正弦计算函数
                               sinc            1/6           351             辛格计算函数
                               cos             1/5           295             余弦计算函数
                               dilog           1/8           340            二重对数计算函数
                             expint_E1         1/6           482           指数积分E1计算函数
                             expint_E2         1/7           522           指数积分E2计算函数
                              clausen          1/6           278           克劳森积分计算函数
                                Ci             1/8           647            余弦积分计算函数
                             bessel_J1         1/6           335            贝塞尔J1计算函数
                             bessel_y0         1/6           307            贝塞尔y0计算函数
                             arclength         1/3            75             弧长计算函数
                               dft             1/3            86            离散傅里叶变换
                               总计             54/138        18 329          18个开源测试用例

                    表  2  的  4  列分别给出了程序名、程序包含的代码文件/函数个数、程序代码行数和程序功能简介. 我们选取
                 了美国航空航天局       NASA  推出的高性能计算基准测试集           NAS parallel benchmarks (NPB) 中的  6  个应用  (涵盖了
   10   11   12   13   14   15   16   17   18   19   20