|
OpenMP是一种工业标准的API设计规范,是由Sun、HP、IBM和Intel等多家顶级计算机厂商和软件开发商联手推出的,其目的在于为软件开发人员提供一种通用的规范,使其可以很方便地设计新并行应用程序或修改及并行化现有串行应用程序,从而利用配置了多处理器计算系统的共享内存。可移植性也是OpenMP的主要目标之一,使用OpenMP开发的并行应用程序源代码可由支持OpenMP的任何编译器编译,且编译好的二进制代码可在目标硬件平台上运行,以获得出色的并行性能。
最流行的本地编程语言Fortran和C/C++都支持OpenMP。左图给出了分别以C/C++和Fortran编写的简单OpenMP程序示例。在本例中,将y数组加到x数组这一循环迭代操作,是以并行方式执行的。源代码中的编译指示、指令和编程API调用表示了OpenMP的结构。OpenMP 的结构允许程序员指定并行区域、同步和数据作用域属性,它还支持用于指定运行时配置的环境变量,例如,环境变量OMP_NUM_THREADS指定了运行时所使用的工作线程的数量。
由于OpenMP编程模型专用于单一进程,因此其可伸缩性最终要受到一台计算机中处理器(线程)数量的限制。可伸缩性还会受编程逻辑复杂程度和编程风格的限制。当前的OpenMP语义尚不够灵活,无法处理某些应用程序。例如,当前的OpenMP规范仅允许在并行区域内创建有限的动态线程。
MPI(Message Passing Interface,消息传递接口)是一种工业标准的API规范,专为在多处理器计算机和计算机集群上获得高性能计算而设计,该标准是由大量计算机供应商和软件开发商共同设计的。有多种来自不同研究机构和厂商的MPI实现,其中最流行的一种就是MPICH,MPICH常用作为特定平台或互连而优化的MPI实现的编码基础。MPI实现依然在不断发展。MPI-1支持一些关键特性,如点到点及与通信设备的集群消息通信。一条消息中可包含基本数据类型或派生(用户定义的)数据类型的MPI数据,它还支持互连拓扑。MPI-2则提供许多高级通信特性,如远程内存访问和单端通信等,还支持动态进程创建、管理和并行I/O。
总体而言,MPI为计算机集群上的并行应用程序提供了一个出色的解决方案,但对于许多开发人员来说,MPI也是一种困难的编程模型,因为MPI的通信延迟时间较长,所以必须合理分割程序的核心逻辑,以使分布成本更为合理。分析及划分应用程序问题,并将问题映射到分布式进程集合中,绝对不是一项可靠直觉完成的任务,因为许多MPI进程之间的交互作用都相当复杂,因此即便选用了恰当的工具,调试并调整运行在大量节点上的MPI应用程序也极具挑战性。MPI的性能取决于底层硬件平台和互连,在某些极端的情况下,MPI应用程序的性能可能会受到繁重的互连流量的影响。另外一个严重的问题就是大规模MPI应用程序的可靠性。对于许多MPI实现而言,只要单一计算节点发生故障,无法正确响应,MPI程序就会停止工作。(本文内容由Sun软件架构师 Liang T·Chen和微软软件架构师Herb Sutter提供)
编看编想
大规模的并行化来了
姜波
在服务器端,RISC架构的服务器进入多核技术领域要早一些,所以一些专有的、或者说是基于Unix操作系统的行业化特征非常显著的应用已经是并行化编写的。而当x86领域迎来64位计算和多核技术的时候,绝大多数的基于Windows的应用都是传统的按照单一线程开发的。
现在,标准化、开放、TCO等浪潮席卷整个计算领域,x86服务器市场在飞速发展,逐步挤压原来的、非常强势的RISC架构服务器占有的份额,跟随服务器硬件技术的发展脚步,基于x86服务器的操作系统以及上层应用,都需要考虑处理器级别的多核、并行计算设计带来的性能提升,考虑软件如何能够适应并且更充分发挥硬件架构的优势。应该说,这是软件层进入了大规模的并行化设计阶段,毕竟,在销售量方面,x86市场是绝对领先的。
记者之前接触过一些将应用改为并行运行的案例,是采用集群系统后,将原来的应用进行一些修改以便能够充分利用集群系统并行处理的优势,比如石油勘探行业的用户,他们在计算和分析地震勘探资料应用中,采用大规模并行计算系统来实现叠前偏移和精确地震成像处理,提高勘探开发效益。不过,这些应用都还处在一个刚刚开始的并行化应用阶段,采用的是集群系统。多核技术在x86服务器中成熟后,如何能够充分利用到多核并行处理的优势,才是软件层面真正的挑战,就是所谓的“线程级并行”。
处理器在并行计算方面所做出的技术革新贡献,仅仅是整个产业链上的一个小环节,与用户应用紧密相连的是软件层,正如文章中引述的微软软件架构师Sutter所说的:处理器设计首要的着眼点应该是可编程性,而不是速度。
相关链接
真实案例研究 并行搜索
要在大量符合某条件的问题中查找最优解决方案,或所有可枚举出的解决方案,最流行的一种方法就是树搜索。许多科学问题或日常生活中遇到的问题都可以转换并表达为一个并行树搜索问题。可能的应用程序范围从微不足道的解谜一直到复杂的战略分析。一种流行的方式就是建造一个状态树,每个节点表示一种特定的应用程序状态,然后对状态树进行搜索,找到具有最优状态的目标节点,或经过最少的步骤抵达目标节点。
为这样的并行搜索应用程序开发软件共有两个步骤。第一步是创建一个良好的抽象模型和转换问题,并以状态树的形式将其表现出来。抽象模型的质量将影响树的形状和大小,也会影响搜索的难易程度。第二步是使用并行计算在整个状态树内搜索。在大多数情况下,树都是在程序运行时动态建造的。由于树易于以一种不均衡的方式成长,因此随机地将一个子分支指派给工作线程或进程,可能会失去负载均衡。
总体而言,概括并行搜索编程非常困难,从模型抽象开始,我们就要面对挑战,随后是树建造,最后是并行搜索算法。一个出色的树模型需要开发人员具备指定行业的丰富经验,将问题完备地表达出来,并用树节点的形式表现问题。建造状态树后,通常还需要对树模式进行试验分析,以设计出一种有效的并行搜索算法。算法通常需要对树节点进行分割和分组,以发挥并行性能。
|