intel cpu性能瓶颈分析方法_使用intel tmam 测量-程序员宅基地

自顶向下的微体系结构分析方法

使用此配方可了解应用程序如何利用可用的硬件资源以及如何利用CPU微体系结构。获得此知识的一种方法是使用片上性能监视单元(PMU)。

内容专家杰克逊·马鲁萨斯(Jackson Marusarz)德米特里·里亚布采夫Dmitry Ryabtsev)

PMU是CPU内核中的专用逻辑,用于对特定硬件事件(在系统中发生)进行计数。这些事件的示例可能是“高速缓存未命中”或“分支错误预测”。可以观察并组合这些事件以创建有用的高级指标,例如每条指令的周期(CPI)。

特定的微体系结构可以通过其PMU提供数百个事件。但是,确定哪些事件对于检测和修复特定的性能问题通常不是很明显。通常,它需要对微体系结构设计和PMU规范都有深入的了解,才能从原始事件数据中获取有用的信息。但是,您可以受益于使用预定义的事件和指标以及自上而下的表征方法,以将数据转换为可操作的信息。

探索PMU分析配方,以了解该方法及其在英特尔VTune放大器中的使用方式:

自顶向下的微体系结构分析方法概述

现代CPU使用流水线以及诸如硬件线程,乱序执行和指令级并行性之类的技术来尽可能有效地利用资源。尽管如此,某些类型的软件模式和算法仍会导致效率低下。例如,链接的数据结构通常在软件中使用,但是会导致间接寻址,这可能会使硬件预取器失败。在许多情况下,此行为会在检索数据且没有其他指令要执行时在管道中造成闲置气泡。链接的数据结构可能是解决软件问题的适当方法,但可能会导致效率低下。在软件级别上还有许多其他示例对基础CPU管道有影响。基于自上而下表征方法的自上而下的微体系结构分析方法旨在深入了解您是否已通过算法和数据结构做出明智的选择。见英特尔64和IA-32体系结构优化参考手册,附录B.1中有关自顶向下的微体系结构分析方法的更多详细信息。

自上而下的特征是基于事件的指标的层次结构,用于确定应用程序中主要的性能瓶颈。其目的是平均显示运行应用程序时CPU管道的使用情况。以前的用于解释事件的框架都依赖于CPU时钟信号-确定CPU时钟信号的哪一部分花在了哪种类型的操作上(例如,由于L2缓存未命中而检索数据)。相反,此框架基于对管道资源的考虑。要了解自顶向下的特性,请在下面深入探讨一些微体系结构概念。微体系结构的许多细节都在此框架中抽象化,使您无需硬件专家即可使用和理解它。

现代高性能CPU的管线非常复杂。在简化视图中,管道在概念上分为前端和后端两部分。前端负责获取体系结构指令中表示的程序代码,并将其解码为一个或多个称为微操作(uOps)的低级硬件操作。然后,将uOps通过分配过程馈送到后端。一旦分配,后端将负责监视uOp的数据操作数何时可用,并在可用执行单元中执行uOp。uOp执行的完成称为退役,并且uOp的结果将提交到架构状态(CPU寄存器或写回内存)。通常,大多数uOps会完全通过管道并退休,但是有时以推测方式获取的uOps可能会在退休之前被取消-就像分支预测错误的情况一样。

现代乱序的Intel CPU管道

最近的英特尔微体系结构上的流水线前端可以每个周期分配四个uOps,而后端可以每个周期淘汰四个uOps。从这些功能可以得出流水线槽的抽象概念。流水线插槽代表处理一个uOp所需的硬件资源。自上而下的特性假定每个CPU内核在每个时钟周期上都有四个可用的流水线插槽。然后,它使用经过特殊设计的PMU事件来衡量这些管道插槽的利用率。流水线插槽的状态在分配点(在上图中用星号标记)处获取,其中uOps离开前端进入后端。应用程序运行时可用的每个管道插槽将根据上述简化的管道视图分为四个类别之一。

