当前位置:首页 期刊杂志

一种面向高性能计算的性能分析工具设计与实现

时间:2024-05-04

张天麒

(国家超级计算天津中心,天津 300457)

0 引言

高性能计算的发展水平,是一个国家信息化发展程度的重要指标,它对于巩固国防、促进经济和科技的发展有着十分重要的意义。近年来,超级计算机不断推陈出新,高性能计算应用得到了越来越完善的硬件支持,各个领域的数值模拟研究逐渐趋向更大的规模、更高的复杂度和更加精细的尺度发展。

随着软件计算规模的增加,各类性能瓶颈也随之产生。如存储、计算、I/O和通信等方面的缺陷,在不同程度上制约了软件的可扩展性。为了定位和分析这些性能瓶颈,众多科研团队和商业公司开发了不同的性能分析工具。然而,目前已有的性能分析工具往往只针对串行程序或小规模并行程序,对高性能计算软件的适用性不强,且这些工具的功能较为单一,难以满足软件调试的需求,这造成了仿真研发人员在大尺度和大规模程序优化上的困难。

本文参考开源库PDToolkit和TAU[1-3]的设计思路,并在其基础上进行功能扩展,同时集成了多款系统级性能分析工具,形成一套自主的性能分析工具,期望为超级计算平台上的性能分析工作提供便利。同时,以典型的物理学大规模核聚变模拟软件GTC为例,在E级计算机“天河三号”原型机上进行了测试和验证。通过本文工作,将获得一个适用于高性能计算的性能分析工具,可以从程序热点、浮点运算、内存以及CPU使用等方面对软件的运行情况给出综合评价,能够为高性能计算软件优化提供全面的数据参考。

1 相关工作

1.1 性能分析方法

性能分析是指在程序运行过程中采集各种相关信息,通过提取分析这些信息,来获得被测程序在运行时的行为特征,以便于开发人员找出程序可能存在的性能缺陷,从而做出相应的改进和优化,达到提升运行效率的目的。性能分析涉及大量的分析和调试工作,从底层参数采集和记录,到数据的统计、归纳和分析,最后到分析结果的可视化展示等过程,都需要分析工具的支持。这些工具种类繁多,目前高性能计算领域常见的有数十种,按照采集的参数层次的不同可以分为两类:一是系统级性能分析工具;二是应用级性能分析工具。

系统级性能分析工具在程序运行过程中,从计算机系统底层采集各种性能参数,从而反映出系统的负载情况,例如磁盘读写、内存消耗以及网络带宽,等等。典型的工具有:Collectl、Perf以及Darshan,等等,这些工具结构简单,具有很好的兼容性和稳定性,在高性能计算领域应用广泛。其缺点是只能用于评估系统状态,无法从代码层面上做出分析和评价,开发人员很难直接得到针对软件模块的分析结果。

应用级性能分析工具通过在被测程序中植入特定的采集代码,随着程序运行而获取指定模块的性能参数,从而反映出该模块的行为特征,如通信频率、I/O性能、执行时间和调用次数,等等。典型的应用级性能分析工具如英特尔公司发布的Intel VTune Amplifier和由俄勒冈州大学性能分析研究实验室等研究机构合作开发的 TAU(Tuning and Analysis Utilities),这些工具具有功能丰富、采集信息全面和自动化程度高的优点,为性能分析工作提供了一定的便利。

然而,应用级性能分析工具对使用者提出了比系统级更高的要求。以Intel VTune Amplifier为代表的商业软件在使用时存在诸多限制,且用户不掌握其内部代码,从而无法对分析过程进行有效跟踪。而以TAU为代表的开源软件,一般采用库介入的方式配合代码植入,改变了被测程序的编译过程,在兼容性和稳定性上存在一定的缺陷,需要用户根据实际需求修改和调试代码,以适应复杂的底层系统环境。

1.2 自主开发的性能分析工具

不同的研究领域对性能分析的需求也各有不同。如计算机网络领域主要关注网络的带宽、延迟和吞吐等特性;计算机芯片和CPU等硬件领域则侧重于主频、浮点性能和功耗等性能参数;而高性能计算领域主要关注的是程序的计算规模、可扩展性和并行效率等问题。因此,众多不同领域的学者和科研人员开发了具有行业针对性的性能分析工具。

