使用迷你小程序来提高应用程序的性能:混合并行程序设计范例外文翻译资料

 2022-08-06 10:08

英语原文共 7 页,剩余内容已隐藏,支付完成后下载完整资料


使用迷你小程序来提高应用程序的性能:混合并行程序设计范例

Gary Lawson,Michael Poteat,Masha Sosonkina

Department of Modeling,Simulation and Visualization EngineeringOld Dominion UniversityNorfolk, VA, USA

Robert Baurlelowast;,Dana Hammond

Hypersonic Air Breathing Propulsion Branchlowast;,Computational Aero-Sciences Branch ,NASA Langley Research Center,Poquoson, VA, USA

摘要

在许多领域中,高性能计算的实际应用已经被开发出来。为了使这些应用程序保持最新状态,必须探索新的并行策略以获得最佳性能;然而,根据代码的大小,重构或修改真实世界的应用程序可能是艰巨的。在这种情况下,可以使用迷你小程序来快速浏览这些选项,而无需修改整个代码。在这项工作中,已经创建了几个迷你小程序,以增强真实应用程序的性能,即NASA兰利研究中心开发的用于复杂流分析的VULCAN代码。这些迷你小程序探索了用于分布式内存访问的消息传递接口(MPI)和用于共享内存访问的共享MPI(SMPI)或OpenMP的混合并行编程范例。性能测试表明,MPI SMPI产生最佳执行性能,同时需要最大数量的代码更改。测量MPI SMPI的最大加速度为23,但对于MPI OpenMP,最大加速度为10。

关键字:小应用程序,性能,VULCAN,共享内存,MPI,OpenMP

1.引言

在很多领域,现实世界的应用已经被开发出来。对于建立的应用程序保持最新,必须探索新的并行策略,以确定哪一个可以产生最好的性能,尤其是随着计算硬件的进步。但是,重构或修改现实世界的应用程序会导致成本的增加,这取决于代码的大小和所做的更改。可能会创建一个迷你小程序来快速浏览这些选项,而无需修改整个代码。迷你小程序减少了应用新策略的开销,因此可以实施和比较各种策略。这项工作介绍了作者的经验,当遵循这个战略为美国航空航天局开发的现实世界的应用程序。

VULCAN(用于复杂流动分析的粘性迎风算法)是一种湍流,无平衡,有限速率的化学动力学,由结构化的,以细胞为中心的多块网格的 Navier-Stokes 流动求解器,由超音速空气呼吸推进分支NASA兰利研究中心(NASA 2016)。在这项工作中开发的迷你小程序使用Householder Reflector 内核来求解线性方程组。这个内核经常被不同的工作负载使用,而且是决定应用于VULCAN的策略类型的一个很好的选择。VULCAN建立在单层MPI上,代码已经过优化以获得完美的矢量化,因此目前使用两级并行。这项工作研究了两种共享内存并行机制,OpenMP和Shared MPI,它们将为应用程序提供第三级并行机制。并行性的第三级提高了性能,这减少了解决方案的时间。

MPI已经将该标准扩展到MPI3.0版本,其中包括共享内存(SHM)模型(Mikhail B.(Intel)2015,Message Passing Interface Forum 2012),在本文中称为Shared MPI(SMPI)。该扩展允许MPI创建在同一物理节点上的MPI任务之间共享的内存窗口。这样,MPI任务就等同于线程,除了Shared MPI对程序员来说更难实现。OpenMP是迄今为止最常用的共享内存库,因为它的易用性(OpenMP2016)。在大多数情况下,并行化一个循环只需要几个OpenMP编译指示;但是,OpenMP的开销会增加,如果调整不当,可能会降低性能。

这项工作的主要贡献如下:

◦使用NASA VULCAN真实代码中的Householder反射器内核创建了用于解决AX = B的微型应用程序

◦应用MPI OpenMP方案创建OpenMP微型应用程序

◦应用MPI SMPI方案来创建共享MPI微型应用程序

◦每个微型应用程序的经过验证的数字输出

