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 个应用 (涵盖了