2011年,张拓宇、肖海力、迟学斌[4]针对网格计算应用软件提出了一个集信息收集、分析和展示于一体的性能分析工具设计和实现方法,在提升分析效率,降低开销方面对本文有较高的参考价值。2013年,张惠臻、王超、陈雁[5]基于GNU性能分析工具gprof,开发了一款面向嵌入式领域交叉开发环境的嵌入式性能分析工具Cross-Profiler,基于已有的软件框架,在数据采集和处理能力方面作出优化,为分析工具的架构设计提供了参考。2018年冯赟龙、刘勇、何王全[6]提出一种基于深度学习的程序性能分析框架,用于指导分析深度学习软件的性能瓶颈,在提取程序负载特征和提升效率方面,给出了很好的示范。

由此可见,在现有的性能分析理论指导下,充分借鉴开源工具的技术和方法,开发自主的性能分析工具,是针对大规模数值模拟软件性能分析的有效手段。

2 设计与实现

图1 性能分析工具软件框架

如图1所示,本文所设计的软件框架主要包括三个部分:

一是代码植入模块。该模块首先基于PDTookit对被测程序的源代码进行解析,识别源码的特定语句,并在相应位置作出标记,保存为解析文件。通过设定采集信息的范围,用户可以选择感兴趣的部分代码。接着,基于解析文件向被测程序植入具有信息采集和记录功能的相关代码,生成新的源码文件,用户通过库介入的方式加载工具进行编译,生成可执行文件。最后,为了实时采集底层系统的参数,将多个系统级分析模块如CollectL、Darshan等以批处理脚本的方式做定制化集成,实现采集内存、磁盘读写、CPU使用率等系统状态信息等功能。

二是信息采集和处理模块。被测程序运行过程中,由CPU硬件支持可以获得系统状态数据,如物理内存、进程、CPU利用率情况。通过指令计数器可以对特定的系统事件进行统计,如浮点运算、L1/L2cache命中等。在软件层面,通过插桩获得函数运行时间和通信开销、函数调用次数和调用关系等。这些数据将以计算节点为单位记录在本地,从而建立起节点状态和程序运行状态的实时对应关系,为分析和优化被测程序提供必要的信息。

三是可视化模块。高性能计算应用程序一般在多个计算节点上并发运行,包含了从数十到数百乃至成千上万个并行进程,由分析工具产生的大量数据记录仅靠人力进行逐条分析是十分困难的。借助于可视化工具对分析数据进行统计和整理,集成后处理工具Paraprof分析被测程序架构,生成函数调用关系示意图。基于PAPI将生成的性能参数日志文件标准化,通过绘图工具转化为图表,以简洁直观的方式呈现给用户。

3 测试结果与分析

以典型的物理学大规模核聚变模拟软件GTC为例,在E级计算机“天河三号”原型机上进行大规模性能分析测试,从而对本程序针对大规模高性能计算应用的分析能力进行验证。

3.1 测试软件与环境

测试系统选用E级计算机“天河三号”原型机,该系统采用“迈创”众核处理器Matrix-2000+,麒麟Linux-3.14.57操作系统,每个计算节点配备32核CPU,64GB内存,节点间采用自主天河高速互联网络连接。软件环境方面基于GCC-4.9.1编译器和MPICH-3.2.1并行库,是非常具有代表性的高性能计算环境。

GTC(Gyrokinetic Toroidal Code)是一种回旋动力学环形粒子模拟软件。该软件基于粒子云网格方法,主要用于研究模拟核聚变过程中多模式多尺度的全域等离子体湍流和运输过程。GTC软件基于C/Fortran语言,依赖于MPI并行编程环境,是超级计算平台上典型的大规模并行数值软件。本章测试中所求解的物理问题是磁约束聚变模拟中的“物理模拟”,基于第一性原理方程,通过大规模运算来预测等离子体的运动过程[7]。

测试采用了GTC软件的计算性能评估算例,共使用了1280个CPU核,在80个计算节点上运行作业,每个计算节点上开启16个进程,测试运行总时间为1小时18分。下面详细说明测试结果和各类性能参数的分析情况。

图2 GTC程序结构图

3.2 测试结果

