Page 7 - 《软件学报》2025年第12期
P. 7
5388 软件学报 2025 年第 36 卷第 12 期
编译优化会将程序代码段转换为功能等价的更高质量的代码段, 已经成为开发人员优化程序性能最主要的途
径之一. 然而, 开发人员往往并不知道每个编译优化选项背后所执行的具体优化策略, 特别是认识不到相同的编译
选项在不同编译器内的优化含义也是不同的, 例如 Intel 编译器 ICC 与 GNU 编译器 GCC 在-O3 选项下会执行不
同的优化策略. 很多激进编译优化策略会改变浮点操作的语义, 导致程序的计算结果发生改变, 这种现象称为编译
[1]
优化结果不一致性 (compilation optimization-induced result inconsistency) .
浮点数是实数在计算机内部存储表示的事实标准. 受限于浮点数的有限精度编码问题, 舍入误差 (rounding
error) 不可避免. 浮点运算不满足实数运算相关的优化理论, 例如结合律和分配率. 浮点融合乘加 (fused multiply
add, fma) 是高性能计算领域广泛应用的性能优化手段, 然而 fma 操作比 fmul 和 fadd 序列少了一个浮点舍入步骤,
会导致计算结果产生差异性. 为了解决融合乘加所带来的结果差异性, 工程实践中常通过-ffp-contract=off 选项来
禁用浮点表达式收缩优化. 为了提升程序性能, 程序开发人员在编译时会使用一些 IEEE-Unsafe 的激进编译优化
选项 (例如-freciprocal-math 和-fassociative-math) [2,3] , 这也会导致结果不一致性. 例如 GCC 编译运行单精度表达式
1.23+1E10–1E10 时, -O0 选项的结果为 0 (1.23 会在第 1 步求和时被舍入), 而-O3 -ffast-math 选项会将表达式直接
优化为 1.23.
有效发现编译优化结果不一致性并定位导致结果不一致性的问题代码对于科学计算的结果可复现性和性能
优化具有重要意义 [4] ; Varity 使用随机差分测试来检测编译优化结果不一致性, CIV 在输入空间内进行启发式搜
[5]
[6]
索获得触发编译优化结果不一致性的输入. 编译优化结果不一致性问题代码定位主要基于代码精度增强或者编译
选项回归的二分搜索 (例如 FLiT [2,3] 、PLiner 和 CIEL ). 在定位到导致编译优化结果不一致性的代码后, 程序开发
[4]
[7]
[8]
[4]
人员可以仅对该部分问题代码进行高精度浮点执行 (例如 PLiner ) 或者浮点表达式精度增强重写 (例如 Herbie 、
AutoRNP 和 [9] ACESE [10] ), 使得程序既能获得高级别编译优化所带来的性能提升也满足计算结果的可复现性.
[4]
本文主要关注如何更高效地定位导致编译优化结果不一致性的代码段. 当前最先进的定位工作是 PLiner ,
一种基于浮点语句精度增强的二分搜索定位工具; PLiner 会将可疑代码段中的浮点语句提升为高精度 (long
double) 执行, 如果程序精度增强变换后编译优化结果不一致性消失, 则表示触发结果不一致性的问题代码位于被
精度提升的代码段中, PLiner 会进一步采用二分搜索来缩小问题代码范围; PLiner 会在函数级、循环级、基本块
级和语句级不断采用二分精化搜索来定位问题代码.
然而, PLiner 主要存在两方面不足: (1) 不能有效支持多源问题代码段的定位. 例如当导致编译优化结果不一
致性的问题代码分布在两个不同的函数内时, 可能会导致二分搜索定位失效; (2) 对搜索域内的所有代码进行二分
搜索导致问题代码定位效率不高. 激进编译优化对不同代码段的影响程度不同, 考虑到高精度浮点的巨大执行开
销, 将浮点计算行为未发生改变的浮点代码段也转换为高精度模式并执行会显著增加问题代码定位的时间开销.
为了解决现有编译优化结果不一致性问题代码定位方法存在的问题, 本文提出了一种浮点指令差异性引导
的 Delta-Debugging [11] 定位方法 FI3D (floating-point instruction difference guided Delta-Debugging). 一方面, 与传统
的二分搜索定位不同, FI3D 采用 Delta-Debugging 搜索策略, 借助其内部的回溯机制解决了现有方法对多源问题
代码定位支持不够的问题; 另一方面, FI3D 基于函数在编译优化前后的浮点指令序列差异性对函数进行过滤排
序, 过滤掉那些编译优化前后浮点计算行为未发生改变的函数, 并优先对浮点指令序列差异性大的函数进行搜索,
显著提升了问题代码定位效率. 在开源 NPB 测试集 (https://www.nas.nasa.gov/software/npb.html)、GSL 数学库 [12]
[13]
和 floatsmith 混合精度测试集上的对比实验显示, FI3D 的定位能力和定位效率都显著优于当前最先进工具 PLiner.
本文的主要贡献可归纳如下.
(1) 提出了一种基于 Delta-Debugging 搜索的编译优化结果不一致性问题代码定位方法, 与当前最先进工具
PLiner 相比, 该方法能够有效支持多源问题代码的定位.
(2) 提出了一种基于编译优化前后函数浮点指令序列差异性的代码过滤和排序机制, 能够有效提升问题代码
的搜索定位效率.
(3) 基于 NPB 测试集中的 6 个典型应用、GSL 数学库中的 10 个函数和 floatsmith 混合精度测试集中的 2 个
程序对本文方法进行了评测, 实验结果表明: 本文方法能够成功定位 PLiner 失效的 4 个测试用例, 且对 PLiner 定