◦比较了所有迷你应用程序的执行性能

1.1. 相关工作

早在2000年,(Cappello and Etiemble 2000)的作者发现,对于时延敏感的代码似乎从纯MPI实现中受益,而对带宽敏感的代码从混合MPI OpenMP中受益。另外,作者还发现,如果数据移动不是压倒性的瓶颈(Cappello and Etiemble2000),更快的处理器将使混合MPI OpenMP代码受益。

从那时起,混合MPI OpenMP实现已经改进,但并非没有困难。在(Drosios and Koziris 2004,Chorley and Walker2010)中,发现OpenMP引起了许多性能下降,包括开销(fork/join,atomics等),错误共享,消息传递不平衡以及对处理器的敏感性映射。但是,使用更多线程时可能会隐藏OpenMP开销。在(Rabenseifner,Hager and Jost2009)中,作者发现,简单地使用OpenMP可能会导致性能损失,因为编译器避免了优化OpenMP循环-验证到10.1版本。尽管编译器从此以后已经有了相当的进步,但如果使用OpenMP,那么仍旧使用旧版本编译的应用程序用户可能会面临风险。在(Drosinos and Koziris 2004,Chorley and Walker 2010)中,作者发现混合MPI OpenMP方法优于纯MPI方法,因为混合策略将多样化的路径并行执行。

最近,MPI将其标准扩展到包含SHM模型(Mikhail B.(Intel)2015)。作者(Hoefler,Dinan,Thakur,Barret,Balaji,Gropp和Underwood,2015)介绍了MPI RMA理论和实例,这是SHM模型的基础。在(Gerstenberger,Besta and Hoefler2013)中,作者对MPI RMA进行了全面的性能评估,包括调查了不同的内存窗口同步技术。在(Hoefler,Dinan,Buntinas,Balaji,Barrett,Brightwell,Gropp,Kale andThakur 2013)中,作者研究了MPI SMPI执行的可行性,并将其与MPI OpenMP执行进行了比较。发现OpenMP的基本限制是内存默认共享模型,由于内存模型是默认的私有模式,所以与MPI不能很好地耦合。由于这个原因,MPI SMPI代码预计执行得更好,因为共享内存是显式的,整个代码的内荐模型是默认的私有的。

最近,在Gropp,Olson和Samfas 2016中引入了一种新的MPI通信模型,它更好地捕获了多节点通信性能,并提供了一个开源的基准测试工具来捕获给定系统的模型参数。独立于共享内存层,MPI是节点之间数据移动的事实标准,这种模式可以帮助任何MPI程序。本文的其余部分分为以下几部分:2介绍Householder迷你小程序,3介绍所考虑的迷你小程序的性能测试结果,4总结本文。

2.Householder小程序

迷你小程序使用来自VULCAN的户主计算内核,用于求解线性方程组。householder例程是一种算法,用于将方阵转换为三角形,而不增加每个元素的大小(Hansen 1992)。Householder程序在数值上是稳定的,因为在计算中使用非常小的或非常大的中间值,所以它不会失去大量的精度。

该例程通过迭代过程进行工作,该过程利用Householder变换从输入矩阵的列向量中消除元素。Householder反射器H适用于以下系统;

(HA)x = Hb, where H = (I I 2vvT )ai. (1)

Householder在ai和v上进行操作,ai 是A的一列,v是垂直于应用变换的平面的单位矢量。 有关Householder例程的更详细讨论可以在(Hansen 1992)中找到。 在这项工作中,要解决的问题是AX = B,其中A是大小为mtimes;ntimes;n的三维矩阵,而X和B是大小为mtimes;n的二维矩阵。 用m表示的每个系统都独立于所有其他系统; 因此,该算法令人尴尬地是并行的。

2.1 小程序设计

迷你小程序旨在执行特定的功能。在这项工作中,重要特点如下:

◦接受通用输入

◦验证优化例程的数字结果

◦测量原始和优化例程的性能

◦调整优化。

