AutoFDO自动反馈式优化_zhou1519的专栏-CSDN博客_autofdohttps://blog.csdn.net/zhou1519/article/details/84139499

目录

什么是AutoFDO?

步骤1:读取程序性能信息

步骤2:处理性能信息以建立内部数据结构(哈希映射)

步骤3:标记控制流图

精度

函数体克隆


什么是AutoFDO?

AutoFDO是指基于程序性能分析工具的反馈式编译优化。不同于传统的基于程序插桩的反馈式编译优化,AutoFDO可以对以优化过的程序进行性能分析,并利用程序的性能信息指导编译器对程序进行再次优化。这意味着AutoFDO可以部署在真实的产品线上,利用程序在生产环境的性能信息对程序进行更精准的优化。

AutoFDO利用如`perf`这样的工具来收集程序的性能信息。然后使用一个独立的工具将perf.data数据转换为gcov格式。gcc通过读取并理解‘’gcov‘’格式的性能信息为程序的基本块标记一个计数值并估计分枝的概率。
AutoFDO的主要步骤

AutoFDO主要可以分为三个步骤:

步骤1:读取程序性能信息

在这个步骤中主要从gcov文件中读取以下信息:

函数名和文件名。
    源文件级的性能信息,主要是建立内联栈到采样计数间的映射。
    模块级的性能信息,主要是建立模块到辅助模块间的映射。

在步骤1中仅仅只是读取数据而不会处理它。并且这一步必须在树解析之前完成,因为后续的LIPO需要使用到模块性能信息。

步骤2:处理性能信息以建立内部数据结构(哈希映射)

这一步将在树解析之后完成,因为处理过程需要用到函数名到它的调试名的映射。以下的哈希映射被用来存储相关的性能信息。

function_htab:从function_name到它的入口块entry_bb计数的映射。
    stack_htab:内联栈到它的采样技术间的映射。
    module_htab:模块名到它的辅助模块名之间的映射。

步骤3:标记控制流图

AutoFDO使用一个控制流图之上的独立优化过程来标记基本块的计数和估计分枝的概率。

完成上述3个步骤之后,所有的性能信息已经被标记到了GCC的中间语言上。AutoFDO接下来使用和传统FDO一样的方式来计算基本模块或者边的频率,以及cgraph中节点或边的计数。

AutoFDO与传统的FDO主要有以下不同之处:

精度

AutoFDO所使用的性能信息并不是精确的,因为:

AutoFDO使用统计的方法来采集性能信息,这会带来一定的随机错误。当总体采样计数较小的时候,这会带来较大的偏差。
    AutoFDO的性能信息是经过标准化后得到的,0次采样并不代表没有被执行。
    AutoFDO的性能信息是使用调试信息来表示的,这可能在已优化后的二进制程序中不是很准确,一些热点基本块可能会拥有0次采样计数。

所以,由于这样的不精确性,必须采用一些优化措施:

  1. * 在寄存器分配阶段,`REG_FREQ_FROM_BB`将会检查entry_bb计数是否为0,以决定是否使用频率信息。在AutoFDO中,这样的检测应该被禁止。
  2. * 在循环展开阶段,一个循环的头可能会与循环的尾具有相同的计数,因此循环迭代是被错误估计的。对于这样的循环,应禁止对它进行展开。
  3. * 当克隆一个函数时,若调用计数为0,FDO使用100%的标准化因子。而AutoFDO则使用0%的标准化因子,因为即使入口计数为0,函数体也可能是热点.

函数体克隆

AutoFDO与传统FDO的最大不同之处在于,AutoFDO是在优化后的程序上进行性能信息采集,而不是测试版、包含调试信息的程序。这使得AutoFDO在处理被克隆的函数时与传统FDO有较大不同。

假设有一个函数`bar()` 被函数foo1()和foo2()调用。若两个调用点使用了早期内联,那么在FDO中只会有一个bar()函数的拷贝。在FDO的优化编译过程中,如果bar()是内联的,那么它的性能计数将会按照它的调用点计数来标准化。

在AutoFDO中,使用O2优化选项优化后的二进制程序被用来收集程序性能信息。假设函数`bar()`被内联进了函数foo1()和foo2(),那么在AutoFDO的性能信息文件中就会有两个bar()函数的拷贝。各个拷贝在各自的调用者的性能信息中,可记为foo1:bar和foo2:bar。同时,将不存在独立的`bar()`函数的性能信息。在AutoFDO的优化编译过程中,当标记bar()函数时,就没有可用的性能信息。

当然,可以考虑把所有函数的拷贝相关的性能信息进行合并以解决上述问题。但在GCC中并没有这样做,当一个函数体被克隆时,GCC会查找在用O2优化选项优化后的二进制程序中是否存在该函数的性能信息,并用它来标记克隆的函数。如果没有相关的性能信息存在,那么GCC就会回退到使用标准化的方法来标记该克隆函数。这使GCC带来了如下改变:

