12步法-用英特尔的性能工具诊断性能问题

intel_zhenyuwang 2008-09-11 05:04:24

我的原贴地址

挑战
用户可能会感到很难使用英特尔® VTune 性能分析器和线程档案,因为他们可能不知道如何入手,使用这些工具 解决方案

基本理念 - 三个层次的调优
1 。 系统级的性能调整。 这些问题并非CPU的有关问题,即是,系统I / O瓶颈问题,如网络带宽,磁盘读/写速度,记忆体页错误,设备I / O数据业务等。用户知道这些问题通常是由有限的系统资源或系统配置不正确引起的。

2 。 应用程序级的性能调整。 一些算法可能造成的性能问题。 特别是用户可以改变单线程的应用为多线程应用程序,以最佳利用系统资源,在多核心平台。

3 。 微架构性能调优。 性能问题所造成的CPU资源阻塞,这可能是缓存读错,分支预测错,重新排序缓冲区满 ,缓存存取冲突,Bus过渡延误,是uops不融合,与x87的SIMD操作,等等。

步骤- 1 (可选)使用Counter Monitor知道,是否系统是健康的,在许多 I / O操作环境下。
用户可以跳过这一步,如果没有大的I / O的任务计划

如果用户的应用提供来自服务器上的服务,第一是确认,是否有很好的硬件配置来运行程序。 例如,如果应用程序充当数据库管理员-有很多来自客户端的请求访问服务器上的数据库,该系统应该有足够的网络带宽和硬盘的读取/写入速度同时来处理所有的要求。 英特尔® VTune 性能分析器提供Counter Monitor功能,找出系统级的瓶颈,在监测的时间这是一组预设的操作系统对象。 其实,用户可以改变选择的系统对象,用户如果有兴趣 - 例如,逻辑磁盘性能对象和网络接口的对象。

