如何在工程应用中合理采用并行编程技术

分享到:

 在科学计算领域,关于并行编程的讨论集中于如何自定义算法以有效利用硬件。以下几个与高性能系统有关的因素使讨论趋于白热化:多核和超多核系统的引入、全局处理单元(GPU)等可编程设备的出现、现成商用(COTS)计算机集群的日益普及。

 

直至最近,尚无商业高级工具可以支持针对高性能系统的科学计算应用程序的开发。并行编程是一门深奥的技术,只有那些旨在通过利用自定义设置和低级库以及通过为特定硬件调优应用程序,来实现最高性能的专家才会应用。在 2007 年的一份简报中,IDC 强调了扩展到多个节点的难度,原因在于缺乏恰当的编程环境。1如今,高性能系统日益普及,因而急需使这些系统在整体上更具可编程性。

 

为此,并行编程解决方案的关注焦点必须超越自定义算法和性能。并行编程工具的生态系统正在得以发展。它们协助工程师设计、开发和调试并行应用程序,以及充分利用快速发展演变的硬件的能力。为了取得成功,这些在过去几年中已经成熟了很多的新生态系统需要:

 

1. 扩展开发串行应用程序时所用标准工具的功能性,以支持并行编程

2. 支持应用程序的可伸缩性,从简单的多核桌面到复杂的集群和网格配置,无需修改应用程序代码

3. 提供健壮的集成开发环境(IDE)

4. 以批处理和交互式模式执行应用程序

 

 


使用 MATLAB 编写并行代码时,MathWorks 并行计算工具允许工程师在对串行代码更改最少或者完全不必更改的情况下并行化应用程序。

 

语言支持

 

在选择编程语言时,适当的并行编程支持是一项关键考虑事项。这种支持的具体范围可能有所不同,从微妙的隐式支持到极为显式的语言构造。隐式方法包括由系统推动的自动并行化,无需修改现有程序。显式方法要求用户声明程序,使该程序以并行方式运行。隐式并行化依然是一个活跃的研究领域,当前尚无全面的解决方案,因而在可以预见的未来,一定程度的语言显性是必不可少的。2 理想情况下,语言应直接支持高级并行语言构造,用户只需进行最少的编程声明即可获得最优的性能。

 

传统并行编程解决方案主要关注显式方法,这种方法通常使用消息传递接口(MPI)命令。MPI 是并行程序中点对点通信的行业标准协议。使用 MPI 要求程序员处理低级语言构造,这是一个巨大的障碍。

 

某些软件企业正着手应对并行编程支持的需求。例如,. NET Framework 的 Microsoft Parallel Extensions 为使用任何 .NET 语言编写的应用程序提供了并发语言构造。这些构造抽象了较低层面的编程细节。

 

MathWorks 并行计算工具允许用户跨隐式/显式范畴编程。例如,编写计算密集型应用程序的 MATLAB 用户可能将 FOR 循环声明为 PARFOR 循环。在单处理器系统中执行时,PARFOR 循环的行为与传统的 FOR 循环完全相同。但在多核机器或集群上执行时,PARFOR 将透明、有效地利用如今可用的其他计算资源。此外,编写数据密集型应用程序的用户可将数组声明为分布式数组,跨多个内核或处理器分配。分布式数组使用户能够开发并行应用程序,而无需自行关注消息传递的低层细节。在理想的隐式编程中,并行化的应用程序无需修改任何代码。MathWorks 正在为此理想而努力,逐渐在工具包中为并行计算添加直接支持,不再需要修改使用这些工具的应用程序。

 

可伸缩性

 

配有多核处理器的桌面计算机和 以GPU为基础的通用计算(即GPGPU,如 NVIDIA 出品的 CUDA Toolkit)已经问世。而为此类系统编程往往需要在单独一台机器上使用线程模型,许多用户需要超越单独一台机器的能力,扩展到计算机集群。此时就需要基于进程的模型。用户应用程序无需关注线程或进程,而是应该尽可能有效地运行。无论如何,可伸缩性仍然是一个有待解决的难题

 

在某些情况下,用户需要在具有可变容量的资源上运行应用程序。可变资源的示例之一就是 Amazon Elastic Compute Cloud (EC2),它使用户能够完全控制在 Amazon 的计算环境中运行的资源。这种方法的障碍包括安装的困难性以及在外部系统上运行时对知识产权的掌控不足。

 

程序员需要工具来使之能够无缝地将应用程序从桌面扩展到集群和网格,同时无需修改代码。MathWorks 并行计算工具提供的配置框架就是为并行应用程序解决可伸缩性问题的典范之一。配置框架允许用户维护指定的设置,例如调度程序类型和集群使用策略。因而,用户只需轻松更改配置名即可在硬件资源间切换。

 

集成开发环境(IDE)

 

IDE 需要支持基于处理器和基于线程的解决方案,同时协助新手和经验丰富的程序员开发应用程序。具体来说,IDE 使程序员能够调试处理大型数据集并且在桌面计算机或大型集群上运行的并行应用程序。

 

Microsoft 在其 Visual Studio 开发系统中做出了很多努力以应对此需求。Visual Studio 2005 可执行并行应用程序,其调试器支持进程级和线程级断点与步进。而另外一种产品——由 TotalView Technologies 提供的 TotalView Debugger 支持多种平台和编程语言,它能够扩展到数千线程或进程,并提供了探索大型和复杂数据集的工具。

 

批处理和交互式执行模式

 

工具应支持批处理和交互式工作流。如果能够以交互的方式开发并行应用程序,程序员的工作效率将大幅度提高。然而,大多数高性能计算(HPC)中心都支持批处理工作流,用户编写应用程序、将其提交到集群以便处理,并等待结果。其他一些解决方案则基于 Web,如来自 Purdue University 的 nanoHUB.org 以及 Sun Microsystems 提供的 network.com,它们关注以交互式方法随需应变地访问计算资源。

 

MathWorks 并行计算工具同时为两类工作流提供支持。它们扩展了 MATLAB,允许程序员使用熟悉的 MATLAB 环境,以交互的方式开发并行应用程序。程序员还可使用批处理环境,这为他们提供了脱机执行模式。

 

结束

 

总而言之,并行应用程序开发中最关键的需求就是语言构造、可伸缩特性、开发环境和工作流模式。某些厂商提供的解决方案允许科学计算用户更有效地为并行系统构建应用程序,就如同构建传统串行程序一样。无论如何,理想工具生态系统中依然存在空白。诸如效用计算和网格可用性等正在展现出来的趋势会为这一迅速变化的领域带来更多更复杂的需求。

©2019 Microchip Corporation
facebook google plus twitter linkedin youku weibo rss