¶摘要
要在HPC系统上开发节能应用程序,了解运行时、功耗和每个应用程序的独特特性之间的关系非常重要。在本文中,我们提出了一个功率和性能建模和节能框架,并使用此框架来模拟运行时、系统功率、CPU功率和内存功率。组合模型的性能计数器与应用程序信息结合使用,可以为识别可能降低能耗的应用程序修改提供基础。基于这些模型,我们开发了一个基于网页的假设预测系统,从理论上预测可能的优化结果。我们通过两个超级计算机Mira和SystemG 对两个应用程序,地震模拟和航空航天应用进行了验证。我们的计数器引导优化方法实现Mira上32,768个核心的能耗平均降低了48.65%,SystemG上256个核心的能耗降低了30.67%。
¶研究背景
HPC系统,特别是千万亿次超级计算机,目前消耗了大量的电力。目前500强名单中的前五大系统总耗电量超过50兆瓦,平均功耗为10兆瓦,平均性能为17.54千万亿次(http://www.top500.org/lists/2015/11/)。考虑到实现具有20MW功率的百亿亿次系统的愿望,人们认识到这样的系统将受到功率和能量消耗的极大限制,并且它需要独特的方法来平衡功率和性能。为此,理解运行时、功耗和每个大规模科学应用的独特特征(例如,循环结构,数据结构,数据移动,通信重叠,同步等)之间的关系是很重要的。关于这些关系的见解为应用程序优化提供了指导,以降低功率和能耗。优化可能涉及应用程序修改、系统调整或两者的组合。在本文中,我们将探讨这些组合。
有许多应用程序优化方法可以减少运行时间,例如算法优化、循环嵌套优化、编译器优化技术等。还有许多编程模型、语言和运行时系统,如果经过深思熟虑,也可以减少运行时间。
大多数供应商在硬件级别使用功率监视技术来动态地降低各种资源的功耗,简单的像旋转磁盘和降低空闲核心,复杂的实现异步时钟电路。如今,几乎所有微处理器都包含许多动态资源分配技术,以节省电力,同时按需提供性能。
此外,还有两种基于软件的技术可以降低任意工作负载的功耗。第一种是动态电压和频率调节(DVFS),其中根据策略和需求在一些时间窗口内动态调整CPU频率。另一种是动态并发限制(DCT),这种技术可以在类似的约束条件下在运行时调整并发级别。
直观地节省能量意味着降低功率或减少运行时间,或两者兼而有之。因此,该领域的所有研究可分为三类:(1)减少时间和功率;(2)在牺牲增加功率的同时减少时间;(3)在牺牲时间增加的情况下降低功率。功耗($E$)是时间($T$)范围的平均功率($W$:平均功率)的能量,即$E = T * W$。为了阐明这三个类别,我们假设时间的百分比变化是 $a(0 <a <1)$,并且与进行修改的基线相比,功耗的百分比变化是 $b(0 <b <1)$。下面,我们提供三个类别的简单数学分析。
(1)同时降低时间和功率
假设时间降为 $T*(1-a)$,功率降为 $W*(1-b)$ ,那么相应的能耗降为$T*(1-a)W(1-b) = (1-a)(1-b)TW<T*W$,在这种情况下,能耗节省了 $1-(1-a)(1-b)=a+b-ab$ 。
在[3]中,作者使用DVFS和DCT通过同时节能(平均6%)和性能改进(平均14%)实现了能量显着降低(平均19%)。在[6]中采用了类似的方法,平均节能4.18%,性能提升高达7.2%。在我们之前的工作[8]中,使用DVFS,DCT和代码修改,我们能够将运行时间降低多达14.15%并同时将功耗降低多达12.50%。
(2)降低时间,增加功率
假设减少的时间是 $T*(1-a)$,并且增加的功耗是 $W*(1+b)$ ,我们得到的能量:$T*(1-a)W(1+b)=(1-a)(1+b)* T* W$。如果 $(1-a)(1+b)TW <T*W$ ,即 $b-a-ab <0$,则发生能量减少。如果 $b≤a$,则发生节能。这种方法在通过资源利用率的增加(例如,并发性的增加)来减少运行时的方法中是常见的。
(3)降低功率,增加时间
假设时间增加到 $T*(1+a)$, 功率减少到 $W*(1-b)$,最终的能耗为 $T*(1+a)W(1-b)=(1+a)(1-b)TW$。如果 $(1+a)(1-b)TW<T*W$,也就是 $a-b-ab<0$,则能耗降低。如果 $a≤b$,则发生节能。这种方法在使用DVFS的方法中很常见。***理论上大多数应用程序都花费时间等待CPU之外的其他所有事情,因此降低CPU频率可以比性能成本节省更多功率。***这一概念促成了IBM(BlueGene),SiCortex(MIPS)和Calxeda(ARM)等供应商开发的新架构。
在本文中,我们使用性能和功率建模方法,利用前两个类别来指导节能应用程序的开发,因为BG/Q只有固定的CPU频率设置(1.6GHz)。
¶性能和功率建模
有必要准确地测量或估计功耗。由于高频下的直接在线功率测量是不切实际的,因此硬件性能计数器已被广泛用作估计功耗的有效代理。硬件性能计数器已经包含在大多数现代架构中,并且暴露在商业硬件上的用户空间中。性能计数器通过计算特定事件(如高速缓存未命中、流水线停顿、浮点运算、字节输入/输出、字节读/写等)来监视系统组件(如处理器、内存、网络和I/O)。可以在硬件级别收集此类事件的统计信息,几乎没有开销。这使得性能计数器成为监视应用程序,分析其硬件资源使用情况以及估计其运行时和功耗的有力手段。
以前关于功率建模和估计的大部分工作都是基于性能计数器[5,4,2,11,7,1,10,8,13,17]。这些方法使用性能计数器来监视多个系统组件。然后,作者尝试将这些数据与每个系统组件消耗的功率相关联。该相关性用于推导可以估计每个系统组件的功耗的模型。其结果的准确性取决于性能计数器的选择/可用性,评估的基准/应用以及所使用的特定统计数据拟合方法。许多上述方法使用一小组性能计数器(通常少于10个计数器)进行功率建模。在我们最近的工作[8]中,我们针对指标开发了四种不同的模型:基于40个性能计数器的运行时,系统功耗,CPU功率和内存功率。我们发现用于每个不同模型的性能计数器并不相同。在研究六种科学应用时,我们发现共有37种不同的性能计数器用于模型,从模型到模型只有3或4个计数器是相同的。
为了开发运行时和功耗模型,我们在一个系统上收集了40个可用的性能计数器,这些计数器具有不同的系统配置(核心数,节点数)和应用程序问题大小。然后,我们使用Spearman相关和主成分分析(PCA)来识别主要性能计数器($r_1,r_2,\cdots r_n (n<40)$),这些计数器与度量运行时、系统功率、CPU功率或内存功率高度相关。然后我们使用非负多元回归分析来生成基于一小部分主要计数器和CPU频率($f$)的四个模型。
对运行时间$t$建模如下:
$$
t=\beta_0+\beta_1r_1+\cdots+\beta_nr_n+\beta*\frac{1}{f} \tag{1}
$$
在这里,$\beta_0$是截距,$\beta_n$表示性能计数器$r_n$的回归系数,$\beta$是CPU频率$f$的系数。
类似地,我们可以使用以下等式对CPU功耗 $p$ 进行建模:
$$
p=\alpha_0+\alpha_1r_1+\cdots +\alpha_nr_n+\alpha*f^3 \tag{2}
$$
在这里,$\alpha_0$是截距,$\alpha_n$表示性能计数器$r_n$的回归系数, $\alpha$是CPU频率$f$的系数。系统功率和存储器功率模型的等式与等式2类似。
¶建模与节能框架
图1是我们基于计数器的建模和节能框架的功能的总图。我们使用MuMMI [16]收集性能计数器以及我们希望关联的四个指标,并将数据上传到MuMMI数据库。所有性能计数器都根据执行的总周期数进行标准化,以便为每个计数器创建性能事件率。接下来,执行Spearman相关和主成分分析(PCA)以识别与四个指标相关的重要计数器。然后,使用等式1和2,基于减少的计数器组和CPU频率,使用非负多元回归分析来生成四个模型中的每一个。我们之前的工作表明运行时和功率模型对于所使用的六种科学应用,预测误差率平均低于7%。MuMMI提供基于Web的建模系统,可根据计数器的数据和MuMMI数据库中的四个指标自动生成运行时和功率模型。
在指标的四个模型的基础上,我们实施了一个计数器排名方法,以确定哪些测量计数器做出了重大贡献。然后,这些计数器用于指导应用程序修改,以实现运行时和功耗的减少。
¶计数器相关性分析与排序
一旦我们获得了运行时、系统功耗、CPU功率和内存功率的模型,我们就会确定四个模型中每个模型的最重要的性能计数器。
排名算法如图2所示,其工作原理如下:首先,创建计数器列表,其由具有最高系数百分比的计数器组成。根据运行时间、系统功率、CPU功率和存储器功率的顺序,这些计数器的系数与四个模型的所有系数之和的比率最高。其次,按照相同的顺序,我们从计数器列表中删除无效的计数器(小于1%的计数器)。最后,我们使用成对的Spearman相关性来分析和排序这些计数器之间的相关性,以识别对模型最有效贡献的计数器,以形成最终的计数器列表。进行修剪使得如果具有较高等级的计数器与较低等级的计数器高度相关,则消除具有较低等级的计数器。结果列表的计数器用于指导应用程序修改。
¶节能策略推荐
众所周知,性能计数器的值与影响性能和功耗的应用程序的属性相关。许多代码优化仅专注于改进缓存重用以减少应用程序运行时间,因为已知内存访问是大多数体系结构的主要瓶颈。但是,这些努力通常基于来自几次运行的性能数据,而很少考虑数据依赖性,问题大小和/或系统配置。此外,他们倾向于忽视功耗问题。在这项工作中,性能和功耗模型是根据不同的系统配置和问题大小生成的,因此可以广泛了解应用程序对底层架构的使用。这样可以更好地了解应用程序在给定体系结构上的能耗。例如,如果我们将计数器 $r_1$ 和 $r_2$ 作为最重要的计数器,其中 $r_1$ 在运行时模型中占主导地位,而 $r_2$ 在功率模型中占主导地位,并且发现两者都是不相关的,那么我们对应用程序的修改将集中在两个计数器上。通过这种方式,我们的修改不仅可以减少应用程序运行时间,还可以降低功耗。但是,使用通用、功能无意识的性能工具,如gprof,TAU,ScoreP,HPCToolkit,HPM Toolkit和CrayPat,对计数器 $r_2$ 的影响也许完全不被注意。
请考虑以下事项:假设$r_i$,$r_j$和$r_k$为三个性能计数器,这些计数器对运行时模型(公式1)或功率模型(公式2)(系统、CPU、或内存的功率模型)有着显著的贡献。其中$r_i$被认为是最重要的。$r_i$和$r_j$的相关值为0.9,与$r_k$的相关值为0.6。如果$r_i$的值减少20%,则$r_j$的值降低18%(0.9*20%),$r_k$的值减少12%(0.6 * 20%)。在此假设下,我们使用等式1和2来预测对运行时和功耗的理论影响。
通常,基于运行时和功率模型以及计数器相关性,我们开发了一个基于Web的假设预测系统,用于在理论上预测可能的优化结果,如图3所示,例如,给定应用程序PMLB [15] ,如果TLB_IM的数量减少20%,相关计数器将根据它们与TLB_IM的相关值减少,运行时间减少4.13%,平均节点功率几乎相同,CPU和内存功耗也减少了一点。
然后立即出现一个问题,即如何将计数器$r_i$的值减少20%。这需要彻底了解应用程序特征以及影响该特定度量标准的底层架构部分。在[12]中,讨论了几种典型的代码性能模式,并映射到一些可以帮助代码优化的硬件度量。重要的是要意识到像PAPI预设[9]这样的通用性能计数器可能很容易被用户误解为不同的体系结构。用户必须在体系结构手册中查找确切的定义,并了解应用程序特征和底层体系结构单元如何影响计数器。
¶案例研究:性能计数器引导的能源优化
在本节中,我们使用两个科学应用:并行航空航天应用PMLB [15]和并行地震模拟eq3dyna [14],来讨论在两个功率感知超级计算机Mira,和SystemG上的性能计数器引导的能量优化。
¶PMLB on SystemG
图4显示了四个模型的性能计数器排名,使用15个不同的PMLB计数器,SystemG上的问题大小为128x128x128。我们将图2中的排名算法应用于四个模型中的每一个的计数器。将它们从最重要到最小排序,它们是:TLB_IM(指令转换后备缓冲器(TLB)未命中),VEC_INS(向量/ SIMD指令),TLB_DM和L2_ICM。
TLB_IM排名最高,其次是VEC_INS。我们使用成对的Spearman相关来分析两个计数器之间的相关性,如下所示:
我们发现计数器TLB_IM仅在运行时模型中有贡献,并且它与TLB_DM和L2_ICM相关。然而,VEC_INS在系统功率,CPU功率和存储器功率的模型中有所贡献,并且与任何其他计数器无关。因此,我们专注于对SystemG上的计数器TLB_IM和VEC_INS进行优化。从理论上讲,使用我们的假设预测系统,将TLB_IM的数量减少20%可以使运行时间减少4.13%;将VEC_INS加速20%导致节点功率降低1.85%。
SystemG上的Linux系统支持两种页面大小,默认为4KB,大页面为2MB。单个2MB大页面只需要一个TLB条目,而等量的内存需要使用4KB页面的512个TLB条目。因此,为性能受TLB未命中约束的应用程序启用此类页面大小可能具有显着的益处。在这里,我们使用libhugetlbfs为应用程序执行启用了2MB页面,以减少TLB未命中。我们还对代码进行了矢量化,并使用编译器选项-ftree-loop-distribution来执行循环分配,以提高大循环体上的缓存性能,并允许进行进一步的循环优化,如矢量化。
这些优化的结果如图5所示. SystemG每个节点有8个核心。我们观察到应用程序运行时间平均减少了11.23%(图5(a)),系统功率平均增加了0.01%(图5(b))。图5(c)中的CPU功率平均增加了2.13%,图5(d)中的存储器功率平均增加了0.61%。总的来说,这意味着平均节能11.28%。据观察,平均节能百分比(11.28%)大于运行时间改善百分比(11.23%),这意味着减少运行时间和功率会导致更大的节能。
¶总结
使用我们的基于性能计数器的建模和节能框架,我们开发了一个基于Web的假设预测系统,从理论上预测可能的优化结果。我们相信这个框架可以应用于在其他架构上执行的大规模科学应用,包括GPGPU等硬件和Intel-Xeon Phi等多核加速器,并且可以使用一个架构上的这些应用的功率和性能模型来预测具有类似架构的大规模系统的功耗和性能。我们的方法代表了一种通用的全面优化方法,专注于最有效地利用可用资源,平衡运行时间与功耗。通过这种方式,我们希望我们的方法能够为应用程序和系统开发人员提供额外的指导,以开发下一代节能应用程序和超级计算机。