在任何循环中,管道插槽可以为空,也可以填充uOp。如果在一个时钟周期内某个插槽为空,则归因于停顿。对该管道插槽进行分类所需的下一步是确定管道的前端部分还是后端部分导致了停顿。这是使用指定的PMU事件和公式完成的。自上而下表征的目的是确定主要瓶颈,因此,将停顿归因于前端或后端是一个需要考虑的关键点。通常,如果停顿是由于前端无法用uOp填充插槽而引起的,则它将被归类为此周期的前端绑定插槽,这意味着性能受到前端下某些瓶颈的限制绑定类别。如果前端已经准备好uOp但由于后端尚未准备好处理而无法交付,则空管道插槽将归类为“后端绑定”。后端停顿通常是由后端耗尽某些资源(例如,加载缓冲区)引起的。但是,如果前端和后端都停止,则该插槽将被归类为“后端绑定”。这是因为,在这种情况下,修复前端中的停顿很可能不会提高应用程序的性能。后端是阻塞瓶颈,在解决前端问题之前,首先需要将其删除。例如,加载缓冲区。但是,如果前端和后端都停止,则该插槽将被归类为“后端绑定”。这是因为,在这种情况下,修复前端中的停顿很可能不会提高应用程序的性能。后端是阻塞瓶颈,在解决前端问题之前,首先需要将其删除。例如,加载缓冲区。但是,如果前端和后端都停止,则该插槽将被归类为“后端绑定”。这是因为,在这种情况下,修复前端中的停顿很可能不会提高应用程序的性能。后端是阻塞瓶颈,在解决前端问题之前,首先需要将其删除。

如果处理器没有停止运行,则流水线插槽将在分配点处填充一个uOp。在这种情况下,如何对插槽进行分类的决定因素是uOp是否最终退出。如果确实退休,则该插槽被分类为“退休”。如果不是,则可能是由于前端的分支预测不正确,也可能是由于自修改代码导致的清除事件(如管道刷新),该插槽将被归类为不良推测。这四个类别构成了“自顶向下特征”的顶层。为了表征应用程序,将每个流水线插槽准确分类为以下四个类别之一:

这四个类别中的管道插槽分配非常有用。尽管基于事件的度量标准已经可以使用很多年了,但是在进行表征之前,还没有方法确定哪些可能的性能问题影响最大。将性能指标放入此框架后,您可以看到需要首先解决的问题。从第2代Intel Core处理器家族和IntelXeon处理器E5家族中使用的英特尔微体系结构代号Sandy Bridge开始,就可以将管道插槽分为四类。随后的微体系结构可能允许将这些高级类别进一步分解为更详细的性能指标。

VTune放大器的自顶向下分析方法

英特尔VTune放大器提供了“ 微体系结构探索”分析类型,该分析类型已预先配置为收集自上而下表征中定义的事件,从英特尔微体系结构代码名称Ivy Bridge开始。微体系结构探索还收集计算许多其他有用性能指标所需的事件。默认情况下,在“ 微体系结构探索”视图中显示“微体系结构探索”分析的结果。

微体系结构探索结果显示在层次结构列中,以增强表征的自上而下的本质。“ 摘要”窗口给出了整个应用程序在每个类别中管线插槽的百分比。您可以通过多种方式探索结果。探索结果的最常见方法是在功能级别查看指标:

对于每个功能,显示了每个类别中流水线槽的比例。例如,price_out_impl上面选择的功能在“前端绑定”类别中占2.2%的管道插槽,在“不良推测”中占7.4%,在“内存绑定”中占64.2%,在“核心绑定”中占8.4%,在“退休”类别中占17.8%。可以扩展每个类别以查看该类别下的指标。自动突出显示用于将您的注意力吸引到潜在的问题区域,在这种情况下,用于price_out_impl。

微体系结构调整方法

