文摘
本文提出的想法使用现代Fortran coordinate-free数值实现代码的灵活性在偏微分方程(PDE)域。我们还展示了Fortran,在过去的几十年里,改变了语言适合软件开发最先进的。Fortran的新coarray分布式数据结构,语言类的机制,和它的副作用,纯粹的过程能力提供的脚手架我们实现高性能计算软件。这些特性让编译器沟通组织与高效的并行计算。我们提出一些支持异步编程模式评价表达式组成的并行分布式数据的操作。我们实现了这些模式使用coarrays和消息传递接口(MPI)。我们比较规范的复杂性和性能。MPI代码要复杂得多,取决于外部库。MPI代码在克雷硬件使用克雷编译器1.5 - 2倍coarray代码在相同的硬件上。英特尔编译器实现coarrays在英特尔的MPI库结果显然是2 - 2.5倍低于手动编码的MPI尽管表现出近线性扩展效率。 As compilers mature and further improvements to coarrays comes in Fortran 2015, we expect this performance gap to narrow.
1。介绍
1.1。动机和背景
最有用的软件的发展。一个动力的发展高性能计算(HPC)软件应用来源于HPC硬件的不断变化的生态系统。第二个力量源于需要适应新的用户需求,在那里,为高性能计算软件,用户通常软件开发团队本身。新的需求可能来自一个更好的理解的科学领域,产生问题的数学公式的变化,变化的数值方法,要解决的问题的变化,等等。
计划软件进化的一个方法涉及到设计可变点,预计一个程序以适应变化的领域。在计算物理等高性能计算领域,解决偏微分方程(PDE)是很重要的。一些可能的可变点PDE解决包括制定PDE本身,就像不同的简化取决于现象研究,坐标系统和维度,数值离散化和硬件并行性。coordinate-free编程的方法(CFP)处理这些可变点自然通过特定领域的抽象1]。这种抽象的显式使用在HPC软件并不常见,可能是由于历史的发展领域。
Fortran举行,在高性能计算软件仍然占有主导地位。传统上,语言支持循环遍历大数据数组和几乎没有抽象机制超出了程序。他关注的是效率和提供一个简单的数据模型,编译器可以映射到高效的代码。在过去的几十年里,Fortran进化显著(2),现在支持抽象类,面向对象编程(OOP),纯函数,coarray共享或分布式内存并行编程模型,在多核处理器上运行和一些许多核心加速器。
1.2。相关工作
CFP的上下文中首次实现地震波模拟(3]Haveraaen等人,格兰特et al。4介绍了计算流体动力学应用CFP。这些抽象是在c++中实现,依靠语言的模板机制实现多级重用。Rouson et al。5)开发了一种“供电”表示流体动力学,实现连续但协调具体抽象Fortran 95年,独立使用类似的抽象Diffpack (6]。而c++和Fortran 95为重载每种语言的内在运营商提供功能,既不允许定义新的用户定义操作符来表示微分操作符,例如,那些出现在coordinate-free PDE表示。同样,无论是语言提供了一个可伸缩的、并行编程模型。
γet al。7)的上下文中首先介绍了模式的概念,面向对象的软件设计。当他们提出了通用的设计模式,他们建议将用于后续作者出版领域特定的模式。加德纳et al。8]发表第一个文本总结面向对象设计模式的科学规划。他们使用Java来演示γ等人一般模式上下文中的波形分析仪对聚变能源实验。Rouson et al。9]发表第一个文本模式科学Fortran和C + +编程,包括几个γ等人模式以及特定领域和特定于语言的模式。Rouson等人文本包括一个早期版本的PDE解决在当前纸,尽管没有编译器的时候他们的出版提供足够的报道最新的Fortran特性编译版本的解决者。
在校园里的工作(10]启发我们的思维的效用函数式编程并行科学应用。当前研究的复杂性和性能PDE解决支持函数式编程风格的两种并行编程模型:coarray Fortran (CAF)和消息传递接口(MPI)。CAF成为Fortran 2008标准的一部分。我们参考读者文本et al。(2]CAF的特点总结Fortran 2008和帕切科的文本(11)使用MPI特性的描述当前的纸。
1.3。目标和大纲
当前论文扩展在前四的研讨会论文作者12]在CAF PDE解算器包括一个类似的比较MPI解决第一个开发的第五作者。我们展示现代Fortran支持CFP领域的语言提供用户自定义运营商及其高效独立于硬件的并行编程模型。我们使用PDE的汉堡13)作为我们的主题。
部分2介绍了主题问题,CFP解释道。部分3介绍了现代汉堡解决者使用的Fortran的特性。部分4在此设置礼物有用的编程模式,部分5根据我们的建议显示摘要的编写的代码。部分6提出了测量方法的效率。部分7总结了我们的结论。
2。Coordinate-Free编程
Coordinate-free编程(CFP)是一种结构设计模式对pd (3]。这是领域工程PDE领域的结果。域工程寻求找到核心域的概念,然后介绍这些为可重用的软件组件14]。CFP定义了一组分层的数学抽象在环域级别(空间离散化),张量水平(坐标系统),和PDE解算器(时间集成和PDE配方)。它还提供了抽象在网格级别,包括抽象并行计算。解决这些层对应的可变点PDE (1),在用户级别和不断变化的并行架构级别。
看到这是如何工作的,考虑到coordinate-free泛化的汉堡方程(13]: (CFP地图的每个变量和运营商1软件对象和操作人员。在Fortran语言语法,这样的一个映射(1)可能导致程序的形式显示在清单1。
|
||||||
Fortran语言关键字用黑体表示。第一行声明了和张量(分布式)对象的类。第二行定义了相应的参数值。第三行评估的右边(1)使用Fortran的设备为用户定义的运营商,意思的语言需要时间:拉普拉斯算子(.laplacian),点积(. dot),和梯度(.grad)。数学公式和相应的程序代码都是独立的维度,选择坐标系统,discretisation方法,等等。然而,步骤是数学和计算精确。
传统上,数值科学家将扩大(1)在其坐标形式。决定我们想要解决三维问题,方程的矢量方程解析成三个组件。第一个组件在笛卡尔坐标方程,例如, 这里,下标逗号表示偏微分法对下标变量之前逗号;例如,。类似的方程必须有和。
对于一维(1 d)数据,(1)减少 汉堡包最初提议1 d形式作为navier - stokes方程的简化的代理(研究)的研究流体湍流。方程(3)保留的扩散性质分析了无第一眼睛(RHS)和非线性特点,分析了无第二RHS术语。这个方程还发现有用的应用物理的几个分支。它有很好的属性产生一个精确解,尽管其非线性的15]。
图1显示解决方案值(垂直轴)的函数空间(横轴)和时间(斜轴)从一个初始条件周期性边界条件的半开口域。随着时间的推移,非线性项将趋于陡峭初始波而扩散项抑制了它。
3所示。现代Fortran
Fortran语言一直是专注于高效的数值计算数组的数据集。在过去的10 - 15年,拿起从主流编程功能,如类抽象,也迎合了用户通过开发一组丰富的高层数组操作。控制信息流动,允许纯函数式风格的表达式;即表达式仅仅依靠没有副作用的函数。副作用影响全球的电脑超越函数的局部变量。副作用包括输入/输出的例子,修改参数,停止执行,修改外地数据,同步并行过程。
有长期呼吁使用函数式编程的编程并行计算机的解决方案(10]。Fortran 2008标准还包括一个并行编程模型主要基于coarray分布式数据结构。的出现,支持Fortran 2008 coarrays克雷和英特尔编译器使成熟的时间探索Fortran之间协同效应的显式支持函数表达式和coarray并行编程。(两个免费的发布版本编译器还提供了有限的支持coarrays: g95支持coarrays否则Fortran 95和GNU Fortran (gfortran)支持coarray语法但是coarray代码顺序运行的代码。此外,支持并行执行coarray gfortran预映发展分支代码与通信由外部库(OpenCoarrays:http://www.opencoarrays.org)[16]。最终,所有编译器必须支持coarrays符合Fortran标准)。
3.1。数组的语言
自从Fortran 90标准,语言引入了一组丰富的阵列功能。这也适用于coarrays 2008标准为我们展示的部分3.4。Fortran 90包含操作应用内置的内在运营商,如+和相应的同样形状的数组元素,也就是说,映射数组的元素。现代Fortran还允许用户定义的映射程序数组。这样的程序必须声明”元素”,确保为每一个元素的数组,调用的是相互独立的,因此可以并发执行。业务操作数组也存在,例如,切出一个数组从大一个小,要求上下范围的数组,和加法或乘法数组的所有元素。
这意味着,在许多情况下,它不再需要表达一种算法通过显式地对其元素的循环。而一些操作整个数组足以表达大量计算。例如,下列数组表达式,可分配的数组X,在第一行将一级数组A, B和C,执行基本功能+,罪,在相应的每个数组的元素,并垫结果与5号: ; 。首先在第二行,只有5个元素被保留。因此,对于数组,,,结果是一个数组。
3.2。抽象类
类抽象允许我们将一组程序与一个私人数据结构。这是一种编程语言的基本抽象机制,允许用户扩展它与图书馆领域特定的抽象。相对于其他语言Fortran符号有点冗长但给伟大的自由定义操作符名称功能,使用标准符号和引入新运营商,例如,点。上面使用的。
CFP的Fortran类抽象允许我们实现域抽象,如环和张量场。注意,Fortran通用设施非常有限。Fortran变量有三种固有属性:类型,类型和等级。Fortran程序可以编写通用的类,它允许,例如,一个实现一系列浮点精度测量工作。Fortran程序也可以编写通用的排名,它允许一个实现工作在一系列数组。Fortran程序不会仍是通用型,虽然有更少的需要而在语言改变精度意味着改变类型。在Fortran,改变精度只意味着改变,不是类型。
3.3。函数式编程
编译器可以做得更好的优化,如果它知道更多关于代码的意图。Fortran的核心理念就是让程序员交流性质的程序编译器没有规定特定的编译器优化。在Fortran语言中,每个参数过程可以给定一个属性,意图,它描述了过程将如何使用参数数据。属性”在“代表只是阅读的观点,而“出“代表只是创建数据,和“inout“允许读和修改参数。更严格的形式是声明一个函数为“纯”,例如,表明港口没有副作用的过程。
纯函数式编程组成程序的副作用过程和作业。这有助于众多优化,包括保证异步调用的程序能够安全地执行程序的数据在不同的分区。图2显示了评估的皇家的调用序列(2)和分配结果。表达式在独立的子树可以彼此独立地执行,允许并发性。
CFP等发展中抽象时,所需的程序可以实现为修改一个或多个参数的子例程或纯函数。使用纯函数使更多的数学抽象和简化了推理的代码。
3.4。Coarrays
特别感兴趣的HPC的可变点在并行性级别。便携式HPC软件必须允许高效的多核处理器上执行,许多核心加速器,和异构组合。Fortran 2008提供了可移植性通过定义一个分区的全局地址空间(pga), coarray。这提供了一个单一程序,多个数据(SPMD)编程风格,没有引用一个特定的并行体系结构。Fortran编译器可能复制程序跨一组图片,这需要沟通当一个图像达到了一个外地coarray的一部分。图片和通信被映射到并行体系结构的编译器的选择。英特尔编译器,例如,一个图像映射到一个消息传递接口(MPI)的过程,而克雷编译器使用专有通信库,优于MPI在克雷计算机。映射加速器也被公布。
例如,coarray定义表单的清单2建立的程序将索引变量”一个“三维(括号)和一个余维数(方括号),所以清单3让图片3,如给出的这_图像()函数,将图2的第一个元素复制到图1的第一个元素。如果有少于3图片,作业不发生。正常尺寸的大小是由程序员决定。运行时环境和编译器决定余维数。数组的引用没有余维数指数,例如,(1,1,1),表示图像的局部元素执行语句。同样,表达“(1 1 1)[这_图像())”使参考执行显式的形象。
|
||
|
||||||
编写并行操作时出现的困境在前面提到的张量对象通过封装coarray里面;包含coarrays Fortran禁止功能结果。性能问题激励这个禁令;在一个表达式,结果成为其他函数输入参数的函数。为coarray返回值是安全的,每一个这样的结果必须在图像同步,导致严重的可扩展性和效率问题。在贫富差距拉大的处理器速度和通信带宽需要避免处理机间的协调。
的可伸缩性问题,考虑实现表达式使用有限差分模板的宽度1偏导数,用数据被分布在coarray图像。偏导数的函数执行图像从相邻的图像需要访问数据和。乘法将独立运行在每个图像的一部分coarray驻留在这一形象。现在,对于在图像是正确的,系统必须保证在图像,,所有已完成计算和存储当地部分coarray中的结果。同样地,计算的在图像和的计算在图像,,和,,分别,必须做好准备。自执行顺序为每个图像超出显式控制,同步需要确保正确排序的计算步骤。
因为分析是否需要同步,当超出了编译器,要么是同步的选项返回(可能是巨大的性能下降)或不同步,可能很难跟踪数据不一致。上述禁令排除了这些问题,通过将同步与程序员的责任还允许每个图像继续处理本地数据尽可能长时间。考虑到调用图在图2。唯一的函数调用需要访问本地数据6调用偏导数在第一行。其余9函数调用只需要本地数据,允许每个图像进行独立于其他组件的赋值语句之前要求同步准备位移函数下一个时间步的分配。
4所示。设计模式
编程模式获取如何表达经验解决方案来重现编程问题有效地从软件开发,软件进化,甚至性能角度来看。标准模式往往演变成语言结构,现代”而“语句从一个模式与“如果”和“转到“在早期Fortran。
模式也可以更多的特定领域,例如,限于科学软件(9]。在这里,我们将着眼于高性能模式,平行PDE解决者。
4.1。超类对象和错误跟踪
许多面向对象语言,从起源Simula [17),开始,有一个对象类,是最终的父类。Fortran c++一样,没有一个通用的基类。对于许多项目,尽管它可能是有用的定义一个Fortran对象类中所有类的最终母公司的一个项目,这样一个对象可以提供状态和功能普遍有用的整个项目。对象类本身文摘排除构建任何实际的对象类型的对象。
清单的对象类4代表了一个解决问题的办法,跟踪保证纯函数和报告问题。断言验证需求,并保证提供一个共同的机制。然而,断言停止执行,禁止副作用。解决方案是可能的错误信息为额外的数据项的对象类。如果出现问题,可以设置相应的数据和通过纯表情,直到它最终采取行动的过程,这些副作用是允许的,例如,在一个输入/输出(I / O)语句或一个任务。
|
||||||||||||
清单的对象类4允许跟踪变量的definedness宣布属于对象类或它的任何子类。这样的跟踪可以动态分配结构时特别有用。is_defined函数返回的值user_defined组件。mark_as_defined子程序集user_defined的价值。真正的. .使用这个系统在每一个过程定义或使用对象数据将允许一丝未初始化的数据的来源。
警告是不能超类对象类的类包含coarrays因为编译器需要知道如果一个变量coarray组件或不是。因此,我们需要声明一个相应的co_object类的超类与coarray组件类。
4.2。计算在全球范围内,返回本地
行为设计模式计算在全球范围内,返回本地(CGRL) [9)被认为是一种处理禁止从函数返回coarrays。
在CGRL,每个外地经营者接受包含coarrays操作数。操作员执行任何全球通信需要执行一些并行算法。在每个图像,操作员包其本地分区结果的对象包含一个常规数组中。最终,当最低优先级的操作符完成的每个图像产生了其本地分区结果,用户定义的分配本地分区复制到全球coarray和执行任何必要的同步使结果可用于后续程序。参数和返回类型部队之间的不对称分裂大表达式到单独的语句,当需要同步。
5。实现示例
在本节中,我们实现所需的功能评估(2),如图2。我们遵循CGRL模式:推导coarray数据结构和函数返回一个数组数据结构,然后乘法需要coarray和数组数据结构并返回一个数组数据结构,剩下的运营商工作数组数据结构。赋值之后同步本地数组分配给相应的coarray的组件。
以避免代码摘录error-forwarding锅炉板,我们首先显示没有这个代码,然后展示如何使用此功能的代码会在部分5.4。
5.1。数组数据结构
首先,我们声明一个local_tensor类只有本地数组数据。这是一个子类的对象。与字符(&)是Fortran行连续字符和感叹号(!)先于Fortran评论。数据在每一个图像的大小由一个全球性的常数,local_grid_size的参数(请参见清单5)。
|
||||||||||||||||||||||||||
过程声明的程序列表类出口。泛型声明引入算子符号作为同义词程序名称。这四个函数,我们感兴趣的是在清单中实现6。
|
||||||||||||||||||||||||||||||||||||||||||
这些是正常的函数数组数据。如果并行执行,每个形象都有当地的实例变量和本地执行每个函数。注意我们使用Fortran运算符“+”和“−”直接在这些计算数组数据结构。
5.2。Coarray数据结构
清单7是一个数据结构的声明分布在整个图像。
|
||||||||||||||||||||||||||||||
coarray声明允许我们访问数据在其他图像。
的偏导函数接受一个coarray数据结构作为参数,并返回一个数组数据结构。该算法是一个简单的有限差分,环绕着边界。处理取决于不同这_图像()是第一个图片,一个内部形象,或者最后一个图像全国矿工工会_图片()。内部形象需要访问的数据高于或低于下一个图像。极值图像做一个全方位的失踪的邻居(见清单8)。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
在张量类,local_tensor类是不透明的,禁止直接访问其数据结构。只可以使用程序的接口。这些包括一个用户定义的任务隐式地调用df_dx函数的倒数第二行。再次注意如何使用intrinsic大部分的计算是通过数组数据。我们还利用Fortran 2008并发执行循环遍历功能表达的机会,当不存在数据依赖关系从一个迭代到另一个。“做并发“构建公开这并行编译器。
偏导函数,这里显示单一的导数和二阶导数(省略)是唯一的过程需要对非局部数据的访问。虽然同步必须发生在外地访问之前,必要的同步出现在之前赋值或对象初始化过程。因此,生成的完整表达式求值的皇家(2异步发生),同时在图像分布式coarray和纯函数的表达水平。
add_to_local过程的实现与coarray对象作为第一个参数和本地对象字段数据作为第二个参数和返回类型(见清单9)。
|
||||||||||||
rhs %状态()函数调用返回本地数据数组从当地的张量,然后添加到本地组件coarray使用Fortran的数组操作符的符号。
最后,赋值操作时同步转换数组类local_tensor回到coarray类张量(见清单10)。
|
||||||||||||
已经指定了每个组件后coarray,全球屏障”同步所有”,迫使所有图片等到他们已经完成了任务。这将确保所有组件的coarray之前更新任何进一步的使用数据。某些情况下,可能还需要一个同步作业过程的开始:防止修改另一个形象可能访问的数据。我们选择2 ndorder龙格库塔时间推进算法不需要额外的同步,因为没有RHS表达式包含非局部数据结构上的操作出现在lh。
5.3。MPI数据结构
开发应用程序使用MPI库需要根据定义以外的任何编程语言标准。这往往导致过程编程模式而不是功能或面向对象编程模式。做一个公平的比较,我们将采用MPI使用数组数据结构的数据结构部分所示5.1。在MPI版本,1 d网格分区核心之间使用一个周期笛卡尔的沟通者,如代码清单清单所示11。
|
||||||||||||||||||||||||||||||||||||||
使用这种沟通让我们重新排序处理器等级,使沟通更有效的通过将邻近的排名接近对方。核之间的传输数据使用MPI_SENDRECV完成,如清单所示12。coarray版本的情况下,非局部数据只有在偏导数的计算要求。MPI版本的一阶导数函数清单所示12。
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MPI_SENDRECV阻塞常规这意味着处理器将等待邻国完成沟通之后再继续。这是一个事实上的邻居之间的数据的同步确保数据是当前所有的处理器。c_double类型参数声明的变量在清单12与MPI双精度类型参数在MPI通讯电话。这些必须同步,确保Fortran数据具有相同的格式,用于MPI调用,viz.兼容C双精度实数。
5.4。错误跟踪
误差传播模式是清单中的代码所示13。
|
||||||||||||||||||||||
的!需要测试清单13检查两个参数添加函数有definedness属性集。然后执行实际的计算和设置definedness属性返回值。输入一个错误的,除了没有发生和未定义的预设值数据通过该函数得到传播。
保证的实际验证和报告的错误发生在用户定义的任务或I / O评估结束时发生的一个纯粹的函数表达式。清单在清单14显示了assign_local_to_global这个过程。
|
||||||||||||||||||||||
更详细的错误报告可以通过提供更多的元数据对象等报告目的。
6。结果
6.1。模式的权衡
介绍了两种新模式:上述对象和CGRL模式。对象模式被证明是轻量级的,需要简单的布尔条件,提高代码的健壮性和对执行时间的影响可以忽略不计。对象模式,然而,重量级的源代码影响:模式鼓励每个类扩展对象的超类,它鼓励评估这些条件在每个方法的开始和结束。我们发现鲁棒性值得源代码成本中获益。
CGRL模式关键维系功能表达式求值的绩效语言限制coarray函数的结果。CGRL部分是语法的好处,它使写作对coarray coordinate-free表达式组成的并行操作的数据结构。CGRL还提供了潜在的性能优势通过使特定的编译器优化。Fortran要求用户定义操作符的”意图(在)“属性,这就排除了一个共同的副作用:修改参数。这在很大程度上使运营商的声明是“纯洁,“它允许编译器执行异步操作的多个实例。成本之一的上下文中CGRL CFP模式在于频繁创建临时的中间值。这适用于大多数编译器,天真地处理函数式编程风格,作为阻碍了修改参数本质上意味着堆栈和堆上分配内存为每个操作的结果。这意味着使用更多的内存。它还意味着延迟与每个内存分配相关联。平衡这个成本是减少同步的必要性和相关的增加并行执行的机会。这种权衡的一个详细的评估需要编写一个数值相当于代码,利用可变数据(可修改的参数),以避免临时的中间值。这样的比较是超出了本文的范围。更先进的方法编译功能表达式存在,剑麻为代表的编译器(10]。它积极重新计算,以避免这样的内存开销。是否这是可能的框架内当前的Fortran编译器需要调查。
6.2。性能
我们调查的可行性方法使用一维(1 d)的汉堡方程形式,(3)。我们修改的解算器9),以确保明确纯表达式求值。全球barrier同步在上面的代码段中取代同步最近的邻居(见清单15)。
|
||||||||||||||||||||||||||
图3描述了执行时间的主要程序的优化和分析工具(τ)包18]。在构造图3我们模拟大,多维问题通过运行每个网格点内核。结果显示几乎统一的负载平衡。除了主程序(红色),局部到全局分配占据最大的包容性的运行时。大部分的过程在于其同步的时候了。
我们也做了一个更大的弱扩展实验克雷。这里,我们模仿标准的情况下用户利用可用资源来解决尽可能大的一个问题。每个核心被分配一个固定的数据大小的2 3 000 097 152值时间步骤,然后问题解决的总大小是与可用内核的数量成正比。解算器显示好弱扩展属性;参见图4,它仍然是16 384核效率为87%。我们有规范化反对64核的阴谋。克雷有24芯每个节点的体系结构,所以我们的基线测量考虑由于off-node通信成本。
目前我们正在同步对于每个时间步,只伸出几个相邻的值(二阶导数)为每个同步。我们可能想要贸易一些同步的重复计算。这项技术是引入coarray鬼值,重复的值的边缘相邻的图像。这些值可以计算和使用本地不需要沟通或同步。最优鬼值的数量取决于之间的相对速度计算和同步。例如,使用9鬼值在一个图像,每一方应减少同步需要每8日时间步,虽然会增加计算在每个核心%。本地的修改应该是张量类,只影响偏导数(程序需要远程数据)和作业程序(程序做同步)。我们离开这个未来的工作。
我们也看着MPI的扩展表现强劲,coarray版本通过观察一个固定问题的执行时间变化的大小。强大的扩展效率两个不同的问题是尺寸如图5(一个)和5 (b)。我们预计线性扩展;即执行时间会减半当处理器的数量翻了一番。然而,我们看到,我们获得超线性加速在最初的处理器数量的翻倍。这超线性加速是由缓存的速度差引起的记忆。大问题不能完全融入堆,和时间消耗在移动对象从内存慢到快内存。随着问题被划分在越来越多的处理器,问题的内存需求变得更小,能够适应更快的接近处理器的内存。这导致超线性加速。随着越来越多的处理器,处理器之间的通信开始变得昂贵,加速下降。我们观察超线性加速coarray和MPI的版本。 However, the much greater speedup seen for the coarray version suggest that its memory requirements are higher than those of the MPI version. (These numbers may be slightly misleading, as the MPI version used dynamically allocated data, while the CAF version used statically allocated data. This may cause the CAF version to use more memory than the MPI version. Fixing this will cause minor changes in the numbers and close the ratio between the MPI and CAF efficiency. We will have these numbers available for the revision of this document.)
(一)MPI与CAF扩展409600网格点
(b) MPI与CAF扩展819200网格点
使用不同版本的原始执行时间在英特尔和克雷平台如表所示1。我们选择一个更小的问题强扩展实验比弱定标实验,因为有限的可用资源与英特尔平台。我们看到coarray版本低于MPI版本同样的问题在同一个平台的大小。比较实际的运行时表所示1表明使用英特尔的编译器,MPI版本是2到2.5倍coarray版本。克雷的编译器,MPI版本是1.5到2倍coarray版本。要理解运行时的差异,我们分析了CAF和MPI版本使用τ和英特尔的编译器。使用爸爸[19)与τ和英特尔编译器计算浮点操作,我们看到,MPI实现大约版本%的峰值理论失败的问题819200网格点使用大约256个处理器而CAF版本实现%的峰值理论失败。执行时间为一些不同的功能如图6。我们看到的通信例程总执行时间最长的一部分。然而,coarray同步正在显著长于MPI_SENDRECV阻塞操作。英特尔coarray实现基于MPI库,和coarray的开销实现负责一些放缓。更成熟的MPI库相比,CAF也可能扮演了一个角色在MPI实现的性能优越。所以,我们很可能会看到CAF的性能差距减少编译器实现改善随着时间的推移。
(一)MPI执行概要
(b) CAF执行概要
6.3。复杂性
除了性能考虑,我们也想比较的优缺点coarray Fortran (CAF)实现和一个汉堡的1 d的MPI实现形式方程(3)的代码复杂性和易于开发。
用于比较的度量代码复杂性行代码(LOC),使用声明,变量声明,外部调用,函数参数。这种比较的结果可能会在表中找到2。见表2MPI实现相比有更高的复杂性CAF实现所有的指标考虑。这方面的潜在后果的缺陷率的代码。例如,比较MPI版本与coarray节中列出5.2,我们看到,函数的基本结构几乎是相同的。然而,MPI_SENDRECV交流当地的网格数据的邻国实现隐式coarray版本使代码更容易阅读。平衡其更大的复杂性,MPI实现了CAF代码相比性能优越。
软件开发时间时还应该考虑比较CAF MPI。代码复杂性的某些指标已被证明与更高的缺陷率。例如,平均不良率已被证明有一个曲线与地方的关系(20.]。MPI实现可能会推动更高的缺陷密度和整体项目的缺陷数,导致开发时间和代码可靠性。同样,外部调用或分列显示正相关与缺陷密度,也减少MPI实现的相对吸引力21]。此外,极大地提高了函数调用的参数数量,以及更多的功能用于MPI的实现,提出了一个更高的学习曲线新手程序员相比CAF平行。
7所示。结论
出于HPC软件不断变化的需求,我们提出了coordinate-free编程(1)作为一个自然的方法,处理相关的可变点,导致灵活性和简单的进化代码。然后我们看现代Fortran语言特性,如纯函数和coarrays,和相关的编程模式,特别是计算在全球范围内,返回本地(CGRL),使这种编程成为可能。我们也看着使用MPI实现coordinate-free编程的优缺点MPI实现相对于仅使用现代Fortran语言特性。
的可行性研究方法中,我们使用了这些技术在一个代码,解决了一维伯格斯方程: (下标表示偏微分法和时间和空间坐标,职责)。功能表达风格增强了代码的可读性的长相接近数学符号。CGRL行为模式可以有效地利用Fortran coarrays功能表达式求值。
异形分析我们的应用程序中显示了良好的负载平衡,使用从英特尔和克雷coarray使Fortran编译器。性能分析与克雷编译器表现出良好的弱可伸缩性从64年到000年以上16核。强大的扩展使用MPI和coarray版本的应用程序的研究显示,尽管落后MPI coarray版本的运行时版本,coarray版本的扩展效率与MPI的版本。
未来的工作包括从可行性研究到一个完整的coordinate-free实现Fortran的汉堡方程。这将使我们能够研究Fortran等抽象的行为。我们也想提高并行效率通过引入鬼细胞在代码中,看到现代Fortran可以如何应对当代硬件架构的复杂性。
信息披露
这是一个扩展版的研讨会论文发表于SE-HPCSSE13在丹佛,美国公司。
利益冲突
作者宣称没有利益冲突有关的出版。
确认
我们应感谢吉姆夏(IBM加拿大实验室)的汉堡1 d解决者和Sameer Shende(俄勒冈大学)帮助τ。这项研究是由挪威研究委员会的部分经费。这项研究也支持通过桑迪亚国家实验室,实验室多道程序由桑迪亚公司、洛克希德·马丁公司的国家核安全管理局de - ac04 - 94合同下al85000。这项工作使用国家能源研究科学计算中心的资源,这是由美国能源部科学办公室号合同下。DE-AC02-05CH11231。这项工作也用埃西斯集群资源从俄勒冈大学的主要研究收购仪器从美国国家科学基金会的资助,办公室的网络基础设施、“MRI-R2:收购一个应用科学计算工具合成(埃西斯),”格兰特没有。“公盟”——0960354。