(1)函数追踪与系统状态

程序结构是软件系统的抽象模式,用于指导软件各个方面的设计和优化。高性能计算应用程序结构相对复杂,代码数量较大,所采用的编程语言也各不相同,依靠人力去总结和梳理程序结构十分困难。基于开源的代码识别库构建程序结构分析模块,自动生成函数之间的调用关系图,为程序结构分析提供帮助。

图2展示了由结构分析模块生成的GTC程序结构图,可见该程序采用了非常简洁清晰的结构化程序设计,自顶部向下共有4层结构。采用单向箭头来表示函数的调用关系,同时也对这些函数在代码中的位置做出了标记,以便于用户查找和编辑代码。程序结构图可以显示出程序的框架结构,但无法提供程序在时间上的实际运行轨迹,而这一功能可以通过函数追踪来实现。

图3 函数追踪界面

图3展示了函数追踪功能的可视化页面,横轴表示时间,单位是秒,纵轴表示进程标号,矩形块表示函数在时间轴上的覆盖范围。各个进程的函数运行情况基本相似,这里显示编号为0-3的进程作为例子,选取了PUSHI、LOAD和CHARGEI三个函数分析,可以看出LOAD函数仅在程序初始的一段时间内执行,而PUSHI和CHARGEI大约从200s开始执行,直到程序结束,几乎覆盖了程序90%以上的运行时间。

图4 系统状态信息界面

图4是通过系统级分析模块所获得的单节点系统状态图表,显示了编号为0的节点上内存、CPU和网络状态信息。可以看出CPU核的使用率始终接近100%;单节点上的内存使用量逐渐增加,最后趋于稳定,最高使用量为6.4GB,约占总内存的20%左右;网络方面可以看出进程间的通信量极少,说明该程序更偏向与任务型并发模式。将这些信息与函数追踪数据相结合,能够帮助分析不同函数在系统层面上所表现出的特异性。

(2)计算热点与运算量分析

计算热点是指程序运行中耗时最多的部分,在一定程度上可以反映出应用的性能瓶颈,通过分析和优化计算热点,能够有效地提升运行速度,因此计算热点是软件优化中最重要的参考指标之一。

图5是GTC程序主要模块的运行时间统计图。其中Function坐标轴表示不同的模块名称;Process坐标轴表示不同的进程编号;Time坐标轴表示模块运行总时间,单位是秒。从图中可以看出,两个计算热点分别是PUSHI模块和CHARGEI模块,其中PUSHI模块耗时最多,约占总运行时间的49.8%,CHARGEI模块次之,约占总运行时间的32.1%。因此,针对这两个模块作进一步的负载分析和并行优化是更有价值的。

图5 计算热点分析界面

浮点运算速度是衡量超级计算机性能的一项重要指标。对于一般的高性能计算应用而言,其计算密集程度不高,所以其浮点运算速度往往无法达到超级计算机的性能峰值。然而通过监测某些计算密集的函数模块来得到应用程序局部的浮点运算速度,可以对程序的实际运算能力做出有效评估。

图6是GTC程序主要模块的浮点运算次数统计图。其中Function、Process坐标轴分别表示模块名称和进程编号,而Counts坐标轴则表示模块执行浮点运算的总次数。从图5可以看出,浮点运算次数最高的两个模块依然是PUSHI和CHARGEI模块,说明这两个模块不仅最为耗时,而且具有非常高的计算负载量。结合图5和图6得出PUSHI和CHARGEI模块在单位时间内的单核浮点运算量,即这两个模块实际运行中的运算速度表现。

图6 浮点运算速度分析界面

4 结语

本文提出了一种面向高性能计算的性能分析方法,参考代码分析框架PDTookit和TAU的设计思想,基于PAPI、CollectL和Darshan等开源系统工具,设计并实现了一个综合性强的自动化性能分析工具,能够对高性能计算应用程序的运行状态作出分析和评价,为用户进一步优化程序提供了全面、可靠的数据参考。下一步的工作一方面是分析和评估测试工具对被测程序的性能影响程度,尽量减小测试模块的系统开销;另一方面是基于采集到的各类信息进一步挖掘数据价值,向用户提供更加完善和高质量的分析结果。

免责声明

我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!