在进行任何性能调整时,重点放在应用程序的热点上很重要。热点地区是占用最多CPU时间的功能。专注于这些地方将确保优化影响整体应用程序性能。VTune放大器具有两种特定收集模式的热点分析:用户模式采样和基于硬件事件的采样。在“微体系结构探索”观点内,可以通过确定具有最高Clockticks事件计数的功能或模块来确定热点,该事件或计数测量CPU Clockticks的数量。为了从微体系结构调整中获得最大收益,请确保已应用算法优化(例如添加并行性)。通常,首先执行系统调整,然后是应用程序级算法调整,然后是体系结构和微体系结构调整。此过程也称为“自顶向下”,就像自上而下的软件调整方法一样。它以及性能调整的其他重要方面(如工作负载选择)在本文档中进行了描述。消除神秘的软件性能优化文章。

 

  1. 选择一个热点功能(其中一个占应用程序总时钟的百分比很大)。

  2. 使用自上而下的方法和下面给出的准则评估该热点的效率。

  3. 如果效率不高,则向下钻取代表主要瓶颈的类别,然后使用子级别的下一级别来确定原因。

  4. 优化问题。VTune Amplifier 调整指南包含针对每个类别中许多潜在性能问题的特定调整建议。

  5. 重复直到评估了所有重要的热点。

 

如果度量标准值超出预定义的阈值并出现在热点中,则VTune Amplifier会自动在GUI中突出显示度量标准值。如果VTune放大器对某个应用程序中的某个应用程序的总时钟频率大于总时钟频率的5%,则VTune Amplifier会将其归类为热点。确定特定类别的管道插槽的给定部分是否构成瓶颈可能取决于工作量,但下表提供了一些常规准则:

 

 

调整好的热点中此类别中管道槽的预期范围:

类别

客户/桌面应用

服务器/数据库/分布式应用程序

高性能计算(HPC)应用程序

退役

20-50%

10-30%

30-70%

后端绑定

20-40%

20-60%

20-40%

前端绑定

5-10%

10-25%

5-10%

不良投机

5-10%

5-10%

1-5%

 

这些阈值基于对英特尔实验室中某些工作负载的分析。如果热点的类别(而不是退休)中花费的时间比例处于高端或大于指示的范围,则进行调查可能会有用。如果对于多个类别都适用,则应首先调查时间比例最大的类别。请注意,预计热点在每种类别中花费的时间都将占一定比例,并且以下正常范围内的值可能并不表示有问题。

关于自上而下方法的重要一点是,您无需花费时间优化未被识别为瓶颈的类别中的问题-这样做可能不会显着提高性能。

调整后端绑定类别

大多数未调整的应用程序将是“后端绑定”。解决后端问题通常是与解决延迟源有关,这将导致退休花费的时间超过必要时间。在英特尔微体系结构代码名称Sandy Bridge上,VTune Amplifier具有“后端绑定”指标,用于查找高延迟源。例如,LLC Miss(上级高速缓存未命中)度量标准标识需要访问DRAM以获得数据的代码区域,而Split Loads和Split Stores度量标准指出会损害性能的内存访问模式。有关英特尔微体系结构代码名称Sandy Bridge指标的更多详细信息,请参阅《调优指南》。从英特尔微体系结构代码名称Ivy Bridge(在第三代英特尔酷睿处理器家族中使用)开始,可以使用事件将“后端绑定”分类分解为“内存绑定”和“核心绑定”子指标。前4个类别下的指标可以使用管道插槽域以外的域。每个指标将基于基础PMU事件使用最合适的域。有关更多详细信息,请参见每个指标或类别文档

使用与执行单元的利用率相对应的事件来确定“内存”和“核心绑定”子度量标准,这与顶级分类中使用的分配阶段相反。因此,这些指标的总和不一定与顶层确定的“后端绑定”比率匹配(尽管它们具有很好的相关性)。

“内存绑定”类别中的停顿具有与内存子系统有关的原因。例如,缓存未命中和内存访问可能导致内存绑定停顿。核心绑定停顿是由于每个周期内CPU可用执行单元的使用不尽人意引起的。例如,连续竞争多个除法单元的多个多周期除法指令可能会导致内核绑定停顿。对于此故障,只有在插槽停止且没有未完成的内存访问的情况下,插槽才被归类为“核心绑定”。例如,如果有挂起的负载,则该周期被归类为“内存绑定”,因为在负载尚未返回数据时,执行单元正处于饥饿状态。PMU事件被设计到硬件中,专门允许这种类型的故障,这有助于确定应用程序中的真正瓶颈。

