一种基于程序重写的浮点程序精度缺陷修复方法技术

技术编号:38210426 阅读:10 留言:0更新日期:2023-07-21 17:01
本发明专利技术公开了一种基于程序重写的浮点程序精度缺陷修复方法,用以提升浮点计算的准确性,属于浮点运算技术领域;该方法中以浮点程序作为输入,首先提出一种取样

【技术实现步骤摘要】
一种基于程序重写的浮点程序精度缺陷修复方法


[0001]本专利技术属于浮点运算
,具体涉及一种基于程序重写的浮点程序精度缺陷修复方法。

技术介绍

[0002]浮点运算被广泛应用于航空航天、汽车、医疗设备、科学计算、视频播放、物理仿真等各个领域中,目前科学计算大都遵循IEEE754标准,在这个标准下计算机所能表示的大多数浮点数是真实值的近似值,实数域上的任何区间内都有无限多个实数,但计算机只能提供有限的存储空间。由于计算机对实数的近似表示,浮点计算中的舍入误差以及精度损失是无法避免的,而数值程序中的计算误差累积可能会导致计算结果大幅偏离正确值,使得程序输出无法满足用户对结果的精度需求,产生精度缺陷。由于计算精度有限,浮点程序计算出的浮点结果可能会偏离预期结果,实现一个结果完全准确的数值计算软件是十分困难的。
[0003]目前,很多学者致力于浮点程序的误差检测、精度提升等相关领域,用以修复精度缺陷。但传统通过数学规则进行变换生成新表达式来提升浮点表达式的输出精度方法中,只尝试减少程序执行过程中浮点计算引入的误差来修复精度缺陷,没有针对病态问题引发的精度缺陷的有效修复方法。例如M.Martel等提出的Salsa对一些简单的浮点程序有较好的优化效果,且时间开销较小,但由于Salsa要求代数等价性,导致程序变体数目有限,降低了找到最优变体的可能性;严重依赖于静态分析对误差界的分析精度,若分析精度不足会严重影响优化效果;静态分析的方法也使其无法应用于部分包含数学函数的复杂表达式;并且其在进行表达式间转换时忽略了特定精度的操作,以上种种原因使其难以在实际应用中的浮点程序中使用。
[0004]另外,Panchekha等开发了自动提升浮点表达式精度的工具Herbie,该工具使用MPFR检测浮点表达式的精度缺陷,该工具针对包含数学函数的复杂表达式有良好的效果,但由于其只针对单个表达式,无法应用于整个浮点程序,所以对实际的工程项目仍帮助有限。

技术实现思路

[0005]本专利技术的目的是:解决传统精度缺陷修复方法中未对特定精度缺陷进行修复以及适用范围仅针对单个表达式的问题,提供一种基于程序重写的浮点程序精度缺陷修复方法,通过对浮点程序中的特定精度操作进行筛选隔离,并基于变量映射对浮点操作进行表达式以及函数间的重组变换,最后经表达式重写达到修复精度缺陷的目的,提高修复能力、且能够应用于实际工程的整个浮点程序中。
[0006]为实现上述目的,本专利技术采用了以下技术方案:一种基于程序重写的浮点程序精度缺陷修复方法,包括以下步骤:
[0007]S1、采用IEEE754标准规定的浮点格式表示浮点数:
[0008]一个浮点数x由IEEE754标准表示如下:
[0009]x=s
·
(d0·
d1...d
p
‑1)
·
b
e
=s
·
m
·
b
e

p+1
,式中,s∈{1,1}为符号位,m为尾数位,b为基数,在计算机中b=2,其中,0≤d
i
≤b为浮点数的精度,0≤i≤p

1,e代表指数位,e∈[e
min
,e
max
];
[0010]S2、对输出浮点程序内的浮点操作进行特定精度代码筛选隔离:
[0011]特定精度的筛选隔离操作包括取样:根据上述步骤S1中浮点数的表示规则,覆盖浮点数所有指数阶码,并在每个阶码下按照同等间隔均匀生成测试集;
[0012]替换:针对浮点程序中有常量参与运算的浮点表达式依次替换为更高精度执行,并将高精度执行结果所产生的平均相对误差与原平均相对误差对比,若误差变大则认为本次改动的操作为特定精度操作;
[0013]分类:将识别出的特定精度操作所赋值的变量加入保留操作集,其余操作归入待转换操作集并对函数内调用的子函数进行代码写入;
[0014]S3、根据预设的表达式切片大小和内联因子参数对浮点操作进行表达式以及函数间的重组变换:
[0015]函数间的重组:假设在浮点程序中函数F调用了函数sum,将函数sum的主体嵌入到函数F中,并用函数F传入函数sum的实参代替函数sum内部原本的形参;
[0016]表达式间的重组合并:定义状态集(c,δ,C,v,β),其中,c为一条浮点表达式,δ是一个赋值语句集合δ:V

Expr,在δ中把每个变量映射为一个浮点表达式,环境δ用于丢弃程序中的分配,并在读取变量时重新插入表达式,对任意一个包含赋值操作的浮点表达式,若被赋值变量v1=e不存在于δ中、v1不等于目标变量v,则在δ中记录e且在程序中删除该赋值语句;若上述三个条件有一个不满足,则用记录在δ中的表达式替换该变量;
[0017]表达式间的重组过程为:原浮点程序为1.const double sqrty=sqrt(y);2.const double ampl=(0.75+ca.val)/sqrty;3.result