当计算cgraph中一条边的badness时,即使它的计数为0,它依然可能是一个热点,因为它被内联进了它的调用点。然而,要获得内联函数的入口块的计数却是很难的。因此,在GCC中增加了一个afdo_badness变量来比较内联函数中总的计数和最大总的计数。将afdo_badness与传统的badness进行比较,取较小者作为调整后的badness因子。
    当ipa-inline过程检测一条边是否是热点时,AutoFDO同时也会检测调用点内部总的计数是否大于热点的阈值。
    当ipa-inline决定内联一个函数时,AutoFDO会尝试找到相应的性能信息拷贝,并用它的`total_count`值来更新调用节点。如果没有相应的性能信息存在,那么AutoFDO会使用标准化方法来更新内联的调用计数,并将标准化因子添加到哈希映射中,从而使得克隆一个函数体时,可以找到正确的比例来标准化性能信息。

AutoFDO自动反馈式优化相关推荐

  1. 深度学习自动编译和优化技术调研

    深度学习自动编译和优化技术调研 转自:https://moqi.com.cn/blog/deeplearning/ 作者:墨奇科技全栈开发 在墨奇科技,我们需要将一些包含深度神经网络(DNN)的 AI ...

  2. 【机器学习】算法模型自动超参数优化方法

    什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...

  3. 全网最全:机器学习算法模型自动超参数优化方法汇总

    什么是超参数? 学习器模型中一般有两类参数,一类是可以从数据中学习估计得到,我们称为参数(Parameter).还有一类参数时无法从数据中估计,只能靠人的经验进行设计指定,我们称为超参数(Hyper ...

  4. 反馈式神经网络之HNN

    反馈式神经网络之HNN 神经网络 神经网络的简介 人工神经网络(Artificial Neural Network,即ANN ),它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的 ...

  5. 智源青年科学家梁云:异构系统中张量计算的自动调度和优化框架

    与6位图灵奖得主和100多位专家 共同探讨人工智能的下一个十年 长按图片,内行盛会,首次免费注册 北京智源大会倒计时:9天  计算机体系结构领域国际顶级会议每次往往仅录用几十篇论文,录用率在20%左右 ...

  6. [ZZ].NET自动探索式测试工具——Pex

    作者 Al Tenhundfeld译者 霍泰稳 发布于 2008年7月20日 下午9时2分 社区 .NET 主题 单元测试 标签 测试驱动开发, MbUnit, MSTest, xUnit.Net P ...

  7. MQ100门座起重机 双螺旋输送机总装图 减速机图纸 自动圆式焊机总装图 VF6-7空气压缩机曲轴加工工艺及夹具设计 组合机床工艺设计 RV蜗轮蜗杆减速机 90度皮带机运载机器人设计……

    MQ100门座起重机 双螺旋输送机总装图 减速机图纸 自动圆式焊机总装图 VF6-7空气压缩机曲轴加工工艺及夹具设计 组合机床工艺设计 RV蜗轮蜗杆减速机 90度皮带机 运载机器人设计 HBGL120 ...

  8. M100自动吞吐式读写器读卡器在C#程序如何通过函数调用读取社保卡卡号

    M100自动吞吐式读写器读卡器在C#程序如何通过函数调用读取社保卡卡号? 1.M100自动吞吐式读写器通过M100演示程序,点"读社保卡号"能读出来,如下图: 2.如何通过C# 程 ...

  9. 6N6+6N1的反馈式并联稳压电路

    电子管的反馈式稳压电路资料很少 这儿是一个计算设计过程: 图如下: 这个电路大概能实现1mV以下的稳压效果,但是这个线路对输入的波纹很敏感,必须是有规律的类似于正弦波的波纹才能得到最佳的效果.如果输入 ...

最新文章

  1. codevs 1082 线段树区间求和
  2. 大促场景下云通信高可用、稳定性实战
  3. 真诚推荐7个能助你成长的前端大佬
  4. 基于Topic消息路由的M2M设备间通信Node JS SDK 示例
  5. java web删除文件_Web开发为了java端程序能删除文件的解决办法
  6. C#LeetCode刷题之#387-字符串中的第一个唯一字符(First Unique Character in a String)
  7. C语言学习笔记---枚举类型enum
  8. linux初始化进程
  9. 2019年第一份DApp调查报告出炉
  10. 高通平台Bring-up
  11. python数据可视化仪表盘,Python 数据可视化?
  12. BIM知识 | BIM管线综合原则
  13. mumu模拟器cpu设置_网易mc怎么提高fps
  14. SEO与爱情,十字路口中的抉择
  15. No all pattern found! file already patched?
  16. MATLAB生成一段音乐《小星星》
  17. 定积分求解方法——分步积分法
  18. JAVA性能优化,让程序更快更稳定
  19. C++运算符重载函数
  20. canvas实现走势图实现

热门文章

  1. es6中class类的全方面理解
  2. LeetCode第12题 整数转罗马数字
  3. mongodb 权限设置--用户名、密码、端口
  4. 个人总结---连通图的最小生成树算法
  5. .view-content:overflow:hidden 大错误
  6. VMware 禁用虚拟内存文件,提升虚拟机响应速度 .
  7. 今天的练习是敏捷结果30天的最后一天
  8. postgreSQL源码分析——索引的建立与使用——各种索引类型的管理和操作(2)
  9. eclipse中git的配置、提交代码、从远程导入代码
  10. curry化 js_前端发动机从 bind 聊到 curry (柯里化)