“内存绑定”类别下的大多数度量标准都确定了从L1缓存到内存的哪个内存层次结构级别是瓶颈。同样,仔细确定了用于此确定的事件。后端停止后,指标将尝试将暂挂的负载的停顿归因于特定级别的缓存或运行中的存储。如果将热点绑定到给定级别,则意味着正在从该缓存级别或内存级别检索其大部分数据。优化应该集中在使数据更靠近核心。Store Bound也称为子类别,它可以指示相关性-例如何时管道中的负载取决于先前的存储。在每个类别下,都有一些指标可以识别导致内存绑定执行的特定应用程序行为。例如,

核心绑定停顿通常在后端绑定中不常见。当可用的计算资源没有得到充分利用和/或在没有显着内存需求的情况下使用时,可能会发生这些情况。例如,一个紧密循环对适合缓存的数据执行浮点(FP)算术计算。VTune Amplifier提供了一些指标来检测此类别中的行为。例如,除法器度量标准确定了大量使用除法器硬件时的周期,而端口利用率度量标准则确定了对离散执行单元的竞争。

后端绑定类别

注意

指标值显示为灰色表示该指标收集的数据不可靠。例如,如果为PMU事件收集的样本数量太少,则可能会发生这种情况。您可以忽略此数据,也可以在数据收集时间,采样间隔或工作量增加的情况下重新运行收集。

调整前端绑定类别

前端绑定类别涵盖了其他几种类型的管线停转。管道的前端部分成为应用程序的瓶颈的可能性较小。但是,在某些情况下,前端可能会导致机器停顿。例如,JIT代码和解释代码会导致前端停顿,因为指令流是动态创建的,没有事先编译器代码布局的好处。在“前端绑定”类别中提高性能通常将与代码布局(共定位热代码)和编译器技术有关。例如,分支代码或具有较大占用空间的代码可能会突出显示“前端绑定”类别。在许多情况下,诸如代码大小优化和编译器配置文件引导的优化(PGO)之类的技术可能会减少停顿。

英特尔微体系结构代号为Ivy Bridge的自上而下方法将前端绑定的停顿分为两类,即前端延迟和前端带宽。前端延迟度量标准报告周期,其中一个周期中前端未发出任何微指令,而后端则准备使用它们。回想一下,前端集群每个周期最多可以发出4微分。“前端带宽”度量标准报告了发出少于4微秒的周期,这表示对前端功能的使用效率低下。在每个类别下都将确定其他指标。

分支错误预测(通常在不良推测类别中得到了解决)也可能导致前端效率低下,如前端延迟下的“分支延迟”瓶颈指标所表示的那样,前端效率低下是从英特尔微体系结构代码名称Ivy Bridge开始的。

前端绑定类别

VTune Amplifier列出了可以识别前端绑定代码原因的指标。如果这些类别中的任何一个在结果中显着显示,请更深入地研究度量标准以确定原因以及如何纠正它们。例如,ITLB开销(指令转换后备缓冲区开销)和ICache丢失(指令缓存未命中)度量标准可能指出受前端绑定执行影响的区域。有关调整建议,请参见《 VTune放大器调整指南》。

调整不良推测类别

第三个顶级类别不良推测,表示管道何时忙于获取和执行无用的操作。坏投机管道槽是由从来没有退休或停滞不前,而机器从一个不正确的猜测恢复发行微指令浪费插槽。坏猜测是由分支预测失误引起的机械清除和喜欢自我修改码的情况较少见。可以通过诸如Profile-Guided Optimization(PGO)之类的编译器技术来减少不良推测,避免间接分支,并消除导致机器清除的错误情况。纠正不良投机问题也可能有助于减少前端绑定停顿的数量。有关特定的调整技术,请参考适用于您的微体系结构的《 VTune放大器调整指南》。

不良投机类别

退休类别调

