OpenMP程序性能退化的诊断与处理

更新时间:2023-09-06 09:54:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

是讲OpenMP的一些论文 在并行编程中可以用到。

 第26卷第9期  2005年9月

小型微型计算机系统MINI-MICROSYSTEMSVol126No.9 

 Sep.2005

OpenMP程序性能退化的诊断与处理

李建江1,舒继武2,陈永健2,王鼎兴2

1(2(

北京科技大学信息工程学院,北京100083)清华大学计算机系,北京100084)

E2mail:lijianjiang@http://www.77cn.com.cn

摘 要:为了解决OpenMP程序性能退化问题,本文提出性能退化区和性能退化强度的概念.使用性能退化强度能够剔除非性能退化区并突出执行时间较长的性能退化代码段;同时,性能退化区的分解能够逐步缩小性能退化区并最终准确定位引发性能退化的代码段.去除引发性能退化的根源就能有效改进OpenMP程序的执行性能.实例分析证实了本文提出的OpenMP程序性能退化诊断与处理方法的有效性.关键词:OpenMP;性能;退化;分解

中图分类号:TP311     文献标识码:A      文章编号:(2005092PerformanceDegradationDiagnosisandP122LIJian2jiang,SHUJi2wu,CHENYong2G2xing1(2(

InstituteofInformationT,Beijing100083,China)

DepartmentofuThuaUniversity,Beijing100084,China)

Abstract:InorderrmancedegradationinOpenMPprograms,http://www.77cn.com.cningperformancedegradationstrengthisabletoeliminatecoderegionswhoseperformancedoesn’tdegradeandgiveprominencetoperformancedegradationregionsthatneedrelativelylongexecutiontime.Atthesametime,thedecompositionofperformancedegradationregionscanreducethescopeofperfor2mancedegradationregionsandfinallylocatethecodesectionsthatresultinperformancedegradation.Then,theperformanceofOpenMPprogramswillbeimprovedthroughremovingrootsofperformancedegradation.TheanalysisofexamplesprovesthatthemethodofperformancedegradationdiagnosisandsolutionforOpenMPprogramsproposedinthispaperisefficient.Keywords:OpenMP;performance;degradation;decomposition

1 引 言

作为一种已被广泛接受、用于共享存储编程的工业标准,

OpenMP[1]是由一系列编译指导语句和库调用组成的.使用OpenMP来开发共享存储系统上的多线程程序是非常简单和

访问行为等[4].

对存在性能退化现象的OpenMP程序需要进行性能调

整,其前提是通过使用有效的性能分析工具来检测出Open2MP程序中存在的性能瓶颈,即对OpenMP程序性能退化进行诊断继而进行相应的处理是非常必要的.在过去几年间,有关OpenMP程序性能测量与分析方面的研究已经取得了一些成果并有商业性软件问世,它们分别在运行时库、源程序、中间表示以及计数器监测等多个层面上得以实现.其中:

GuideView[5]是第一个以OpenMP为对象的性能分析工具.

非常容易的,然而很难保证所开发出的OpenMP程序具有很高的性能[2].如果程序中的并行性都能被成功开发的话,则程序的执行时间必定得到显著的下降.然而在程序的执行过程中,当代码段的性能被并行开销所控制的时候,在这些地方将会出现性能退化现象,它们综合作用的结果必将导致程序整体性能的下降甚至于退化.导致OpenMP程序中部分代码段出现性能退化现象的原因很多,主要表现为以下几种情况:对位于内层较小的循环进行并行;当指定并发执行的线程数大于实际处理器个数的时候;出现假共享的时候等等.归根结底,性能退化的根源在于过多的fork 大量低效率join开销、的同步操作、非均衡的负载分布以及应用过程中糟糕的内存

[3]

它通过对运行时库插桩的办法来捕获那些对并行性能至关重要的时间信息,然后通过图形界面浏览这些性能数据,最终对

有助于程序性能提高和导致程序性能退化的并行结构进行快速识别.TAU[6]在源程序级进行插桩,通过对各线程状态的独立显示让OpenMP程序开发人员能直观观察到何时、何处发生负载不均衡的现象.Ovaltine[7]通过对中间表示的相关段进行插桩,为OpenMP程序开发人员提供各种引起程序性能

收稿日期:2004201229 基金项目:国家自然科学基金(69933020)资助;Intel公司OpenMPforORC课题资助. 作者简介:李建江,男,1971年生,博士研究生,研究方向为并行编译,多线程技术;舒继武,男,1969年生,副教授,研究方向为大规模科学与工程计算中的并行算法,并行处理技术及并行应用软件;陈永健,男,1977年生,博士研究生,研究方向为并行编译,多线程技术;王鼎兴,男,1937年生,教授,博士生导师,研究方向为并行计算机体系结构,并行计算.

是讲OpenMP的一些论文 在并行编程中可以用到。

9期       李建江等:OpenMP程序性能退化的诊断与处理  1665

下降的开销分析.VTune[8]通过采样、调用图或记数器监测等方式实现OpenMP程序中性能问题的识别与定位.上述这些性能分析工具功能强大,但是需要对运行时库、源程序或中间表示进行插桩处理或借助于计数器的监测,而且在性能分析的过程中并未区分引发性能退化和未引发性能退化的代码段,所以不能及时缩小性能分析的区域和减少性能分析的总体开销;另外,这些性能分析工具均不能对性能退化进行定量分析,还仅仅停留在对性能退化的定性描述上.

为此,本文提出性能退化区和性能退化强度的概念.使用性能退化强度能够剔除非性能退化区并突出执行时间较长的性能退化代码段;性能退化区分解能够逐步缩小性能退化区并最终准确定位引发性能退化的代码段.去除引发性能退化的根源就能够有效地改进OpenMP程序的执行性能.

2 性能退化区与性能退化强度

法都能获得OpenMP程序的性能数据,据来实现OpenMP.,给出OpenMP,,.

2.1 OpenMP假定某个OpenMP程序共含n个测量区(MeasurementRegion:测量开始与测量结束所包含的代码段)(分别记为MRi,其中i∈[1,n],串行执行第i号测量区需时间为ts(i),

mt个线程并发执行第i号测量区所需时间为tp(i,mt).参照

并行加速比与并行效率的定义,可以给出如下的测量区并行加速比与测量区并行效率的定义.

定义1.测量区并行加速比SpeedUpofMR(Speedupof

MeasurementRegions):

SpeedUpofMR(i,mt)=ts(i) tp(i,mt)   

j=0,mt-1

(1)

其中tp(i,m)=maxtp(i,j),tp(i,j)为第j号线程执行第i号测量区所需时间.

定义2.测量区并行效率EfficiencyofMR(Efficiencyof

MeasurementRegions):

EfficiencyofMR(i,mt)=SpeedUpofMR(i,mt) mt=

(tp(i,mt)×mt)(2)ts(i) 测量区并行加速比与测量区并行效率这两项性能指标能

够对某个测量区已达到的并行化效果进行刻画.2.2 性能退化区

下面给出性能退化区的定义及性能退化区的相关属性.定义3.性能退化区(PerformanceDegradationRegi2

ons):

并发执行的线程数目有关.为了更清楚地阐述性能退化与线程数之间的关系,提出退化阶与最小退化阶的概念.

定义4.退化阶(DegradationRank):

参与某个性能退化区并发执行的线程数被称为该性能退化区的退化阶.如果当m个线程并发执行第i号测量区时该测量区为性能退化区的话,则该测量区的退化阶为m,此时可称该测量区为m阶性能退化区.

对于某个测量区来说,其退化阶可能不只一个.比如说,当两个、三个或四个线程并发执行某个测量区时该测量区均为性能退化区,则该测量区既是2阶性能退化区、3阶性能退化区也是4阶性能退化区.此时,该测量区的退化阶为2、3和4.

对于某个测量区来说,.也就是说,((为某个SMP所拥有的),.

(Non2PerformanceDegradationRegions).

定义5.最小退化阶(MinimalDegradationRank):

当某个测量区的退化阶存在时,则将该测量区所有退化阶的最小值称作最小退化阶.测量区最小退化阶的值越大,说明该测量区的性能可扩展性越强.当测量区的退化阶不存在时,该测量区的性能可扩展性为最佳.反之,测量区最小退化阶的值越小,说明该测量区的可扩展性越差,当其值为2时该测量区的性能可扩展性为最差.

通过性能退化区的定义,可以判断某个测量区是否为性能退化区.如果是,通过退化阶与最小退化阶还能反映出退化区的性能退化属性.上述定义的根本目的在于识别性能退化区并剔除非性能退化区.2.3 性能退化强度

对性能调整来说,仅仅知道某个测量区是性能退化区及其退化阶还是不够的,因为上述定义尚无法衡量该性能退化区对整个程序性能的影响.为此,提出性能退化强度的概念.

定义6.测量区性能退化强度PerDegStrengthofMR(PerformanceDegradationStrengthofMeasurementRegi2ons):

PerDegStrengthofMR(i,mt)=tp(i,mt)×sign(i,mt) (3)其中:

 sign(i,mt)=

(4)

0,当第i号测量区不是mt阶性能退化区

.通过性能退化强

1,当第i号测量区为mt阶性能退化区

对于某个m∈整数,如果 m′∈整数且1≤m′<m≤M(M为某个SMP所拥有的CPU个数),使SpeedUpofMR(i,m)

),亦即当m个线程并发执行第i号测<SpeedUpofMR(i,m′

)的话,则称当m个线程并发执行量区时tp(i,m)>tp(i,m′

第i号测量区时该测量区为性能退化区.

某个测量区是否具有性能退化的性质是与参与该测量区

度能够在剔除不是mt阶性能退化区的同时突出执行时间较长的mt阶性能退化区.性能退化强度的提出为后续的性能退化区分解及性能调整奠定了基础.

3 性能退化区的分解(DecompositionofPerfor-manceDegradationRegions)

如果第i号测量区为mt阶性能退化区,且该测量区可被进一步分解为ni

个测量区.则在这ni个测量区中至少存在一

是讲OpenMP的一些论文 在并行编程中可以用到。

1666         小 型 微 型 计 算 机 系 统       2005

个退化阶小于等于mt的性能退化区.这样就将对第i号测量区所进行的诊断转化为对其所包含且退化阶小于等于mt性能退化区的子测量区所进行的诊断,该过程被称作性能退化区的分解.

Step1定义测量区,每个测量区所包含代码的范围都很大;

Step2获得这些测量区的性能数据(不同线程数对应的并发执行时

语言版本)的A规模.NASNPB2.3是由从航空物理学应用衍生而来的五个计算流体力学核心应用(FT,MG,CG,EP

间);

Step3对每个测量区进行如下处理:

 Step3.1根据定义3判定其是否为性能退化区,如果是,则记录其

退化阶;

 Step3.2根据定义6和Step3.1的结果获得退化区在某个退化阶下

所对应的性能退化强度.

Step4选取性能退化强度较大的那些退化区进行如下处理:

 Step4.1对退化区进行增量式分解(重复执行Step2,Step3和

Step4);当性能退化区所包含代码段的范围较小时停止

图2 SP.目IS)(,SP和LU)所组成

对其进行进一步的分解;

 Step4.2,

.对该退化区进行性能调整,.

,所以又称之为增量

式性能退化区分解.由于它仅仅针对性能退化区进行分解,所以可以避免对所有区域都进行精细的性能测量,能够减少性能分析的总体开销;同时逐步缩小性能退化区所包含的范围,能够最终实现性能退化原因的准确定位.当退化区包含的范围非常小的时候,可以停止对其进行进一步的分解.选取这些退化区中性能退化强度较大的那些退化区进行性能调整就能够达到改善程序整体性能的目的.该过程可用图1来示意.

PB3集,ark其程序框架如图2所示.4.2 性能退化区的分解

当参与并发执行的线程数分别为2、3、4的时候,SPbenchmarkA规模实际测试所得的并行加速比如图3所示.从该图不难发现随着参与并发执行线程数的增加,SP.A

4 实例分析

4.1 测试环境与测试对象

图3 SP.A并行加速比

程序的并行加速比(线程数为2时并行加速比为1.512,线程数为3时并行加速比为1.557,而线程数为4时并行加速比为1.061)当线程数由3增加4时下降非常明显.为了找到导致程序性能明显下降的根本原因,

这里使用本文提出的性能

本文进行实际测试所使用的平台是一台4cpu的Itani2um2,所使用的OpenMP编译器为Intel的ecc7.0,编译优化级别为O3.测试对象为NASNPB2.3[9]中SPbenchmark(C

图4 SP.A中性能退化区的增量分解过程

退化区诊断策略:将性能退化区进行增量式的分解(如图4所

示).首先使用较大的测量粒度(图2左半侧),发现函数adi

是讲OpenMP的一些论文 在并行编程中可以用到。

是唯一的性能退化区,其最小退化阶为4.接下来对退化区adi进行分解,发现函数x-solve、y-solve及z-solve(这三个函数是adi的组成部分)均为最小退化阶为3的性能退化区.随着退化区分解的不断深入,发现引起SP.A性能退化的主要原因是函数lhsx(x-solve的组成部分)、lhsy(y-solve的组成部分)及lhsz(z-solve的组成部分)中第一个含有#pragmaompfor指导语句的循环结构(分别记为lhsx.1、lhsy.1和lh2sz.1),它们均是最小退化阶为2的性能退化区,属于性能退化最严重的情况.

4.3 退化区的性能改进

通过性能退化区的分解得知lhsx中第一个含有#prag2maompfor指导语句的循环结构(即lhsx.1,其源代码如图5所示)的效率很低,其中两个#pragmaompfor指导语句都位于该循环结构的最内层.由于#pragmaompfor指导语句位于循环最内层将产生太多的同步,使得此处的并行开销高过了并行循环所获收益,从而导致性能的退化.解决的办法是设法将#pragmaompfor外层.for(j=1;j<=po2+)改进2:在将临时数组rhon由一维数组扩展为三维数组、消除临时变量ru1和临时数组cv并将循环次序由j2>k2>i调整为i2>j2>k之后,把#pragmaompfor指导语句外移到该循环结构的最外层,#pragmaompfor指导语句由两条变为一条.

退化区lhsy.1与lhsz.1的改进与之相似.退化区lhsx.1、lhsy.1与lhsz.1改进前后的性能对比情况见图6(其中参与并发执行的线程数为4).该图显示,通过性能退化区的诊断与处理使得这三个性能退化区的性能都得到了极大的提高.其中:lhsx.1的并发执行时间由48.653s下降为5.095s(改进1)与1.917s(改进2);lhsy.1的并发执行时间从38.743s下降为2.369s(改进1)与2.502s(改进2);lhsz.1的并发执行时间从44.189s下降为2.(改进1)与2.483s(改进2

).

 for(k=1;-po]k++){ #pragmaompr

for(i=0;i<=grid-points[0]21;i++){   ru1=c3c43rho-i[i][j][k];

 cv[i]=us[i][j][k];

 rhon[i]=max(dx2+con433ru1,max(dx5+c1c53ru1,

max(dxmax+ru1,dx1)));

图7 SP.A改进前后

执行时间图8 SP.A改进前后

加速比

}

#pragmaompfor

for(i=1;i<=grid-points[0]22;i++){   lhs[0][i][j][k]=0.0;

 lhs[1][i][j][k]=2dttx23cv[i21]2dttx13rhon[i21];   lhs[2][i][j][k]=1.0+c2dttx13rhon[i];

 lhs[3][i][j][k]=dttx23cv[i+1]2dttx13rhon[i+1];   lhs[4][i][j][k]=0.0;  } }

}

对改进后的SP.A的性能进行全程序测量,结果(图7、图8所示)表明无论是改进1还是改进2,当线程数为2时程序性能都有一定的提高;当线程数为3和4的时候程序性能有了显著的提高,尤其是当线程数为4的时候.此时,改进1使得SP.A全程序并发执行时间由原来的245.26s减少为119.36s,下降了51.33%;改进2使得SP.A全程序并发执行时间由原来的245.26s减少为115.49s,下降了52.91%.

5 结 论

使用OpenMP来开发共享存储系统上的多线程程序是非常的简单和容易,然而却不能确保所开发出的OpenMP程序具有很高的性能.针对OpenMP程序并发执行时性能退化的问题以及常见性能分析工具在诊断和处理性能退化方面的不足,本文提出了性能退化区和性能退化强度的概念.使用性能退化强度能够剔除非性能退化区并突出执行时间较长的性能退化区.通过性能退化区的分解,能够逐步缩小性能退化区所包含代码的范围,最终准确定位引发性能退化的代码段,去除引发性能退化的根源就能够有效地改进OpenMP程序的执行性能.

本文以NASNPB2.3benchmark中的SP(OpenMPC版本,执行规模为A)为测试实例,应用本文提出的OpenMP程序性能退化的诊断与处理方法对其进行性能退化区的识别,继而对性能退化区进行不断的分解,最终找到了引发性能显著退化的代码段(函数lhsx、lhsy及lhsz中第一个包含#pragmaompfor指导语句的循环结构).在对这些代码段进

图5 退化区lhsx.1的源代码

改进1:在将临时变量ru1和临时数组cv、rhon申明为私有之后,把#pragmaompfor指导语句外移到该循环结构的最外层,#pragmaompfor指导语句由两条变为一条

;

图6 lhsx.1、lhsy.1与lhsz.1改进前后执行时间

是讲OpenMP的一些论文 在并行编程中可以用到。

行相应的优化处理后,其性能得到了明显的提高,程序的整体性能也得到了改善.当并发执行的线程数为4的时候,改进1使得SP.A全程序并发执行时间由原来的245.26s减少为119.36s,下降了51.33%;改进2使得SP.A全程序并发执行时间由原来的245.26s减少为115.49s,下降了52.91%.实例说明了本文所提出的方法能够有效地解决OpenMP程序并发执行时的性能退化问题.

References:

[1]OpenMP2.0standard.OpenMPAPIV2.0[EB OL].http:

http://www.77cn.com.cn

[2]WilliamGropp.Auser’sviewofOpenMP:Thegood,thebad,

andtheugly[C].In:WorkshoponOpenMPApplicationsandTools,SanDiegoSupercomputerCenter,SanDiego,California,2000.

[3]MichaelVoss,RudolfEigenmann.Reducingparalleloverheads

throughdynamicserialization[C].In:13thInternationalParallelProcessingSymposiumand10thSymposiumonParalleltributedProcessing,SanJuan,R,88292.[4]MarcGonzá.lez,Albertal

interpositiontechniquesforperformanceanalysisofOpenMPparallelapplications[C].In:Proceedingsofthe14thInterna2tionalParallel&DistributedProcessingSymposium(IPDPS’00),Cancun,Mexico,2000:2352240.

[5]KAIofIntel.GuideViewperformanceanalyzer[EB OL].

.com .http: www.kaiparallel kappro guideview

[6]MalonyA,ShendeS.Performancetechnologyforcomplexpar2

allelanddistributedsystems[C].In:Proc.3rdWorkshoponDistributedandParallelSystems,DAPSYS2000,"DistributedandParallelSystems:FromConceptstoApplications,"(Eds.G.KotsisandP.Kacsuk),37246,2000.

[7]BaneM,RileyG.OverheadsprofilerforOpenMPcodes[C].

In:EuropeanWorkshoponOpenMP(EWOMP2000),Septem2ber,2000.

[8]IntelCorporation.VTuneenvironment[EB OL].

.http:. vtune

[9],kinM,TOpenMPimplementationof

sanditsperformance[D].NASTech2eportNAS2992011,October1999.

本文来源:https://www.bwwdw.com/article/qjyh.html

Top