Managing Performance vs. Accuracy Trade-offs With Loop Perforation

3. 精度度量(误差度量)

精度度量是原始程序的输出与在相同输入上运行的穿孔程序的相应输出之间的差异,
度量分解为两个部分:一个输出抽象,它将输出映射到一个数字或一组数字;
一个精度计算,它度量来自原始执行和穿孔执行的输出抽象之间的差异。
输出抽象通常从一个或多个输出文件中选择相关的数字,或者计算输出质量的度量(例如峰值信噪比)。
许多近似计算都带有已经定义和可用的质量度量(参见第5节)。
在这里插入图片描述
度量acc用加权平均数表示原始程序和穿孔程序之间输出抽象的差异,
原始程序的输出抽象o1, . . . , om
穿孔程序的输出抽象o ˆ1, . . . , oˆm,
wi表示,第i个输出抽象的相对重要性。
acc越接近与0,表示穿孔程序的输出越精确。

4.穿孔的探索

4.1. 循环穿孔空间探索算法:

输入:应用程序、应用程序的精度度量、一组训练输入、精度边界b(应用程序可接受的最大精度度量,即阈值)和一组射孔率(在我们的实验中,为0.25、0.50、0.75和1次迭代)。
输出:给定阈值下,在应用程序内一组可以穿孔的循环
算法产生一组循环,以指定的穿孔率进行穿孔。

4.2. 临界测试:

目的:在一组有代表性的输入和阈值下,得到一组可调循环和穿孔率的集合
1)临界性检测算法(算法1)从一组候选循环L和穿孔率R开始。L由至少占执行指令1%的循环组成,通过分析确定,(在前25个循环之后截止)。
2)通常,执行一个候选循环可能会导致程序崩溃,产生不可接受的输出,产生一个无限循环,或者减少性能,叫做关键循环。算法1的目的是在候选循环集合中寻找并去除这些关键循环,*
- [ ] 这里的关键循环也可以称之为敏感循环。*(代办的内容都是自己的理解)
3)该算法按指定的穿孔率依次穿孔每个循环,然后在训练输入上运行穿孔程序。记录加速度和精度度量(误差)acc,(算法内容)。如果平均acc<b阈值,且平均sp>1,执行4)。
4)出现以下情况过滤掉循环: 流程是(对于所有有代表性的输入,检测错误,即以下三种情况,如果出现就过滤掉,没出现,就保存在P中,P是可调优循环的集合)
4.1) 没有改善性能(以加速sp来衡量,它是穿孔应用程序的执行时间除以在相同输入上运行的原始未穿孔程序的执行时间),(注意:一个输入对应一个穿孔执行时间,因为是选择一组有代表性的输入,所以对于同一个循环和穿孔率,有多个输入,就有多个穿孔输出,所以取其平均值,精度度量-阈值acc也是同样的道理
4.2)导致应用程序超出精度边界b
4.3)引入内存错误(如越界读写、未初始化内存的读取、内存泄漏、重复释放等)。如果内存错误导致执行在某个输入t上崩溃,则其精度损失为∞
5)临界性测试的结果是一组可调循环
P = = {<l0,r0>, . . . ,<ln,rn>},
<li,ri>表示循环li的穿孔率为ri
我的想法:性能对应执行时间,穿孔之后,计算对应的穿孔运行时间和精度损失,选择运行时间率小于1且精度损失<阈值的指令。按照精度损失从小到大依次排列。进行折半穿孔。
在这里插入图片描述
算法具体流程如下:同一循环,不同的穿孔率进行穿孔;由于有一组有代表性的输入,即多个输入,所以,同一个穿孔率,一个输入就有一个穿孔结果,对应一个加速度和一个精度度量,综合,多个输入,就有多个穿孔结果,多个加速度,多个精度度量,取其平均值。
首先,该算法按指定的穿孔率依次穿孔每个循环,然后在训练输入上运行穿孔程序。记录加速度和精度度量(误差)acc,。如果平均acc<b阈值,且平均sp>1,执行4)。
出现以下情况过滤掉循环: 流程是(对于所有有代表性的输入,检测错误,即以下三种情况,如果出现就过滤掉,没出现,就保存在P中,P是可调优循环的集合<ri,li>)

4.3. 穿孔空间探索算法:

目的:给定的精度阈值内,得到程序中可以穿孔的循环,对于每个循环且是最好的穿孔率。
论文提出了两种算法(穷举和贪婪)来权衡穿孔程序的性能和精度空间。

4.3.1 Exhaustive Exploration Algorithm. 详尽的探索算法

算法介绍:详尽穿孔空间探测算法从一组可调优循环开始,详尽探测在指定的穿孔率R,可调优循环L的所有组合。(注意:临界测试达到的是P,P是一组循环对应穿孔率的集合,比如循环L1对应穿孔率R0,一直到循环Ln对应穿孔率Rn,所以<Li,Ri>是一个组合,P指所有组合)
算法过程:1)该算法在所有训练输入上执行所有的组合,并记录结果的加速度和精度。
---------------2)还在Valgrind下运行每个组合,如果Valgrind检测到内存错误,则丢弃该组合。( Valgrind A Program Supervision Framework. 检测内存错误的框架),
---------------3) 使用这些结果来计算在诱导性能和精度权衡空间中的帕累托最优射孔集(Pareto-optimal perforations)
---------------4) 如果没有其他穿孔可以同时提供更好的性能和准确性,那么射孔就是帕累托最优的。
算法总结:这种方法对于那些将大部分时间花费在相对较少的循环中的应用程序(例如我们的基准测试集中的应用程序)是可行的。如果详尽探索不可行的话,可以使用贪婪算法,或者去掉足够多的时间消耗最少的可调循环,使详尽探索可行。或者混合方法也是可能的。

4.3.2 Greedy Exploration Algorithm(贪婪探索算法)

目的:给定的精度阈值内,得到程序中可以穿孔的循环,对于每个循环且是最好的穿孔率。
输入:给定的精度临界b,一组循环和相应的穿孔率,
输出:对于b的最大化性能S集合
在这里插入图片描述
算法核心:该算法使用一种启发式评分度量来对循环/穿孔率对进行优先排序。
一对Li , Ri 的评分指标是基于估计穿孔程序的性能增加和精度损失这两项的调和平均值
在这里插入图片描述
调和平均值的理解:
是<L, R>在所有训练输入上加速度和精度度量的平均值,b精度阈值。与其他基于算术平均或几何平均的启发式函数相比,这种基于调和平均值的度量需要更高的性能提升来选择导致精度损失小幅增加的循环。
算法过程:1)该算法首先计算一组对p’。
--------------- 2)对于每个可调循环l, p’包含<hi,ri>对,即最大化 score< hl,ri>的<hi,ri>对。
----------------3)然后根据score< hi , ri>对p’中的对进行排序,该算法保持了一个集合S,即<L,R>对,可以在不违反精度边界b的情况下一起穿孔。因为S内的对有第五步的条件。
--------------- 4)在每一步,该算法产生一个新版本的应用程序因为循环在S∪<hl,ri>穿孔。
----------------5)如果这额外的<hi,ri>对穿孔使得总体损失精度在b范围内,则把对<hi,ri>加到S中。
注意的是:对于每个循环L,算法考虑的仅仅是最好的穿孔率R,根据 score< hl,ri>得知。

自己的总结:
本文主要考虑了以下几点:1)穿孔可能造成程序性能减少,因此过滤掉穿孔使程序性能减少的循环。只穿孔性能有提升,且精度损失在一定范围内的指令或循环。本文,是循环穿孔的元老级论文,没有考虑,迭代和指令对程序性能的影响。
2)使用 Valgrind工具检测内存错误,内存错误可以导致程序崩溃,所以过滤掉内存错误的循环等同于过滤掉敏感循环。
3)采用启发式评分度量,score,不明白引入score的目的,除了说明性能提升多导致精度损失多之外,还有什么用;另外,用score排序,原因目的是什么。
4)引入S,对于<hi,ri>穿孔,只要损失精度在精度阈值内,就保存到S中,作为最终需要穿孔的循环。

算法总结:这种方法对于那些将大部分时间花费在相对较少的循环中的应用程序(例如我们的基准测试集中的应用程序)是可行的。如果详尽探索不可行的话,可以使用贪婪算法,或者去掉足够多的时间消耗最少的可调循环,使详尽探索可行。或者混合方法也是可能的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值