在顶层最后一类是退休。它是指当管道忙于通常有用的操作。理想情况下,一个应用程序应具有尽可能多的此类插槽。然而,代码与他们的管线槽退休可以有改进的余地的大部分甚至地区。将落入该类别退役下一个性能问题是大量使用的微定序器,其通过产生的uop的长流,以解决特定条件协助前端的。在这种情况下,虽然有很多退休的微操作,其中一些本来是可以避免的。例如,在非正规数的情况下应用FP协助通常可以通过编译选项(如DAZ或FTZ)减少。代码生成的选择也可以帮助缓解这些问题 - 有关详细信息,请参阅使用VTune放大器调整指南。在英特尔微架构代号Sandy Bridge的,协助被认定为退休类别下的度量。在英特尔微架构代号Ivy Bridge的超越,在退休后的理想类别的管线槽被分成称为通用退休的一个子类,和微码序微指令,分别确定。

退休类别

如果尚未完成,那么诸如并行化和向量化之类的算法调整技术可以帮助提高属于退休类别的代码区域的性能。

结论

自上而下的方法及其在VTune放大器中的可用性代表了使用PMU进行性能调整的新方向。花费在开发人员熟悉该特性上的时间将是值得的,因为对它的支持已被设计到最新的PMU中,并且在可能的情况下,层次结构在将来的英特尔微体系结构上进一步扩展。例如,在英特尔微体系结构代码名称Sandy Bridge和英特尔微体系结构代码名称Ivy Bridge之间,该特性得到了显着扩展。

自顶向下方法的目标是确定应用程序性能中的主要瓶颈。VTune放大器的微体系结构探索分析和可视化功能的目标是为您提供可操作的信息,以改善您的应用程序。这些功能加在一起,不仅可以显着提高应用程序性能,而且可以极大地提高优化效率。

https://software.intel.com/en-us/vtune-amplifier-cookbook-top-down-microarchitecture-analysis-method

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Dreamandpassion/article/details/102784969

智能推荐

SAP S/4 HANA新变化-FI数据模型-程序员宅基地

文章浏览阅读370次。SAP S/4 HANA新变化-FI数据模型 http://mp.weixin.qq.com/s?__biz=MzAwMjgyMTA4MQ==&mid=2652153162&idx=1&sn=aee6fc43e0577479854e4842df919c90&ch..._hana anlc

Centos7(腾讯云)安装UniFi控制器_centos unifi-程序员宅基地

文章浏览阅读989次。腾讯云主机,就自行度娘吧,没什么好说的。用SSH连接上云主机(root)用户登陆。关闭防火墙 systemctl stop firewalld.service systemctl disable firewalld.service添加mongodb源vim /etc/yum.repos.d/mongodb-org-4.4.repo添加以下内容到mongodb-org.repo[mongodb-org-4.4]name=MongoDB Repository.._centos unifi

深入理解AQS底层源码(一)——lock.lock()_lock.lock();-程序员宅基地

文章浏览阅读1.2k次。前期准备:1、可重入锁(递归锁):外层使用锁后,在内层仍然可以使用锁。同一个线程可以获取多个同一把锁。优点:避免死锁。特点:锁对象是同一个对象2、LockSupport:LockSupport.park(); LockSupport.unPark(Thread t);类比 synchronized wait notify ; lock.newCondition await signalwait notify必须和synchronized搭配使用且先wait后notify;awai..._lock.lock();

Web前端大作业 体育主题足球网页制作 足球梅西HTML网页设计制作 dreamweaver学生网页源代码_关于足球网页设计-程序员宅基地

文章浏览阅读136次。网站布局方面:计划采用目前主流的、能兼容各大主流浏览器、显示效果稳定的浮动网页布局结构。网站程序方面:计划采用最新的网页编程语言HTML5+CSS3+JS程序语言完成网站的功能设计。并确保网站代码兼容目前市面上所有的主流浏览器,已达到打开后就能即时看到网站的效果。网站素材方面:计划收集各大平台好看的图片素材,并精挑细选适合网页风格的图片,然后使用PS做出适合网页尺寸的图片。网站文件方面:网站系统文件种类包含:html网页结构文件、css网页样式文件、js网页特效文件、images网页图片文件;_关于足球网页设计

java 1.8 时间戳localdatetime转换-程序员宅基地