>val=ampl*cp.val;重组后的程序为1.result

>val=((0.75+ca.val)/sqrt(y))ampl*cp.val;
[0018]在上述变量映射中,将每一个变量映射为一个数组,将同一变量的第n次赋值操作记录在下标为n的对应变量数组元素中,映射后变量的程序为SSA形式的浮点程序,并作为语句间重组规则的输入程序;
[0019]S4、对重组后的表达式进行表达式重写和写回源程序:
[0020]将上述步骤S3中重组后的表达式作为输入,并采用工具FPTool把表达式转换为FPCore格式的表达式输出,重写后的表达式为:(FPCore(ca.val cp.val y)(*(/(+0.75ca.val)(sqrt y))cp.val));
[0021]并经工具Herbie重组后写回浮点程序,写回源程序的表达式为:result

>val=fma(cp.val,sqrt(0.5625/y),((cp.val/sqrt(y))*ca.val));
[0022]工具FPTool的转换过程为:FPTool定义了两个栈,VarStack用来存储变量,SignStack用来存储操作符;首先对原表达式按字符进行读取,若为变量直接存入VarStack,若为加减运算符,则判断栈VarStack是否为空,为空则入栈,若不为空且栈顶为加、减运算符,则选取当前栈顶符号出栈以及VarStack栈顶两个元素出栈,拼成新的表达式后作为变量再推入栈VarStack;若栈顶为乘、除运算符,则循环进行上述操作直至栈顶为加、减运算符或栈SignStack为空;
[0023]S5、对写回源程序后的表达式判断其误差:
[0024]对上述步骤S4中写回源程序后的表达式判断其相对误差,若精度提升则保留当前方案,若精度下降则舍弃本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于程序重写的浮点程序精度缺陷修复方法,其特征在于:包括以下步骤:S1、采用IEEE754标准规定的浮点格式表示浮点数:一个浮点数x由IEEE754标准表示如下:x=s
·
(d0·
d1...d
p
‑1)
·
b
e
=s
·
m
·
b
e

p+1
,式中,s∈{1,1}为符号位,m为尾数位,b为基数,在计算机中b=2,其中,0≤d
i
≤b为浮点数的精度,0≤i≤p

1,e代表指数位,e∈[e
min
,e
max
];S2、对输出浮点程序内的浮点操作进行特定精度代码筛选隔离:特定精度的筛选隔离操作包括取样:根据上述步骤S1中浮点数的表示规则,覆盖浮点数所有指数阶码,并在每个阶码下按照同等间隔均匀生成测试集;替换:针对浮点程序中有常量参与运算的浮点表达式依次替换为更高精度执行,并将高精度执行结果所产生的平均相对误差与原平均相对误差对比,若误差变大则认为本次改动的操作为特定精度操作;分类:将识别出的特定精度操作所赋值的变量加入保留操作集,其余操作归入待转换操作集并对函数内调用的子函数进行代码写入;S3、根据预设的表达式切片大小和内联因子参数对浮点操作进行表达式以及函数间的重组变换:函数间的重组:假设在浮点程序中函数F调用了函数sum,将函数sum的主体嵌入到函数F中,并用函数F传入函数sum的实参代替函数sum内部原本的形参;表达式间的重组合并:定义状态集(c,δ,C,v,β),其中,c为一条浮点表达式,δ是一个赋值语句集合δ:V

Expr,在δ中把每个变量映射为一个浮点表达式,环境δ用于丢弃程序中的分配,并在读取变量时重新插入表达式,对任意一个包含赋值操作的浮点表达式,若被赋值变量v1=e不存在于δ中、v1不等于目标变量v,则在δ中记录e且在程序中删除该赋值语句;若上述三个条件有一个不满足,则用记录在δ中的表达式替换该变量;表达式间的重组过程为:原浮点程序为1.const double sqrty=sqrt(y);2.const double ampl=(0.75+ca.val)/sqrty;3.result

>val=ampl*cp.val;重组后的程序为1.result

>val=((0.75+ca.val)/sqrt(y))ampl*cp.val;在上述变量映射中,将每一个变量映射为一个数组,将同一变量的第n次赋值操作记录在下标为n的对应变量数组元素中,映射后变量的程序为SSA形式的浮点程序,并作为语句间重组规则的输入程序;S4、对重组后的表达式进行表达式重写和写回源程序:将上述步骤S3中重组后的表达式作为输入,并采用工具FPTool把表达式转换为FPCore格式的表达式输出,重写后的表达式为:(FPCore(ca.val cp.val y)(*(/(+0.75ca.val)(sqrt y))cp.val));并经工具Herbie重组后写回浮点程序,写回源程序的表达式为:result

>val=fma(cp.val,sqrt(0.5625/y),((cp.val/sqrt(y))*ca.val));工具FPT...

【专利技术属性】
技术研发人员:王磊王军强赵荣彩胡传平
申请(专利权)人:河南省核芯微电子科技有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1