面向英特尔® 至强融核™ 协处理器的优化与性能调优,第 2 部分:了解和使用硬件事件

摘要

本文可帮助用户在英特尔® 至强融核协处理器上优化应用。它旨在与英特尔® VTune™ Amplifier XE 性能分析器一同使用,概述了架构,并详细说明了使用什么事件和指标来分析性能,另外还提出了调优建议。

1 内容简介

英特尔® 至强融核协处理器是首款基于英特尔® 集成众核架构英特尔® MIC 架构的产品。英特尔至强融核协处理器应用的开发人员可使用英特尔® VTune™ Amplifier XE 性能分析器对他们的软件进行性能调优。

软件性能优化可在多个层面进行应用调优、系统调优、操作系统调优等。一般而言自上而下的方法是最高效的先进行系统调优,再优化应用的算法,系统调优包括操作系统调优,通常用于消除硬件瓶颈。算方调优包括添加并行性、调优 I/O 或选择更高效的数据结构或库例程。一般来说,算法调优需要了解应用的热点并熟悉源代码,旨在增强应用性能。

本文第 1 部分探讨了一些算法优化它们应该用于运行在英特尔至强融核协处理器上的应用。第 2 部分重点介绍了微架构优化与如何确定这种优化需要在什么位置进行。微架构调优需要了解应用在硬件上的执行情况 —— 管线、高速缓存等的使用情况。这一层面的调优针对使用中的架构与基本硬件。如欲完成微架构调优,开发人员需要在应用运行时,访问计算硬件收集的实时性能信息。

该信息存储在处理内核的性能监控单元 (PMU)可对该单元进行编程使其计算特定事件的发生次数。VTune Amplifier XE 2013 支持开发人员收集和查看英特尔至强融核协处理器的取样数据。本指南将提供一种框架,用于分析从运行在协处理器上的应用中收集的事件数据。

2 英特尔® 至强融核协处理器概述

英特尔至强融核协处理器非常适合计算与数据访问比率较高的高度并行应用。它包括多达 61 个通过双向环形总线片上连接的 CPU 内核每内核能够以轮询的方式在多达 4 条硬件线程间进行切换总共有 244 条硬件线程可用。每内核包括 1 个顺序、双流 x86 管线、1 个本地一级和二级高速缓存、及 1 个单独的矢量处理单元 (VPU)。高速缓存分级结构详情如下。

类型

大小

信息 (Info)

一级指令

32KB

64B 行大小

一级数据

32KB

64B 行大小

二级指令+数据

512KB

64B 行大小

1高速缓存信息

英特尔至强融核协处理器包括硬件预取它包括 5 个单独的机制每个机制面向特定的数据访问模式。广泛的硬件预取,加上编译器生成的软件预取,可部分减除软件开发人员使用预取指令的负担。因此,本指南未讨论软件预取优化。

英特尔至强融核协处理器的另一个特性是二级数据转换后备缓冲区 (DTLB)TLB 这种高速缓存可执行虚拟到物理内存地址转换,这样就无需在每次内存访问时进行转换。每内核的二级 DTLB 包含 64 个条目,它们可用于高速缓存 2M页面转换或 4K 页面的页面目录条目 (PDE)。二级 DTLB 可显著降低一级 DTLB 缺失方面的延迟。

类型

条目

页面大小

地图

一级指令

32

4KB

128KB

一级数据

64

4KB

256KB

 

8

2MB

16MB

二级数据

64

4KB 2MB

128M

2TLB 信息

英特尔至强融核协处理器还包含 8 个双通道 GDDR5 内存控制器。每个通道可按 5.5 GT/ 速度提供数据,可用的理论总内存带宽是 352 GB/秒。

3 一般探索方法

当前使用英特尔® VTune™ Amplifier XE 收集和查看英特尔至强融核协处理器数据的流程资源部分列出的若干文档中有详述。本指南重点探讨已收集和显示在 VTune Amplifier XE 界面中的数据的分析流程。数据可能需要在多个运行过程中进行收集,指标将需要在 VTune Amplifier XE 外进行计算。VTune Amplifier XE 内面向英特尔® 至强融核产品家族的支持将继续得到增强。

虽然了解各种事件的单个计数很有帮助但本文将多数事件用于指标上下文中。第 4 部分列举了一些通用的效率标准,它们可帮助评估何时开始和停止对特定代码的优化。第 5 部分详述了一组对于应用分析极其有价值的指标。每个指标除配有描述之外,还配有一个公式,用于通过可用事件计算指标,及一个阀值,用于确定指标的值何时可以表示性能问题及一些调优建议。

使用英特尔® VTune™ Amplifier XE 进行性能分析通常采用的方式是

1.     选择一个热点占用应用总 CPU 周期很大比例的函数

2.     使用第 4 部分所述的指标评估该热点的效率。

3.     如果效率较低请检查部分 5 中每项适用的指标。如果指标值低于建议阀值,或超出了其它标准的接受范围,请使用本指南中的附加信息查找并修复该问题。

4.     请重复上述操作直到评估完所有重要的热点。