文章浏览阅读421次。java 1.8 中 关于LocalDateTime 的与long 的转换,在1.8 localdateTime 中对于时区设置是敏感的,这个需要留意public static void main(String[] args) { Period sixMonths = Period..._java localdatetime long

仪表板展示 | X-lab开放实验室GitHub开源项目洞察大屏_开源的大屏项目-程序员宅基地

文章浏览阅读761次。开源项目强强联合,对GitHub开源项目进行多角度分析。_开源的大屏项目

随便推点

在Springboot集成Activiti工作流引擎-引入、调用,测试【基础讲解】-程序员宅基地

文章浏览阅读1.6k次,点赞2次,收藏6次。工作流 通过计算机对业务流程自动化执行管理他主要解决的是使在多个参与者之间按照某种“预定义规则”自动进行传递稳定 信息或任务的过程通俗来讲 业务上一个玩着的审批流程 比如请假,出差 外出采购等工作流引擎就是来解决流程问题的 提高我们的工作效率如果没有工作流引擎 我们就需要自己去写逻辑 就特别的复杂 扩展性还不强使用工作流引擎 业务改变,不需要修改代码如果是我们自己写的逻辑 有可能 业务改变,代码也需要改变那么为什么工作流引擎不用修改代码因为我们的工作流引擎都实现了一个规范这个规范要_集成activiti

Python爬虫:xpath,cookie都正确仍然无法爬取需要的内容解决方法之一_xpath写的都对 为什么抓不到内容-程序员宅基地

文章浏览阅读2.1k次,点赞2次,收藏10次。经过很多次尝试以及仔细观察所爬取的html代码内容,我发现有一个标签里含有的css代码:style = display:none ,这行代码可以把这个标签里面的内容隐藏。展开这个标签里面的内容,很可能就是我们所需要的真实的页面a标签里面的url地址。注意,这里说了一般,有些网站的反爬措施很高级,甚至会封掉你的ip。看这篇文章的猿猿们肯定有了一定的python-xpath爬虫基础了,后面对li_tree的处理以及延伸获取所需要的页面内容我在这就不介绍啦!这样我们就得到了正确的li_tree。_xpath写的都对 为什么抓不到内容

iOS开发常用的RGB色值和中文名字_苹果远峰蓝的rgb-程序员宅基地

文章浏览阅读633次。RGB值 RGB值 RGB值黑色000#000000黄色2552550#FFFF00浅灰蓝色176_苹果远峰蓝的rgb

SpringBoot+Mysql+小程序实现的美团外卖美食小程序系统附带前台和后台代码_美团前端微信小程序代码-程序员宅基地

文章浏览阅读778次。随着数字化技术兴起,各种应用软件覆盖各行各业,大大推动了产业发展。然而,在外卖点餐领域,现实问题仍然存在,例如订单处理效率低、库存管理复杂、客户服务水平不一以及数据分析能力不足等。为解决这些问题,本文研发了一款基于微信小程序与Spring Boot的外卖点餐系统,旨在提升效率和管理水平,优化顾客体验。本外卖订餐系统融合了先进技术与实践,采用Spring Boot框架开发后端,借助MySQL数据库存储数据,并通过微信小程序实现用户端。系统的创新表现在全面提升了管理效率和顾客服务。_美团前端微信小程序代码

在本机搭建自己的ftp服务器--最简单的方法(详细教程)_ftp服务器怎么搭建-程序员宅基地

文章浏览阅读10w+次,点赞159次,收藏1.1k次。在本机搭建自己的ftp服务器--最简单的方法(详细教程)FTP服务器可以在局域网中快速传输文件,是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务。 FTP是File Transfer Protocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。..._ftp服务器怎么搭建

单链表逆置的三种方法(头插法逆置、就地逆置、递归逆置)顺序表【数组】的逆置的代码实现(使用java语言实现,用对象模拟内存结构和指针)_单链表的就地逆置和前插法-程序员宅基地

文章浏览阅读1.2k次。单链表节点定义/** * className:LNode * * @author:zjl * @version:0.1 * @date:2020/7/1622:25 * @since:jdk1.8 */public class LNode { private Object data; private LNode next; public LNode() { this.data = null; this.next = null; _单链表的就地逆置和前插法