通用输入是从文件中读入的,文件必须包含至少一个矩阵A和结果向量b。如果只提供一个矩阵和向量,输入将被复制到所有m的实例。优化程序的验证是通过对原始程序和优化程序的输出的差异进行的。迷你小程序将首先使用原始程序计算输入的解,然后再优化程序。这样可以直接比较输出,也可以使用执行时间来测量相对性能。如果优化的例行程序具有一个或多个可能变化的参数,则要对其进行研究,使得可以将优化调整到硬件。在这项工作中,总是至少有一个可调参数。

本来应该考虑到迷你小程序设计的一个功能是模块化Householder例程的不同版本。在这项工作中,设计了两个迷你小程序,因为它们都实现了不同版本的并行Householder例程;但是,设计一个使用模块来包含其他版本的并行Householder内核的单个迷你应用会更好。有了这个功能,在每个版本的内核上工作起来都不那么麻烦。

2.2 并行Householder

为了并行化Householder例程,m被分解成单独的,但是相等的块,然后由每个线程解决-共享的MPI任务相当于这个工作中的线程。然而,最原始的程序在最内部的计算循环(一个有利于向量化和缓存的优化)内的m之间变化,但是为了获得最佳性能,并行循环必须是最外面的循环。因此,对代码的并行部分调用了循环阻塞。循环阻塞是一种通常用于减少计算的内存占用的技术,以使其适合于给定硬件的缓存内部。因此,并行Householder例程至少有一个可调参数,块大小。

在这项工作中,研究了两种共享内存模型:OpenMP和SMPI。OpenMP和SMPI的区别在于如何管理内存。OpenMP使用公共内存模型,默认情况下,所有数据都可用于所有线程。公共内存可以很容易地添加并行语句,因为线程将共享这些数据,但是线程容易受到虚假共享的影响,在这种情况下,变量本应是私有的,这些变量是无意中共享的。共享MPI使用私有内存模型,其中数据必须在线程之间显式共享,并且所有数据在默认情况下都是私有的。私有内存使得任何并行实现更复杂,因为线程必须被指示访问特定的内存进行计算。而且,OpenMP在内部处理的执行过程中创建并销毁线程,并且性能很高。SMPI线程在执行开始时创建,并始终保持不变。这使得管理SMPI线程更加困难,因为每个并行阶段必须由程序员明确管理。然而,程序员额外的工作可能会在性能方面得到回报,因为SMPI会带来更少的开销。

3.性能评估

本节介绍了MPI OpenMP和MPI Shared MPI Householder Reflector内核优化的过程和性能测试结果。对于性能测试,改变计算所用的节点数量非常有趣,因为在实际仿真中执行VULCAN时经常使用许多节点。在多节点HPC集群上的这项工作中,最多研究了四个节点。MPI任务和OpenMP线程的数量以及并行部分中用于循环阻塞的块大小各不相同。

对于每个微型应用程序,通过计算输出的数值差异,针对原始版本验证Householderer例程的优化版本。验证发现OpenMP提供了精确的数值解(零差),而SMPI的数值差异很小(10的-9次方)。

计算平台

性能评估是在Old Dominion大学的多节点HPC系统Turing上进行的(HPC Group 2016)。图灵上的每个节点都具有双插槽E5-2670 v2(Ivy-Bridge)CPU,每个插槽在2.5 GHz频率下具有10个内核和25 MB缓存。每个节点上总共有64 GB RAM内存。最多使用四个节点,网络互连为Infiniband FDR(十四个数据速率)。

结果与评估

性能评估会改变输入矩阵的大小n和所研究的线性系统的数量m。 研究了n的两个值,10和23,它们是基于VULCAN样本输入的常见大小。 研究了第三个输入(昵称为Cauchy),它的n被研究,它是大小为10的方形柯西矩阵(Fiedler 2010)。线性系统的数量m取决于节点的数量。 对于单节点性能测试,m设置为10k,100k,1m和5m。 对于多节点性能测试,m设置为100k,1m,5m,10m,50m和100m。 线程数使用2的幂:1、2、4、8、16和20来改变,因为T

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[254490],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。