采用该方法时请注意仔细选择代表性工作负载。许多指标都需要收集多个事件,这可能要求多次运行该工作负载以收集相关数据。理想的工作负载应该具备一些稳态阶段,在这种阶段,行为保持不变的时间长于数据收集间隔。该工作负载还应提供一致、可重复的结果,并是唯一一个在数据收集期间消耗很大一部分 CPU 时间的应用。如果通过多次运行该工作负载来收集数据,请确保不存在影响性能的温暖高速缓存 (warm-cache) 效应或其它因素。最后,在开始分析前,建议进行基本 CPU 时钟周期和指令事件方面的合理性检查,确保连续运行时事件计数保持不变并符合预期。本文中的事件指标与说明基于 B 步进协处理器,应适用 B 系列或最新的协处理器。

4 效率指标

若干指标可用于测量英特尔至强融核协处理器上的总体效率。开发人员应首先查看这些指标,了解他们应用的可用资源的利用情况。这些指标(除另有说明外)还可用于评估各种优化(迭代调优流程的组成部分)的影响。

每个指标的所述公式用于在函数级进行计算使用所有运行的硬件线程的样本和。若使用基于自定义分析硬件事件的抽样分析类型及具有函数/调用堆栈分组的“PMU 事件选项卡,VTune Amplifier XE 界面就可自动进行求和。该界面得出的总值(每个函数)可用于计算本指南中的指标。

4.1 CPI

所用事件

事件

意义

CPU_CLK_UNHALTED

内核执行的周期数

INSTRUCTIONS_EXECUTED

线程执行的指令数

公式

指标

公式

每线程的平均 CPI

CPU_CLK_UNHALTED/INSTRUCTIONS_EXECUTED

每内核的平均 CPI

每线程的 CPI/使用的硬件线程的数量

阀值

指标

调查情况:

每线程的平均 CPI

大于 4.0,或一般会增加

每内核的平均 CPI

大于 1.0,或一般会增加

说明与使用

许多年以来每指令周期数 (CPI) 指标一直都是 VTune Amplifier XE 界面的一部分。它可表示取消指令所需的平均 CPU 周期数因此可表示系统中影响应用运行的延迟量。由于 CPI 是一种比率,因此会受应用所消耗 CPU 周期数的变化(分子),或所执行指令数的变化(分母)的影响。基于上述原因,最好只在该比率的一部分变化时,使用 CPI 进行比较。例如,代码的一部分中的数据结构可能变化,从而降低(不同)热点中的 CPI。只要热点中的代码未发生变化,那么就可针对该热点比较 CPI。目的是降低热点和整个应用的 CPI

为了充分使用该指标请了解使用多条硬件线程时如何解释 CPI。在英特尔® MIC 架构上,可通过两种方式分析 CPI每内核每线程,每种方式都有用。每线程分析(用于计算每条硬件线程的 CPI)最为简单直接。它通过两个事件计算得出:CPU_CLK_UNHALTED(也称为时钟滴答或周期)及 INSTRUCTIONS_EXECUTEDCPU_CLK_UNHALTED 可计算 CPU 内核时钟的滴答数。由于时钟是在内核上的硬件中实施,因此内核上所有的硬件线程共用一个时钟。该事件在内核层面进行计算 —— 针对特定的样本,所有运行在相同内核上的线程将具有相等值。

另一个使用的事件是 INSTRUCTIONS_EXECUTED它在线程层面进行计算。在样本上每条执行在内核上的线程都具有不同的事件值这取决于每线程有多少指令被真正取消。计算每线程 CPI 非常简单:它只是 CPU_CLK_UNHALTED 除以 INSTRUCTIONS_EXECUTED 的结果。在任意给出的样本中,该计算都将该内核值用于时钟滴答、单个硬件线程值用于执行的指令。该计算通常使用每个函数所有样本的和在函数级进行,每条硬件线程的平均 CPI 也可以如此实施,在面向该函数运行的所有硬件线程间求平均数。

