(1) 概述

介绍

现代科学软件通常很复杂,包括一系列手工挑选的组件组合起来,以解决紧迫的科学或工程挑战。传统上,这些组件在本地组合到形成一个框架,或在不同位置相继使用以形成科学工作流,如AMUSE(AMUSE-网址:http://www.musicode.org) [17,16]. 然而,这两个方法并不是普遍适用的,因为有些方法在科学上很重要功能需要使用并发运行的组件,但不能放在同一计算资源上。这里我们介绍MPWide专为促进广域通信而开发的图书馆分布式应用程序.

MPWide的主要用途是灵活管理和配置广域连接在并发运行的应用程序之间,并促进高性能通过这些连接传递的消息。这些功能提供给应用程序用户和开发人员,因为可以安装和使用MPWide,而无需对(超级)计算资源的管理权限。我们最初2010年在MPWide上报道[9],但有由于大大扩展了库,使其更具可配置性和可用性用于更广泛的应用程序和用户。这里我们介绍了MPWide,它的实现和架构、需求和重用潜力。

MPWide最初是作为支持通信库在CosmoGrid项目[15]. 在此范围内我们构建并执行了大型宇宙N体模拟项目超级计算机的异构全球网络。复杂的底层超级计算和网络架构,以及CosmoGrid项目所需的通信性能,要求我们开发一个高度可配置且易于安装的库,无论底层(超级)计算平台如何。

有许多工具与MPWide类似。零MQ[1],是一个支持多种平台。然而,与MPWide相比,它确实有更重的依赖关系足迹。除此之外,它还取决于uuid-dev病毒,需要管理的包安装权限。此外,还有几个性能优化可以使用MPWide调整但不能使用ZeroMQ调整的参数。此外,NetIBIS[]和Padico TM[5]工具提供的功能类似于MPWide,尽管NetIBIS是用Java编写的,但在超级计算机的计算节点,PadicoTM需要一个中央rendez-vous服务器。对于快速文件传输,替代方案包括GridFTP和各种闭源文件传输软件解决方案。还有专门的用于跨集群运行MPI应用程序的工具[11,14,2]以及用于耦合应用以形成多尺度模拟(例如肌肉[4]和丛林计算系统[6]).

使用MPWide的研究总结

MPWide已应用于支持多个研究和技术项目,因此远。在本节中,我们总结了这些项目已经在这些项目中使用,并且我们使用MPWide公司。

CosmoGrid项目

MPWide已在CosmoGrid项目中广泛使用最初开发的。在这个项目中,我们需要一个支持超级计算机之间的快速消息传递,安装起来很简单在PC、集群、小型Endian Cray-XT4超级计算机和大型Endian IBM上Power6超级计算机。此外,我们需要MPWide提供可靠的光路和专用10Gbps网络的通信性能,即使这些网络不是由管理员。

在CosmoGrid中,我们运行了大型宇宙学模拟,有时并行运行跨多台超级计算机,研究小暗的关键特性物质晕[13]. 我们使用了GreeM宇宙学N体码[12],其中反过来,依靠MPWide促进信息的快速传递区域网络。

我们的初始生产模拟是使用超级计算机进行分布式运行的阿姆斯特丹的SurfSARA和国家天文台日本东京[15]. 这个超级计算机通过10千兆/秒的光路互连带宽容量。我们的主要模拟包括2048粒子,并且需要大约10%的运行时才能通过广域网。

我们随后扩展了Gree M代码,并使用MPWide运行宇宙学在多达4台超级计算机上并行模拟[8]. 我们还对3个超级计算机,包括2048台颗粒和使用2048岩芯总数[10]. 这些机器位于埃斯波(芬兰)、爱丁堡(苏格兰)和阿姆斯特丹(荷兰)。运行使用了MPWide版本1.0,持续了大约8小时总计。我们给出了此试运行的一些性能结果,如图。1,还提供以一台超级计算机为参考进行模拟。分布式即使如此,模拟也只比在单个站点上执行的速度慢9%尽管仿真数据交换的基线超过1500每一个时间步长的公里数。分布式仿真的快照,它还具有动态负载平衡功能,如图。2CosmoGrid项目的结果已用于暗物质晕的分析[10]以及对星团的研究宇宙暗物质环境[18,19].

图1

每个模拟步骤所需的挂钟时间比较在一台超级计算机上运行2048个内核(由teal给出线路),以及使用2048个分布在三台超级计算机(用红线表示)。The two peaks in the单站点运行的性能是由在这些迭代期间,需要160GB快照。三个站点的运行使用MPWide在超级计算机之间传递数据。沟通三个站点的运行开销由黑线给出。请参见Groen等人[10]对于详细讨论这些性能度量。

图2

图中讨论的宇宙学模拟快照。1在红班拍摄z(z)=0(今天)。内容已经着色以匹配埃斯波超级计算机上的粒子(绿色,左)、爱丁堡(蓝色,中)和阿姆斯特丹(红色,右)分别[10].

血流的分布式多尺度建模

我们还使用MPWide耦合三维脑血流一维间断Galerkin解算器的仿真代码人体其他部位的血液流动[7]. 在这里,我们使用1D模型来提供更真实的三维模型的流动边界条件,并依赖于MPWide快速更新二者之间的边界条件代码。我们在一个分布式的基础设施,使用HECToR超级计算机上的2048个内核进行建模伦敦大学学院的脑血流和本地桌面模拟人体其他部位的血液流动。这两种资源通过常规互联网连接,消息需要11毫秒才能在桌面和超级计算机。我们概述了图中的代码和通信过程。.

这些代码之间的通信尤其频繁,因为代码每0.6秒交换一次数据。然而,由于延迟隐藏我们实现的用于运行分布式仿真的技术可忽略的耦合开销(每个耦合交换6 ms占总运行时间的1.2%)。本次跑步的完整描述由Groen等人提供[7].

图3

中的代码和通信过程概述分布式多尺度血流模拟。这里是1D pyNS代码使用MPWide连接到MPWide数据转发进程在HECToR超级计算机的前端节点上。3D HemeLB代码,在HECToR的计算节点上执行机器也连接到这个数据转发过程。这个转发过程允许我们构建此模拟,甚至当HECToR的传入端口被阻塞时,以及当HemeLB将运行的节点事先未知。一旦建立连接,开始模拟并确定边界数据在运行时在代码之间交换。

其他研究和技术项目

我们将MPWide用于其他几个目的。首先,MPWide是MAPPER软件基础设施[20],并集成在MUSCLE2耦合环境中(肌肉2-http://www.qoscosgrid.org/trac/muscel网站). MUSCLE2,MPWide用于改善广域通信耦合分布式多尺度仿真的性能[4]. 此外,我们应用了mpw-cp文件传输工具测试网络性能伦敦大学学院和耶鲁大学的校园。在这些吞吐量性能测试,我们能够在速度约为8 MB/s,使用供应链计划,速率约为40 MB/s使用MPWide,使用商业、封闭源代码的速率约为48 MB/s名为Aspera的文件传输工具。

我们定期进行了一些基本性能测试互联网,比较MPWide和ZeroMQ的性能(零MQ-http://www.zeromq.org)、肌肉1和常规供应链计划。在每次测试中,我们交换了64MB的数据(在MPWide、MUSCLE和ZeroMQ的情况下,存储在内存中,并且来自文件在以下情况下供应链计划),测量每个方向至少完成20次。然后我们取平均值这些沟通在各个方向的价值。在这些测试中,我们使用了使用默认自动调整设置的ZeroMQ。

表1

使用MPWide和用于在中的资源之间交换数据的其他工具英国(UK)、荷兰(NL)和波兰(PL)使用常规互联网。对单个连接进行测试快速连续执行,以减轻由于以下原因造成的潜在偏差互联网主干网上的后台负载。关于这些的完整报告测试可以在http://www.mapper-project.eu,交付物4.2版本0.7。

端点1 端点2 工具名称 每个方向的平均吞吐量MB-1

英国伦敦 波兰波兹南 供应链计划 11/16

英国伦敦 波兰波兹南 MPWide(MPWide) 70/70

英国伦敦 波兰波兹南 零MQ 30/110

波兰波兹南 波兰格但斯克 供应链计划 13/21

波兰波兹南 波兰格但斯克 MPWide(MPWide) 115/115

波兰波兹南 波兰格但斯克 零MQ 64/-

波兰波兹南 荷兰阿姆斯特丹 供应链计划 32/9.1

波兰波兹南 荷兰阿姆斯特丹 MPWide(MPWide) 55/55

波兰波兹南 荷兰阿姆斯特丹 零MQ 18/18

实施/架构

我们在图中给出了MPWide体系结构的基本概述。4.MPWide已使用强烈强调极简主义,依赖小而灵活的代码库用于一系列功能。

核心MPWide库

MPWide的核心功能由MPWide C++API提供通信代码库和Socket类。这些课程一起包含大约2000行C++代码。Socket类用于管理并使用个人tcp协议连接,而角色通信代码库用于在中提供MPWide API功能C++,使用Socket类。我们在表中的C++API2。更完整信息可以在MPWide手册中找到,该手册位于/文件源代码树的子目录。

MPWide依赖于许多数据结构,这些数据结构用于更容易管理端点之间的自定义连接。最多在MPWide中构造连接的简单方法是创建一个通信路径。每条路径由1个或多个组成tcp协议溪流,每个都是为了方便实际通过该路径进行通信。使用单个tcp协议流足以支持连接,但在许多广域网中,当使用多个流时,MPWide将提供更好的性能。MPWide支持多路径的存在,以及创建和在运行时删除路径。此外,任何消息都可以从使用从一条路径到另一条路径MPW_循环(),或MPW_延迟()用于持续的专用数据转发过程(参见表。2).

MPWide提供了许多参数,允许用户优化单个路径的性能。除了改变流的数量外,用户可以修改每个低级别发送和接收的数据的大小通信呼叫(区块大小),的tcp协议窗口大小,并限制的吞吐量通过调整通信起搏。流的数量始终需要由用户创建路径时,但用户可以选择使用其他参数通过启用MPWide自动调谐器自动调谐。自动调谐器,它默认情况下启用,对于获得相当好的性能非常有用最小的努力,但通过测试不同的手动参数。选择数量时tcp协议要在路径中使用的流,我们建议使用单个流进行连接在本地程序之间,以及连接程序时至少32个流通过远程网络。我们发现MPWide可以进行通信效率高达256tcp协议中的流单路径。

图4

MPWide功能概述及其与底层的链接组件。用户可用的功能由黑色表示箭头,将这些功能链接到相应的MPWideAPI用红线表示,内部代码库依赖项用深蓝色表示线。

表2

MPWide API中可用函数的列表。

函数名称 摘要描述

MPW_载体() 在网络两端之间同步。
MPW_创建路径() 创建并打开包含1的路径+tcp协议流。
MPW_周期() 通过一组通道发送缓冲区,从其他。
MPW_循环() 作为MPW_周期(),但有使用缓存的未知大小的缓冲区。
MPW_破坏路径() 关闭并销毁包含1的路径+tcp协议流。
MPW_DNSResolve() 给定一个主机名。
MPW_DSendRecv() 使用发送/接收大小未知的缓冲区缓存。
MPW_单元() 初始化MPWide。
MPW_完成() 关闭连接并删除MPWide缓冲区。
MPW_接收() 接收单个缓冲区(合并传入数据)。
MPW_延迟() 在两个频道之间转发所有流量。
MPW_发送() 发送单个缓冲区(在频道)。
MPW_发送接收() 发送/接收单个缓冲区。

MPW_发送接收() 以非阻塞方式发送和/或接收数据模式。
MPW_Has_NBE_完成() 检查特定的非阻塞呼叫是否具有完整的。
MPW_等待() 等待特定的非阻塞调用完整的。

MPW_设置自动调整() 启用或禁用自动调谐(默认:启用)。
MPW_设置区块大小() 根据更改发送和接收的数据的大小低电平tcp协议send命令。
MPW_设置速度() 调整基于软件的通信速度费率。
MPW_设置Win() 调整tcp协议窗口大小在站点配置的限制范围内。

Python扩展

我们构建了一个Python接口,允许通过Python(巨蟒-http://www.python.org(英文)). 我们构建使用Cython的接口-网址:http://www.cython.org),因此作为结果建议使用最新版本的Cython,以使翻译。该接口的工作方式与C++接口类似,但支持仅是MPWide功能的一个子集。它还包括一个Python测试脚本。我们还使用SWIG实现了一个接口,但建议使用Cython而不是SWIG因为它更便于携带。

货运代理

超级计算基础设施拒绝直接从外部世界到计算节点的连接。私人所有基础架构,管理员通常修改防火墙规则以便于将数据从外部直接转发到计算节点。这个货运代理是一个模仿这个的小程序行为,但由用户启动和运行,无需管理权限。因为货运代理在网络架构的更高级别上运行,通常是比传统的基于防火墙的转发效率略低。使用多个货运代理超级计算机复杂网络中的实例可以在Groen等人。[8].

mpw-cp标准

Mpw-cp是一个依赖SSH的命令行文件传输工具。功能是基本的,因为它本质上使用SSH启动文件传输远程处理,然后将该进程链接到本地执行的进程。Mpw-cp的工作原理与供应链计划,但提供在许多情况下具有卓越的性能,允许用户调整其连接(例如,通过使用多个流)使用命令行参数。

数据收集

DataGather是一个小程序,允许用户保留两个目录在远程机器上实时同步。它一次同步它用于确保分布式仿真是在单个计算资源上收集的。这个DataGather可以与其他基于MPWide的工具同时使用用户在进行模拟时同步数据。

实施和架构中的约束

由于我们所做的选择,MPWide的使用受到了许多限制在设计和实施期间。首先,MPWide开发用于这个tcp协议协议,并且无法建立或使用其他传输协议(例如。udp(统一数据处理程序)). 其次,与大多数MPI相比实施,MPWide的性能优势有限(有时甚至性能劣势)。这是因为供应商MPI实现往往包含特定于体系结构的不在MPWide中的优化。

第三,MPWide在其消息传递中不支持显式数据类型,并将所有数据视为一个字符数组。我们进行了简化,因为数据类型因不同的体系结构和编程而异环境。将这些管理纳入MPWide将产生大量增加代码库,以及永久支持要求更新MPWide中的类型转换平台出现了。我们建议用户在中执行此序列化任务它们的应用程序,使用简单数据类型的手动代码,并依赖于用于更复杂数据类型的高质量序列化库。

质量控制

由于代码库和开发团队规模较小,MPWide有一个相当简单的质量控制制度。在每次公开发布之前手动测试MPWide的各种功能的稳定性和性能。几个测试脚本(那些不涉及使用外部代码)作为MPWide源代码分发的一部分提供,允许用户在不写的情况下测试MPWide的各个功能他们自己的任何新代码。其中包括:

  • MPWUnitTests-一组基本单元测试,可以在没有任何测试的情况下运行其他参数。
  • MPWTestConcurrent-可以运行一组基本功能测试没有任何附加参数。
  • MPWTest-需要在上手动启动的基准套件两个端点。

有关如何使用这些测试的更多详细信息,请参阅手册随MPWide提供。

(2) 可用性

操作系统

MPWide适用于大多数Unix环境。它可以按原样安装和使用在各种超级计算机平台和Linux发行版上。我们也一直能够在Mac OS X上成功安装和使用此版本的MPWide。

程序设计语言

MPWide需要一个支持pthreads和UNIX套接字的C++编译器。

其他系统要求

MPWide没有固有的硬件要求。

依赖关系

MPWide本身没有主要依赖项。mpw-cp功能依赖于ssh标准Python接口已经过测试Python 2.6和2.7。Python接口是使用SWIG创建的,它是需要为不同类型的Python生成新接口,或为非64位和/或非Linux平台。

贡献者列表

  • Derek Groen撰写了MPWide的大部分内容,是主要贡献者写这篇文章。
  • Steven Rieder在测试MPWide时提供了建议发展,并为写作做出了贡献。
  • Simon Portegies Zwart在MPWide中提供了监督和支持发展,并为写作做出了贡献
  • Joris Borgdorff就MPWide,并在最近对代码库做出了一些贡献。
  • Cees de Laat在开发过程中提供建议并帮助安排用于测试和生产。
  • Paola Grosso在开发期间和初始阶段提供了建议写入MPWide。
  • 石山聪(Tomoaki Ishiyama)在MPWide和实现了第一个支持MPWide的应用程序(GreeM N-body代码)。
  • Hans Blom在开发过程中提供了建议基于tcp和基于udp的比较的初步测试方法。
  • Kei Hiraki,在开发和基础设施期间提供建议在MPWide的初始广域测试期间提供支持。
  • Keigo Nitadori在开发期间提供了建议。
  • Junichiro Makino,感谢他在开发过程中提供建议。
  • Stephen L.W.McMillan在开发期间提供了建议。
  • Mary Inaba,在最初的MPWide的区域测试。
  • Peter Coveney为MPWide最近的增强提供了支持。

档案文件

姓名

MPWide版本1.8.1

许可证

MPWide已在Lesser GNU公共许可证版本3.0下发布。

出版商

德里克·格伦

发布日期

03/02/2013

代码库

姓名

MPWide(MPWide)

许可证

MPWide已在Lesser GNU公共许可证版本3.0下发布。

发布日期

15/10/2013

语言

GitHub使用git存储库系统。完整的MPWide发行版包含代码主要用C++编写,但也包含用C和Python编写的片段。该代码仅以英语进行注释和记录。

(3) 再利用潜力

MPWide的设计非常强调可重用性。它有一个小代码库,具有最小的依赖性,并且不使用更晦涩的C++特征。因此,用户会发现在大多数情况下,设置MPWide都很简单基于Unix的环境。MPWide未收到任何官方资金可持续性,但主要开发商(德里克·格伦)能够应对任何查询并为MPWide适应新应用程序提供基本帮助。

MPWide的重用

MPWide可以重复用于各种不同的目的,这些目的都是相同的通用性:低延迟和高延迟的轻量级软件的结合吞吐量通信性能。

可以重用MPWide来跨超级计算机并行化应用程序将运行在不同机器上的不同应用程序耦合在一起,以形成分布式多尺度仿真。使用MPWide的主要优势有规律的tcp协议更易于使用的API(用户不必须处理创建套接字数组,或学习低级tcp协议呼叫,例如listen()接受())和内置优化优于远程网络的性能。

此外,用户可以应用MPWide来促进高速文件传输广域网(使用mpw-cp标准或DataGather)。MPWide在许多方面提供了优于现有开源解决方案的性能远程网络(例如,参见第[章节:其他研究]节)。MPWide可以还可以重用以将可视化数据从应用程序流式传输到远距离可视化设施,尤其是在以下情况下专用光路不可用。

用户还可以使用MPWide将Python程序直接链接到C或C++程序,在不同的编程语言。然而,在数据类型之间转换的任务是左侧为用户(MPWide在C++端使用字符缓冲区,以及Python端的字符串)。

MPWide的支持机制

MPWide不属于任何官方资助的项目,因此不接受持续的官方资金。然而,有两种非官方机制支持。当用户或开发人员遇到问题时,我们鼓励他们在GitHub页面上提出问题,或者如果紧急,联系主开发人员(德里克·格伦,djgroennl@gmail.com)直接。

为MPWide做出贡献的可能性

MPWide主要是作为一种独立的、非常轻量级的通信库,易于维护和支持。为了实现这一点,我们的目标是保留非常小的代码库、有限的功能集和最少数量的主发行版中的依赖项。

因此,我们在接受新功能和对中央GitHub存储库中的代码。我们的主要目标是改进MPWide的性能和可靠性,并倾向于接受对只有当这些贡献促进了库,并且具有有限的代码和依赖项占用空间。

然而,开发人员和用户都可以自由地将MPWide分支到一个单独的存储库,或将MPWide整合到更高级别的工具和服务中LGPL 3.0许可证允许。我们强烈建议将MPWide集成为图书馆模块直接进入更高级别的服务,然后依赖MPWide API可实现任何所需功能。MPWide的代码非常小我们的目标是最小化版本之间API的任何更改,允许这些高级服务轻松交换其现有的MPWide模块获取库的未来更新版本。我们已经使用了这种方法在SUSHI、HemeLB和MUSCLE 2等代码中。