图1 [img=http://photo14.hexun.com/p/2008/0910/243292/m_D929944C33BD4CDABE6E0B6AF43B7A74.jpg]图1[/img]

步骤 - 2 使用调用图观察函数的“自我时间” , “总时间 ” ,调用者/被调者的关系,调用计数来改变算法

VTune 性能分析器提供了调用图功能,收集函数的性能数据。 用户的程序应工作在用户模式,并提供相应的符号文件,以便调用图将二进制文件重新组装。 当调用图启动重新组装的二进制文件,从vtune库插入的函数将记录性能数据对每个函数。 用户可以找到一个关键路径(即消耗大部分的CPU时间) ,其中包括调用序列(从根节点)。 调用图显示了厚厚的红边在图形,以便显示,最重要的。 有三个指标,用户必须检查:
1 。 自我时间-时间(微秒)用在函数的自我
2 。 总时间-时间(微秒)花费在函数和所有子程序
3 。调用计数- 所有的被调用次数

通常该用户已找到最大的“自我时间” 函数来进行验证,如果我们可以改变的实现的方法,以减少指令数(或在微架构的基础上优化) 。 有时用户会发现函数是“微小的” ,但“自我时间”的值很大,既然有大的“调用”的次数。 用户可以检讨,是否每次调用是必要的或可重用函数的返回值。 如果“调用者”是有限的,我们可以宣布这个“微小的”的函数,作为“内联” ?

图2 [img=http://photo14.hexun.com/p/2008/0910/243292/m_33DFA4066649320017195B85EB1C3E6B.jpg]图2[/img]

步骤- 3 (可选)审查调用图结果在“等待时间”和“总等待时间”中知道线程的阻塞时间
如果您的应用程序是不是多线程,只要跳过这一步

有时函数进行了优化,但仍表明,在“自我时间”或“总时间”上执行缓慢,这是因为大的值,在 “等待时间”或“总等待时间” 。
1 。自我的实际时间=自我时间-等待时间
2 。总的实际时间=总时间-共计等待时间

用户可以知道的性能瓶颈,在确切的函数所造成的线程的等待时间。为挖掘出根源,用户可以使用线程档案,以了解更多细节。但是,如果原因是非常简单,使用者可以直接修改代码。

图3 [img=http://photo14.hexun.com/p/2008/0910/243292/m_36CC4D36E553F7F68DB46811FF8C1B33.jpg]图3[/img]

步骤- 4 (可选)使用的SOT (Sampling Over Time)的结果知道的工作量不平衡,在所有线程
如果您的应用程序是不是多线程,请跳过这一步

VTune 性能分析器提供的抽样数据收集性能数据,在系统模式。这是不同于调用图的功能 - 采样,将收集所有的性能数据,而不是只为目标的应用,而且还为所有活动应用在该系统。

采样图形报告提供的SOT的功能,结果可显示在时间线上。事实上,线程报告(对具体目标的进程)告诉用户的工作量和花费时间,在收集期间-特别是知道不平衡的工作量在不同的线程。

图4 [img=http://photo14.hexun.com/p/2008/0910/243292/m_371E69E91D0A7C6BC5C3F2B0DD0FB304.jpg]图4[/img]

步骤- 5使用线程档案知道“关键路径” , “并发水平”

对多线程应用,英特尔®线程档案是最好的工具享誉业界,知道更详细地信息-包括汇总数据,性能数据在每个线程

用户需要做的源文件组装(用户应与英特尔® C + +编译 / Qtprofile 工作)或二进位档案组装(需提供相应的符号文件) ,则组装的目标模块将被分析在运行时间。

关键路径值表示应用的整体执行时间。请注意,每个线程有本身的关键路径值。用户可以更改代码,然后验证,利用关键路径值判断代码变化是否有效。

并发的水平(百分比)表明,占多少百分比的整体时间处于闲置,串行,利用,充分利用,过度利用。请注意,每个线程本身的值,表明每个线程并行度。


图5 [img=http://photo14.hexun.com/p/2008/0910/243292/m_8CF4C1E4B742CC0726C26FC8A3281BE4.jpg]图5[/img]

步骤- 6检查每个线程整体的“活动” , “自旋” , “等待”时间

英特尔®线程档案,帮助用户检查每个线程的详细数据,通常是关注的数据,应该是“活动的时间” , “自旋时间”和“等待时间” 。请注意,活动时间是指代码是否已作好运行准备(不管系统资源是不可用) ,或它已经是在运行状态。 “自旋时间”表明,该线程等待系统资源的释放,这将消耗处理器时间,因为它不断地问,在锁被释放前。 “等待时间” ,并不消耗处理器时间,因为线程将有专函通知,当系统资源被释放。

用户的任务是,增加“活动时间”为线程的运行消除障碍。 “自旋时间”不应该在代码,因为它的浪费处理器时间,其他工作要做的是减少“等待时间”。

图6 [img=http://photo14.hexun.com/p/2008/0910/243292/m_813F2C6513F9969103D76984A3EB254B.jpg]图6[/img]

步骤- 7深入到每个线程知道活动时间,等待时间,同步对象

在以找到”障碍”的根源的,就是并行度和等待时间,用户必须检查所有同步对象知道如何停止线程运行。请检阅图- 7 ,尽量少花时间在“Critical Section” ,但主线程,花了很长时间的“Fork-join”等待完成其他4个线程。还注意到,该工作量的4个线程是不平衡的。

图7 [img=http://photo14.hexun.com/p/2008/0910/243296/m_AD7358F8D4834A0C3972DC9994D558BE.jpg]图7[/img]

步骤- 8审查时间线,深入到有关线程的活动,联系关键代码

线程档案简介只能提供性能数据对关键路径,并发水平,活跃的时间,自旋的时间,等候时间和同步对象。不过,当它发生用户无法找到原因, 没有相应的源代码。

我们需要过滤性能数据和重点,对敏感的时间,看看有什么事。我们亦要研究的源代码来验证这个问题。

这是比较容易选择的兴趣范围,在时间线(放大)知道线程的活动,请注意,线程的个人资料查看的数据将会有所改变(自动过滤)。用户可以按一下滑鼠右键,具体活动(线程的过渡,加入等) ,以深入到相应的源代码。

图8-1 [img=http://photo14.hexun.com/p/2008/0910/243296/m_F8B0837BCF0BA947B73BFB332F1C2A0B.jpg]图8-1[/img]

图8-2 [img=http://photo14.hexun.com/p/2008/0910/243296/m_8EAA9D5EA3F85E09780D290260F25D26.jpg]图8-2[/img]

步骤- 9重新设计算法和更改代码,比较的结果,重复步骤- 5

在这个步骤中,用户通常会认识的缺点,在该算法中,做一些改进,然后在代码。它可能包括-
1 。分裂的大任务分成几个小任务,并行执行他们
2 。保留所有子任务的工作量平衡,在每个线程
3 。重新评估同步对象,其中的影响,性能,使用轻同步对象,如果有必要
4 。增加的数据吞吐量在每个线程
5 。其他

步骤- 10使用的抽样数据收集为CPU事件cpu_clk_unhalted.core和inst_retired.core知道热点函数

我们可能会考虑在微架构上调整代码,用VTune性能分析器的采样数据收集。

首先,用户可以使用预设的事件,名称cpu_clk_unhalted.core和inst_retired.core采样收集数据。

请看结果,用户必须付出更多的注意“Top n ”的函数,其中有沉重的cpu_clk_unhalted.core样本,因为这些函数消耗更多的处理器的时候程序运行。然后该用户检查哪一个是最大的CPI在这些“顶级n ” -CPI的意思是“平均每条指令花费的机器周期”

图10 [img=http://photo14.hexun.com/p/2008/0910/243296/m_D19ACB71F13373C1B170A1BF3160637B.jpg]图10[/img]

步骤- 11检讨性能数据和使用其他的CPU事件,以找到确切的性能问题

在这个步骤中,用户已挖掘出来的确切原因,知道为什么有那么多时间花费在热点的函数。例如,CPI= 65 ,浮动的运作这是造成是许多昂贵的消耗CPU时间。让我们添加新的事件命名x87_ops_retired.any

因此,用户用具体的事件处理器, 很快可以找出问题在源代码。

图11 [img=http://photo14.hexun.com/p/2008/0910/243296/m_43877900EB3DF05745A1A6B729C8DA68.jpg]图11[/img]

步骤- 12修改代码或使用先进的编译器开关,重建代码,与优化前的热点函数比较的结果,重复步骤10 ,直至表现感到满意

这一步,取决于使用者的知识,处理器的微架构和软件的优化技巧。举例来说,当用户知道,浮动的运作,导致cpu_clk_unhalted.core高,他们可能会使用英特尔® C + +编译器与/ qxp切换到生成代码的优化,为分流的SIMD扩展指令集。

请见图12 ,这是结果后,使用英特尔® C + +编译器,以减少cpu_clk_unhalted.core样本。

图12 [img=http://photo14.hexun.com/p/2008/0910/243296/m_840D71F044D745BC6F9980B55BFA9B73.jpg]图12[/img]

总结
此文章协助有兴趣使用英特尔® VTune性能分析器和线程档案器的用户来优化其代码。优化方法是使用自顶向下的方式来解决问题的影响的表现,从“系统级”到“算法的水平”到“微水平” 。

VTune性能分析器的Counter Monitor解决系统I / O 问题; VTune性能分析器的调用图,采样的结果的SOT ,线程档案,帮助用户算法的增强; VTune性能分析器的事件,基本采样可以精确识别微架构上的问题。

...全文
731 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wdb_xj 2011-05-01
  • 打赏
  • 举报
回复
怎么 一点 都不通顺啊? 翻译的有点那个吧
laxila 2008-09-30
  • 打赏
  • 举报
回复
顶一下,谢谢楼主了
treetor 2008-09-30
  • 打赏
  • 举报
回复
要做个记号
treetor 2008-09-30
  • 打赏
  • 举报
回复
要做个记号
majiajun_no_5 2008-09-30
  • 打赏
  • 举报
回复
获益匪浅
majiajun_no_2 2008-09-29
  • 打赏
  • 举报
回复
顶了
majiajun_no_13 2008-09-28
  • 打赏
  • 举报
回复
努力学习中,一直观望。
formajia5 2008-09-25
  • 打赏
  • 举报
回复
支持下
majiajun_no_3 2008-09-25
  • 打赏
  • 举报
回复
快乐顶贴,快乐看贴,快乐学习。
formajia3 2008-09-24
  • 打赏
  • 举报
回复
学习中,增加点人气
wzzwt 2008-09-23
  • 打赏
  • 举报
回复
支持下
wlcy1988 2008-09-22
  • 打赏
  • 举报
回复
学习下,谢谢楼主

566

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