每内核的 CPI 稍微复杂点。另外所有运行在内核上的硬件线程共用一个时钟滴答值每线程具有一个所执行指令的值。如欲计算”CPI 或每内核的平均 CPI,您可将内核的 CPU_CLK_UNHALTED 值除以所有线程的 INSTRUCTIONS_EXECUTED 值的总和。例如,假设在英特尔至强融核协处理器上,一个应用的每内核在使用 2 条硬件线程。应用中的一个热门函数 (hot function) 需花费 1,200 个时钟滴答完成。在 1,200 个周期内,每线程执行了 600 个指令。该函数每线程的 CPI (1200 / 600) 2.0。该函数每内核的 CPI (1200 / 600+ 600)) 1.0。现在假设,使用 3 条硬件线程和相同工作负载再次运行应用。现在,在相同的时间内,每线程取消了 400 个指令,取消的指令总数为 1200。该函数每线程的 CPI 各有不同 —— (1200 / 400) 3.0。每内核的 CPI 保持不变:(1200 / (400 + 400 + 400) 1.0。另外,通常使用所有运行的内核和线程的样本,在函数级计算每内核的平均 CPI。因此,可通过每线程的平均 CPI 值除以每内核所用硬件线程的数量,轻松计算每内核的平均 CPI

上述的假设示例说明了应用发生改变后每线程 CPI 和每内核 CPI 的不同变化方式。在上述情况中,在添加额外的硬件线程后,每线程的 CPI 有所降低,每内核 CPI 保持不变。实际上,第三条硬件线程支持应用在相同的时间内完成等量的工作。该数据可帮助您更深入了解情况。每内核 CPI 保持不变,表明内核本身执行指令的速度和以前一样。每线程 CPI 2.0 降到了 3.0,表明每条硬件线程的效率较之以前有所下降。两种分析都是正确的 —— 内核性能保持不变,运行 2 条硬件线程的效率更高或运行 3 条硬件线程的效率更低。但是,如果开发人员只关注每线程 CPI,性能似乎就下降了。在英特尔至强融核协处理器的典型使用场景中,以不同方式影响每线程 CPI 和每内核 CPI 的改变是可能发生的,请测量和了解这两种 CPI

英特尔至强融核协处理器支持在每个物理内核上运行多达 4 条硬件线程。然而,该管线的前端每周期只能发布多达 2 个指令。(这与传统的英特尔® 至强® 处理器管线情况相反,传统管线目前支持 2 条硬件线程,且前端在每个周期可发布 4 个指令。英特尔至强融核协处理器上的 4 条硬件线程可用于抵消工作负载数据访问的部分延迟。由于英特尔至强融核协处理器管线按序操作指令(即在执行前,指令必须按照先后顺序具备所有的操作数),对于某些类型的应用来说,面向额外硬件线程化的支持可能尤为重要。当一条硬件线程在等待数据,其它线程可进行执行。

关于英特尔至强融核协处理器管线的前端另一个需要了解的重要事项是在连续 2 个时钟周期内它不会从相同的硬件环境硬件线程发布指令即使该硬件环境是执行中的唯一一个环境。因此,为了实现最大的发布速率,至少需要 2 种硬件环境处于运行当中。多种环境运行时,前端将在它们之间循环切换。鉴于这些要求及每个时钟发布 2 个指令的能力,可计算得出任何运行在英特尔至强融核协处理器上的应用的最低理论 CPI,详情请见如下表 3

硬件线程数量

最低(最佳)理论 CPI,每

最低(最佳)理论 CPI,每

每内核

内核

线程

1

1.0

1.0

2

.5

1.0

3

.5

1.5

4

.5

2.0

3最低理论 CPI

一些应用在其数据访问中具有足够的固有延迟使所有 4 条硬件线程可被利用每条线程都可增强性能。在这种情况下,每增加一条线程都会降低相同工作负载上的每内核 CPI。增加或减少所处理的工作量时,了解 CPI 需要一定技巧,因为这些变化会再次影响执行的指令。一般规则是,如果完成的工作量在增加,那么当每条硬件线程会带来助益时,每内核 CPI 会增加,速度慢于所处理工作的增加速度。每内核 CPI 有益于分析每条额外硬件线程的优势。甚至在每内核 CPI 下降时(好),每线程 CPI 可能增加,这也有利于了解情况,因为开发人员可能使用的许多代码优化将满足线程级的 CPI

4 所示为英特尔实验室实际运行的工作负载的每内核及每线程 CPI硬件线程/内核的数量可从 1 扩展至 4。应用的性能随着每条线程的增加而提高,虽然第 4 条线程的增加没有第 2 或第 3 条线程的增加对于性能增强的作用那么大。数据显示,随着线程的增加,每线程 CPI 会不断提高,即每条线程的效率会降低,但总体上,每内核 CPI 会下降,这符合预期,因为每条线程都可增强性能。对于该工作负载,执行的指令数量在所有硬件线程配置中大致不变,因此,CPI 对执行时间构成了直接影响。每内核 CPI 的下降转化成了应用总执行时间的减少。

指标

1 条硬件线程/内核

2 条硬件线程/内核

3 条硬件线程/内核

4 条硬件线程/内核

每线程 CPI

5.24

8.80

11.18

13.74

每内核 CPI

5.24

4.40

3.73

3.43

4CPI 示例

请注意每内核 CPI 和每线程 CPI 指标的阀值范围极为保守。许多应用可能具有更高的 CPI 值,仍然可以以最佳的状态运行。一般而言,在内核中运行(即在可缓冲工作集上进行计算)的应用应能够获得指定阀值或低于该阀值的 CPI。需要至少部分跨内核运行或利用内存的应用可能具有比指定阀值更高的 CPI

调优建议

应用的任何改变都将影响 CPI因为执行的指令数或完成它们所需的时间将可能变化。总体目的就是减少每内核 CPI(及执行时间),特别是应少于先前版本的应用。多数有关第 5 部分每个问题的性能建议可用于减少 CPI。请记住,一些有益的优化,如旨在提高矢量化强度(第 5.5 部分)的优化,实际上可能增加 CPI,因为使用单个指令完成的工作量会增加,因而执行的指令数总体会减少。CPI 最大的用处是作为一种通用的比较与效率指标,而非一种独有的性能决定因素。

4.2 计算与数据访问比率

所用事件

事件

含义

VPU_ELEMENTS_ACTIVE

线程执行的 VPU 操作数

DATA_READ_OR_WRITE

线程一级数据高速缓存支持的负载与存储的数量

DATA_READ_MISS_OR_WRITE_MISS

未命中线程一级高速缓存的需求负载或存储的数量

L1_DATA_HIT_INFLIGHT_PF1

用于已从二级预取至一级的高速缓存行的需求负载或存储的数量

公式

指标

公式

一级计算与数据访问比率

VPU_ELEMENTS_ACTIVE / DATA_READ_OR_WRITE

二级计算与数据访问比率

VPU_ELEMENTS_ACTIVE / DATA_READ_MISS_OR_WRITE_MISS

阀值

指标

调查情况:

一级计算与数据访问比率

小于矢量化强度(请见第 5.3 部分)

二级计算与数据访问比率

小于 100 倍一级计算与数据访问比率

说明与使用

这些指标可用于测量应用的计算密度或它针对每个加载的数据段平均执行的计算次数。首个一级计算与数据访问比率应该用于判断应用运行在英特尔® MIC 架构上的适应性。可在英特尔® MIC 架构上出色运行的应用应该进行矢量化处理,并能够在相同的数据段(或相同的高速缓存行)上顺利实施多个操作。一级比率计算矢量化运算(针对每次一级高速缓存访问进行)的平均数量。所有矢量化运算,包括数据操作,都包含在 VPU_ELEMENTS_ACTIVE 事件定义的分子中。VPU_ELEMENTS_ACTIVE 被用于替代 VPU_INSTRUCTIONS_EXECUTED,因为它可以更准确地描述所实施操作的数量,例如,用于具有 16 个浮点的寄存器的指令将算作 16 个操作。所有需求负载和存储都包含在分母中,不包括预取。

一级指标的阀值是一种指导值。多数可在英特尔® MIC 架构上良好运行的代码实现的计算与一级访问比率应大于或等于它们的矢量化强度请见 5.3 部分),该比率相当于 1:1 —— 一次数据访问对应一次计算除非通过矢量化每次计算应该同时操作多个元素。无法实现超过这一阀值的比率的应用计算密度可能不够,无法充分利用英特尔® MIC 架构。

一级的计算密度至关重要。二级的计算密度是表示代码运行效率的一种指标。另外,上述阀值是一种指导值。从一级访问数据可实现最佳性能,这并不意味着不能从内存中流动式传输数据,英特尔至强融核协处理器上的高带宽对于这点是有利的。但理想情况是,使用预取将数据从内存流动式传输至高速缓存,然后在需求负载发生时,该数据在一级中可用。比起传统处理器来,这对于英特尔至强融核协处理器甚至更为重要。长数据延迟会削弱矢量化的性能优势,矢量化是英特尔® MIC 架构性能的一大基石。二级计算与数据访问比率表示每次二级访问时矢量化运算的平均数量。对于能够阻止一级高速缓存数据或减少总体数据访问的应用,这一比率表示的数量将更高。使用 100 倍一级比率的阀值已成为一种基准,即每进行 100 次一级数据访问,大约应进行 1 次二级数据访问。与一级指标一样,它包括分子中的所有矢量化运算(包括数据移动)。

一级指标的分母包括所有的需求负载与存储 —— 所有的一级数据高速缓存访问。二级指标的分母稍微复杂一点,它使用所有未命中一级、要求的数据访问,从二级中只能请求这些访问。它与第 5.2 部分讨论的一级命中率具有很大的关系。

调优建议

如果一级计算密度指标低于矢量化强度就应采取通用调优来减少数据访问。以减少关键路径上的总指令数量为目标是实现这点的最佳途径。消除条件表达式、初始化或内部循环中不需要的任何因素。简化数据结构。调整数据,确保编译器在生成负载和存储时进行调整。确保编译器生成良好的矢量化代码,如不生成寄存器溢出。尽可能消除任务或线程管理费用。

对于二级计算密度指标使用第 5.3 部分所述的技术尽量提高一级高速缓存的数据局部性。使用英特尔® Cilk™ Plus 的技术或编译指示 (pragmas) 重新构建代码也可支持编译器生成更高效的矢量化代码,帮助提高一级和二级指标。

5 潜在的性能问题

本部分重点介绍了若干可使用事件检查出的潜在性能问题。对于每个问题,所需的事件及其说明都已列出。使用指标和阀值确定每个问题。与第 4 部分所述的指标一样,针对以下指标列出的公式用于在函数级进行计算(使用所有运行的硬件线程的样本和)。若使用基于自定义分析硬件事件的抽样分析类型及具有函数/调用堆栈分组的“PMU 事件选项卡,VTune Amplifier XE 界面就可自动进行求和。该界面得出的总值(每个函数)可用于计算本指南中的指标。

针对每个指标计算出的值还应与阀值进行比较。总体来说,本文所述阀值的选择较为保守。这意味着应用在没有问题时触发阀值标准的可能性比没有触发阀值时具有一个所述问题的可能性更大。阀值仅表示开发人员可能想要进一步调查。第 5 部分中的所有指标也用于执行环境修复之后。改变所用硬件线程或内核的数量可能影响指标的可预测性。

5.1 一般高速缓存使用

所用事件

事件

含义

CPU_CLK_UNHALTED

内核执行时的周期数

DATA_READ_MISS_OR_WRITE_MISS

未命中一级数据高速缓存的需求负载或存储的数量

L1_DATA_HIT_INFLIGHT_PF1

用于已从二级预取至一级的高速缓存行的需求负载或存储的数量。

DATA_READ_OR_WRITE

线程一级数据高速缓存支持的负载与存储的数量。

EXEC_STAGE_CYCLES

线程在执行计算操作时的周期数

L2_DATA_READ/WRITE_MISS_CACHE_FILL

计算另一个内核的二级高速缓存在同一卡上提供的二级读取或读取所有权缺失。包括未命中本地二级高速缓存的二级预取,因此对于决定需求高速缓存填充没有用处。

L2_DATA_READ/WRITE_MISS_MEM_FILL

计算内存在同一卡上提供的二级读取或读取所有权缺失。包括未命中本地二级高速缓存的二级预取,因此对于决定需求内存填充没有用处。

公式

指标

公式

一级缺失

DATA_READ_MISS_OR_WRITE_MISS + L1_DATA_HIT_INFLIGHT_PF1

一级命中率

(DATA_READ_OR_WRITE – L1 Misses) / DATA_READ_OR_WRITE

估计延迟影响

(CPU_CLK_UNHALTED – EXEC_STAGE_CYCLES – DATA_READ_OR_WRITE) / DATA_READ_OR_WRITE_MISS

阀值

指标

调查情况:

一级命中率

小于 95%

估计延迟影响

大于 145

说明与使用

对于运行在英特尔至强融核协处理器上的应用而言出色的数据局部性对于实现性能潜力至关重要。为了实现矢量化应用的优势,数据必须在延迟尽可能低的情况下,可供访问并存入 VPU 寄存器。否则,填充寄存器的时间会占用大部分计算时间。虽然在在 4 条硬件线程间切换执行确实可隐藏部分数据访问延迟,但对于性能它仍然可产生重要影响。因此,对于英特尔至强融核协处理器而言,增强数据局部性是最有意义的优化工作之一。一级和二级局部性都很重要。导致数据从本地二级高速缓存而非远程高速缓存访问的程序变更可节省至少 250 个周期的访问时间。在负载下,节省的时间甚至更多。从一级而非二级访问数据可节省约 20 个周期。

传统上命中率指标表示每级高速缓存的高效使用情况。它的计算方式通常是,将命中次数除以相应级高速缓存的总访问次数。另外,命中率通常只适用于需求访问,即来自应用而非软件或硬件预取的正确负载。确定数据(或一级)高速缓存的需求命中率是可能的,但该公式要求进行一些解释。数据高速缓存访问可以是标准命中、缺失或命中进行中预取 (in-flight prefetch),这需要单独计算。当数据未在高速缓存中找到,命中进行中预取便发生,且匹配预取针对同一高速缓存级别已检索的高速缓存行。这些类型的命中与标准命中相比具有更长的延迟与缺失相比具有较短的延迟。为了保守说明命中率,本文把它们作为缺失进行处理,并从分子中将它们减去。

英特尔至强融核协处理器上的二级与 FILL 事件正在计算需求负载与存储及多种预取。不是所有的预取都能被其它事件准确计算,因此,不能通过调整公式来计算真实的需求二级命中或缺失。除内存带宽(可以包括预取)外,本文并未推荐任何依靠二级或填充事件的指标。指定估计延迟影响指标,以期解决没有二级指标的问题。该指标是用于每次一级高速缓存缺失的时钟周期数的粗略近似值分子的计算方式是使用总 CPU 周期并针对每次一级高速缓存命中减去一个周期因为每次一级访问会消耗一个周期、针对 EXEC_STAGE_CYCLES 事件活跃的每个周期减去一个周期。EXEC_STAGE_CYCLES 对于许多计算应该处于活跃状态,并用于部分过滤计算周期。剩余周期被认为是用于一级高速缓存以外数据访问的周期。分母是一级高速缓存缺失给出了对每次一级高速缓存缺失所消耗的 CPU 周期数。应该着重指出,这只是一个近似值,不完全准确,原因是多方面的,包括管线效应、未予说明周期 (un-accounted for cycle) 及重叠内存访问。

估计延迟影响指标可表示多数一级数据缺失是否在二级中命中。鉴于二级数据访问延迟是 21 个周期,接近这一数字的估计延迟影响具有较高程度的二级命中。该阀值设定为 145,因为它是未加载二级和内存访问次数的平均值。关于估计延迟影响,另一个需要注意的重要问题是与所有比率一样,它也受分子或分母中变化的影响。多数情况下,对数据访问产生积极影响的优化应该会降低这一指标的值。然而,某些积极的变化(如减少的一级缺失)可能导致该指标的值不变,因为它会减小分子与分母,这种变化反而会影响一级命中率指标。

尽管未用于任何指标L2_DATA_READ/WRITE_MISS_CACHE_FILL L2_DATA_READ/WRITE_MISS_MEM_FILL 事件也可帮助对数据局部性进行调优。如这些事件的说明所述,它们不能用于计算任何与二级相关的指标,因为它们包括一些预取。不应认为这些事件的数量是准确的,但是,CACHE_FILL MEM_FILL 的一般比率可能显示太多数据正从其它内核的高速缓存进行访问。由于远程高速缓存访问与内存访问具有同样高的延迟,因此应该避免远程高速访问。

调优建议

许多用于增强数据局部性的传统技术适用于英特尔至强融核协处理器高速缓存阻塞、软件预取、数据调整且使用流存储可帮助将更多数据保存在高速缓存中。对于驻留在邻近高速缓存中数据的相关问题,使用高速缓存感知数据分解或私有变量比较有用。指令集相关性问题是另一种数据据便携性问题,难以检测到。如果命中率较低(尽管尝试了部分上述技术来降低它们),在太多高速缓存行(映射至相同指令集)中发生的冲突缺失可能成为问题所在。当应用正在访问具有 4KB 跨度的一级中的数据或具有 64KB 跨度的二级中的数据时,指令集相关性问题(冲突缺失)会发生在英特尔至强融核协处理器上。指令集相关性问题(冲突缺失)引起的特定缺失无法与事件检测到的一般缺失分隔开来。如果怀疑存在指令集相关性问题,可尝试填充数据结构(同时保持对齐)或改变访问跨度。

5.2 TLB 缺失

所用事件

事件

含义

DATA_PAGE_WALK

一级 TLB 缺失的次数

LONG_DATA_PAGE_WALK

二级 TLB 缺失的次数

DATA_READ_OR_WRITE

读取或写入操作的次数

公式

指标

公式

一级 TLB 缺失率

DATA_PAGE_WALK / DATA_READ_OR_WRITE

二级 TLB 缺失率

LONG_DATA_PAGE_WALK / DATA_READ_OR_WRITE

每次二级 TLB 缺失对应的一级 TLB 缺失

DATA_PAGE_WALK / LONG_DATA_PAGE_WALK

阀值

指标

调查情况:

一级 TLB 缺失率

大于 1%

二级 TLB 缺失率

大于 .1%

每次二级 TLB 缺失对应的一级 TLB 缺失

接近 1

说明与使用

英特尔至强融核协处理器具有 1 个二级 TLB 2 种页面大小4K 2MB。在当前版本的操作系统程序下,默认使用 4K 页面。在这种情况下,二级 TLB 充当页面表格高速缓存,把一级 TLB 缺失损耗(对于二级 TLB 命中)减少至大概 25 个时钟周期。对于大型 (2 MB) 页面,二级 TLB 充当标准 TLB,一级缺失损耗(对于二级 TLB 命中)只有大概 8 个周期。

二级 TLB 缺失损耗至少为 100 个时钟周期另外使用预取隐藏该延迟是不可能的因此有必要避免二级 TLB 缺失。无需太担心在二级 TLB 内命中的一级 TLB 缺失。

由于 4 KB 页面中具有 64 个高速缓存行因此顺序访问页面中所有高速缓存行的一级 TLB 缺失率为 1/64。所以,任何较大的一级 TLB 缺失率表明空间局部性不足;该程序未使用页面中的所有数据。它还可能表示置换 (thrashing);如果多个页面在同一个循环中被访问,TLB 相关性或容量可能不足以容纳所有的 TLB 条目。类似评论适用于大型页面和二级 TLB

如果一级与二级的 TLB 缺失率较高那么一级 TLB 缺失比二级 TLB 缺失多很多。这表示二级 TLB 有能力容纳该程序的工作集,且该程序可能受益于大型页面。

调优建议

对于具有多个流的循环将它们分成多个循环以降低 TLB 压力可能具有促进作用这还可能有益于高速缓存局部性。在循环中访问的地址相差 2 的倍数时,TLB 的有效大小将会由于相关性冲突而减少。考虑在阵列之间填充 1 4 KB 页面。

如果一级与二级比率较高请考虑使用大型页面。

一般来说任何可提高空间局部性的程序转换将促进高速缓存利用与 TLB 利用。TLB 只是另一种高速缓存。

5.3 VPU 使用

所用事件

事件

含义

VPU_INSTRUCTIONS_EXECUTED

线程执行的 VPU 指令数

VPU_ELEMENTS_ACTIVE

对于 VPU 指令活动的矢量元素的数量

公式

指标

公式

矢量化强度

VPU_ELEMENTS_ACTIVE / VPU_INSTRUCTIONS_EXECUTED

阀值

指标

调查情况:

矢量化强度

小于 8 (DP)小于 16(SP)

说明与使用

我们想从每秒浮点运算次数方面测量效率因为那可轻松与机器的峰值浮点性能相比较。然而,英特尔至强融核协处理器没有计算浮点运算次数的事件。替代方式是测量所执行矢量指令的数量。

矢量指令包括执行浮点运算的指令、从内存中加载矢量寄存器并将它们存储至内存的指令、用于操作矢量屏蔽寄存器的指令及其它专用指令如矢量 shuffle

在全矢量上执行的矢量运算使用硬件的所有 (all-ones)”屏蔽寄存器 %k0。因此 2 个全矢量上执行矢量运算时VPU_ELEMENTS_ACTIVE 事件会增加 16对于单精度 8对于双精度。标量 FP 运算通常由编译器使用矢量寄存器实施,但 1 个掩码表示它们仅适用于 1 个矢量元素。

因此了解循环矢量化状况的合理经验法则是针对循环中每个汇编指令增加 VPU_ELEMENTS_ACTIVE VPU_INSTRUCTIONS_EXECUTED 的值并采取这一比率。如果这一数字接近 8 16,那么循环矢量化顺利进行的可能性较大。矢量化强度对于双精度代码不能超过 8,对于单精度代码不能超过 16.如果这一数字大幅偏小,那么循环矢量化则进行的不顺利。

应结合编译器的矢量化报告使用该方法。

把这种方法用于更大的代码段时应倍加小心。代码生成中的各种异常行为与掩码操作指令充当矢量指令的事实会偏离该比率并导致结论不准确。

调优建议

低矢量化强度可能表示编译器未能对特定循环进行矢量化或矢量化效率较低。矢量化报告可能对这些问题有所分析。问题通常是以下一种或多种:

1.    未知的数据依赖性。#pragma simd #pragma ivdep 可用于告知编译器忽略未知依赖性或依赖性为特定类型如减少

2.    非单元跨度访问。这些可归功于多维阵列中的索引或结构阵列中的访问字段。循环交换和数据结构转换可部分消除这类访问。

3.    真正的间接借助具有也是阵列元素的下标为阵列编索引。实质上,这些问题通常是算法方面的,可能需要借助大范围的数据结构重组来消除。

5.4 内存带宽

所用事件

事件

含义

L2_DATA_READ_MISS_MEM_FILL

导致内存读取包括预取的读取操作次数。

L2_DATA_WRITE_MISS_MEM_FILL

导致内存读取的写入操作次数。通过使用内存读取所有权 (RFO) 交易以保持一致性实施写入。包括预取。

L2_VICTIM_REQ_WITH_DATA

导致内存写入操作的驱逐次数。

HWP_L2MISS

未命中二级的硬件预取次数

SNP_HITM_L2

命中二级内被修改数据的入站探听次数导致二级驱逐

CPU_CLK_UNHALTED

周期数

公式

指标

公式

读取带宽(字节/时钟)

(L2_DATA_READ_MISS_MEM_FILL + L2_DATA_MISS_MEM_FILL + HWP_L2MISS) * 64 / CPU_CLK_UNHALTED

写入带宽(字节/时钟)

(L2_VICTIM_REQ_WITH_DATA + SNP_HITM_L2) * 64 / CPU_CLK_UNHALTED

带宽(GB/秒)

(读取带宽 + 写入带宽)*频率 (GHZ)

阀值

指标

调查情况:

带宽

小于 80GB/

说明与使用

该公式计算带宽的方式是计算来自所有不同类型事件引起内存读取或写入的数据传输的总次数。它并未考虑流存储。对于使用流存储的应用,带宽将会被低估。

当内核执行读取内存的指令时它必须让二级与一级高速缓存充满数据。如果这两种高速缓存都没有数据,内核将从另一个内核的高速缓存或内存中读取数据。后种情况会引起 L2_DATA_READ_MISS_MEM_FILL 事件。当内核执行写入内存的指令时,它必须首先执行读取所有权 (RFO),以将数据引入高速缓存层次结构。如果该数据来自内存,写入操作会导致 L2_DATA_WRITE_MISS_MEM_FILL 事件。如第 5.1 部分所述,FILL 事件包括一些类型的预取。尽管这使它们不适用于计算命中率 —— 只采用需求数据,但它们仍可用于带宽计算,因为预取确实可使用真实带宽。

当二级条目需要保存一数据且没有可用行时内核必须驱逐一行如果该行已被修改那么它必须写入内存。这会导致 L2_VICTIM_REQ_WITH_DATA 事件。如果 1 个内核的高速缓存中的数据已被修改且另一内核需要该数据,那么第 1 个内核会接收到 1 个使它驱逐该数据的探听命中修改 (HITM) 事件。这会导致 SNP_HITM_L2 事件。通常,该探听会引起至第 2 个内核的高速缓存到高速缓存传输(请见第 5.1 部分),但如果该内核正使用 clevict 指令,那么尽管由同一个内核生成,它们仍会呈现为入站探听。忽略该事件通常是安全的,但在某些情况下,编译器或运行时间将使用 clevict 指令 —— 通常结合流存储。如果两个内核之间共享大量修改的数据,包括该事件可导致高估内存带宽(通过包括高速缓存到高速缓存传输)。

这种带宽计算方法使用内核事件。替代方法可从内存控制器上的非内核事件中收集样本。VTune Amplifier XE“带宽数据图表 (profile) 使用非内核抽样方法。多数情况下,两种方法应该会得出几乎相同的内存带宽值。

调优建议

用户必须知道他们的应用应该使用多少内存带宽。如果数据集完全适合内核的二级高速缓存,那么内存带宽值将较小。如果应用预计要使用大量内存带宽(例如通过长矢量进行流动式传输),那么该方法可估计出实现的理论带宽量。

实际上当大于 140GB/实现的带宽就接近应用可支持的最大带宽。如果实现的带宽大幅小于该值,可能是由于高速缓存的空间局部性较差,可能因为存在指令集相关性冲突或预取不足。在极端情况下(随机访问内存),也可观察到许多 TLB 缺失。

6 结论

如第 1 部分所述为了有效利用英特尔至强融核协处理器的性能潜力需要对应用进行出色的并行化和矢量化处理且应用需要利用数据局部性。本指南中的指标可帮助了解上述 3 个方面所存在问题的微架构影响。许多资源可帮助开发人员面向英特尔至强融核协处理器优化软件。第 6.1 部分列出了一些有用的链接,第 6.2 部分提供了所有需要用于计算本指南所述指标的事件表格。

6.1 资源

Intel® VTune™ Amplifier XE 2013 评估中心

http://software.intel.com/en-us/intel-vtune-amplifier-xe-2013-evaluation-options/

Intel® VTune™ Amplifier XE 2013 产品页

http://software.intel.com/en-us/intel-vtune-amplifier-xe/

英特尔® 至强融核协处理器开发人员门户

http://software.intel.com/mic-developer

面向英特尔集成众核架构的编译器方法包括性能优化

http://software.intel.com/en-us/articles/programming-and-compiling-for-intel-many-integrated-core-architecture

6.2 本指南使用的事件列表

可通过创建自定义分析、然后选择基于新 Knights Corner 硬件事件的抽样分析借助 VTune Amplifier XE 2013 收集这些事件。可分别添加事件。

CPU_CLK_UNHALTED

http://software.intel.com/en-us/intel-vtune-amplifier-xe-2013-evaluation-options/

Intel® VTune™ Amplifier XE 2013 产品页

内核执行的周期数

INSTRUCTIONS_EXECUTED

线程执行的指令数

VPU_ELEMENTS_ACTIVE

线程执行的 VPU 操作数

DATA_READ_OR_WRITE

线程一级数据高速缓存支持的负载与存储的数量

DATA_READ_MISS_OR_WRITE_MISS

不具有线程一级高速缓存的需求负载或存储的数量

L1_DATA_HIT_INFLIGHT_PF1

用于已从二级预取至一级的高速缓存行的需求负载或存储的数量

DATA_READ_OR_WRITE

线程一级数据高速缓存支持的负载与存储的数量。

EXEC_STAGE_CYCLES

线程在执行计算操作时的周期数

L2_DATA_READ/WRITE_MISS_CACHE_FILL

计算另一个内核的二级高速缓存在同一卡上提供的二级读取或读取所有权缺失。包括未命中本地二级高速缓存的二级预取,因此对于决定需求高速缓存填充没有用处。

L2_DATA_READ/WRITE_MISS_MEM_FILL

计算内存在同一卡上提供的二级读取或读取所有权缺失。包括错过本地二级高速缓存的二级预取,因此对于决定需求内存填充没有用处。

DATA_PAGE_WALK

一级 TLB 缺失的次数

LONG_DATA_PAGE_WALK

二级 TLB 缺失的次数

VPU_INSTRUCTIONS_EXECUTED

线程执行的 VPU 指令数

L2_VICTIM_REQ_WITH_DATA

导致内存写入操作的驱逐次数。

HWP_L2MISS

未命中二级的硬件预取次数

SNP_HITM_L2

命中二级内被修改数据的入站探听次数导致二级驱逐

5本指南使用的英特尔至强融核协处理器

声明

本文件中包含关于英特尔产品的信息。本文件不构成对任何知识产权的授权,包括明示的、暗示的,也无论是基于禁止反言的原则或其他。除英特尔产品销售的条款和条件规定的责任外,英特尔不承担任何其他责任。英特尔在此作出免责声明:本文件不构成英特尔关于其产品的使用和/或销售的任何明示或暗示的保证,包括不就其产品的(i)对某一特定用途的适用性、(ii)适销性以及(iii)对任何专利、版权或其他知识产权的侵害的承担任何责任或作出任何担保。

 

除非经过英特尔的书面同意认可,英特尔的产品无意被设计用于或被用于以下应用:即在这样的应用中可因英特尔产品的故障而导致人身伤亡。

 

英特尔有权随时更改产品的规格和描述而毋需发出通知。设计者不应信赖任何英特产品所不具有的特性,设计者亦不应信赖任何标有“保留权利”或“未定义”说明或特性描述。对此,英特尔保留将来对其进行定义的权利,同时,英特尔不应为因其日后更改该等说明或特性描述而产生的冲突和不相容承担任何责任。此处提供的信息可随时改变而毋需通知。请勿根据本文件提供的信息完成一项产品设计。

 

本文件所描述的产品可能包含使其与宣称的规格不符的设计缺陷或失误。这些缺陷或失误已收录于勘误表中,可索取获得。

 

在发出订单之前,请联系当地的英特尔营业部或分销商以获取最新的产品规格。

 

索取本文件中或英特尔的其他材料中提的、包含订单号的文件的复印件,可拨打1-800-548-4725,或登陆http://www.intel.com/design/literature.htm

英特尔、Intel 标识、VtuneCilk 和至强是英特尔在美国和/或其他国家的商标。

* 其他的名称和品牌可能是其他所有者的资产。

英特尔公司 © 2012 年版权所有。所有权保留。

优化声明

http://software.intel.com/en-us/articles/optimization-notice/

性能声明

关于性能及基准数据的更完整的信息敬请登陆 www.intel.com/benchmarks

Pour de plus amples informations sur les optimisations de compilation, consultez notre Avertissement concernant les optimisations.