并行计算与集群技术(3)

并行计算相关技术

并行计算的关键技术
并行计算的基本条件包括硬件(并行计算机)、并行算法设计和并行编程环境。目前,并行计算的关键技术主要包括四部分:体系结构、算法设计与分析、实现技术、应用。

  1. 并行计算机的体系结构
    开行计算机关注两个要点:第一,组成要素,即硬件,并行计算机体系结构组成要素包
    括结点(Node) 、互联网络(Interconnect Network) 和内存(Memory) .结点可以由一个或乡
    个处理器组成;互联网络是指连接结点,形成网络环境:内存是指多个存储模块组:第二,结
    构模型,并行计算机典型的结构模型有PVP、SMP. DSM. MPP 和 COW, 并行计算机体系结构包含了高端的高性能计算机和低端的普及型计算机。
  2. 并行算法设计与分析
    并行算法设计与分析包含了并行算法的设计与分析以及算法库和测试库。
    并行化的主要思想是分而治之。并行算法的设计思路可以从两个角度出发。
  1. 作用域分解:根据处理数据的方式,形成多个相对独立的数据区,由不同的处理器分
  2. 任务或功能分解:根据初始问题的求解过程,把任务分成若干子任务,每个子任务完成全部工作的一部分,实现任务级并行或功能并行。这一过程关注要被完成的计算而不是操作数据的计算。
  1. 并行实现技术
    并行实现技术可分为三类,分别是线程库、消息传递库和编译器支持。线程库
    POSIX线程和 WindowsAPI 线程)可实现对线程的显性控制;如果需要对线程进行精么》
    理,可以考虑使用这些显性线程技术。借助消息传递库(如消息传递接口MPI) , 应用租离。
    同时利用多台计算机,它们彼此间不必共享同一内存空间。并行实现技术包括编程实现和性能优化,它包含了并行编程模型以及并行编程的环涤
    工具。并行编程环境主要有操作系统与编程语言。并行计算机主流操作系统有:UNIX/Linux.
    如 IBM的AIX、HP的 HPUX、Sun的Solaris、SGI的IRIX 都是 UNIX 的变体。并行计算的编程语言有Fortran 77/90/95或C/C++.
  2. 并行计算的应用
    并行计算的应用包含了科学工程应用和各种新型的应用,如天气预报、核科学、石油勘探、地震数据处理、飞行器数值模拟等等。
    并行计算的性能估计
    并行计算的性能主要从两个方面进行评价:加速比和并行效率。
  1. 加速比(Speedup) : 同一个任务在单处理器系统和并行处理器系统中运行消耗的时间的比率,用来衡量并行系统或程序并行化的性能和效果,其公式计算如下。
    Speedup=T/IN其中,Speedup是加速比,T1是单处理器下的运行时间,TN是在有N个处理器并行系统中的运行时间。
  2. 并行效率(Parallel Efficiency) : 加速比与所用处理机个数之比。并行效率表示在并行机执行并行算法时,平均每个处理机的执行效率。
    井行程序改计——MPI编程
    目前,并行计算的代表性技术是消息传递接口 MPI (Message Passing Interface) .MPI提出了一种基于消息传递的函数接口描述,但MPI 本身并不是一个具体的实现,只是一种标准描述。我们从Hadoop 中能找到很多MPI的影子,如Hadoop 中文件系统和 Map/Reduce 处理
    是主从结构的,而主从结构是 MPI 并行程序的一种重要设计方法。因此了解并行计算时代的程序设计方法 MPI 对我们理解云计算中的一些技术基础和理念是有好处的,我们在实际研究工作中也体会到这点,所以后续将介绍采用 MPI 进行并行程序设计的核心技术,使读者能由并行计算进入云计算。
    MPI简介

并行程序设计方式主要有三种:
(1)设计全新的并行语言,其优点是并行程序实现简单、方便;缺点是没有统一的标准,设计语言的难度和工作量都很大。
(2)扩展串行语言语法,使其支持并行特征。其思路是将串行语言的并行扩充部分作为原来串行语言的注释(标注), 对串行编译器来说,并行扩充部分将不起作用,而对于并行编译器来说,会根据标注要求将串行程序转化为并行程序。其优点是相对于设计全新的并行语言,难度有所降低;缺点是需要重新开发编译器。
(3) 为串行语言提供可调用的并行库。其优点是无须重新开发编译器,开发者只需要在串行程序中加入对并行库的调用,就可以实现并行程序的设计。从以上解释可以看到,对串行语言的改动越大,实现难度越大。
目前最常采用的是提供并行库和扩充语法成分的方式来进行并行程序设计。消息传递接口(Message Passing Interface, MPI) 并行程序设计采用提供并行库的方式,它是消息传递函数库的标准规范。MPI是一种新的库描述,不是一种语言。MPI是一种标准或规范的代表,而不是特指某一个对它的具体实现。MPI 是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准。它由MPI论坛开发,支持Fortran、C和C++.消息传递并行程序设计要求用户必须通过显式地发送和接收消息来实现处理机间的数据交换。每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式的消息传递来实现。这种编程方式是大规模并行处理机(MPP) 和集群(Cluster) 采用的要编程方式。由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,因此并行计算粒度大,特别适合于大规模可扩展并行算法。目前,消息传递是并行计算领域的一个非常重要的并行程序设计方式。
设计MPI的目标是:
1.提供应用程序编程接口。
2.提高通信效率。包括避免存储器到存储器的多次重复拷贝,允许计算和通信的重叠。
3.可在异构环境下提供实现。
4.提供的接口可以方便C语言和FORTRAN77的调用。
5.提供可靠的通信接口。即用户不必处理通信失败。
6.接口设计应是线程安全的(允许一个接口同时被多个线程调用)。
7.接口的语义是独立于语言的。
一个简单的MPI程序实现
在编写 MPI程序时,通常需要回答两个问题:一是任务由多少个进程来进行并行计异。
二是要清楚各结点上运行的是哪个进程。
下面首先以C 语言的形式给出一个最简单的 MPI 并行程序。该程序的任务是在终端打印出“Hello World! ”字样。
“Hello World! ”是SPMD 格式的,MPIint和MPL Finalianon
之间的代码为并行代码,该并行代码将在所有的结点上执行,由于该并行环境中部署了3个体点,所以该并行代码会在三个结点上都运行一次,从而出现三个 Hello world! , 注意,MPI_init0和 MPI_Finalize0分别是并行程序的开始函数和结束函数。
MPI消息

  1. 消息信封指明了发送或接收消息的对象及相关信息。消息信封由源/目的(Destination) 标识(tag) 和通信域组成。消息信封的格式类似于信封的封皮,如图5-15所示,
    且的(Destination) 是消息的接收者,由 send 函数参数确定。源(Source) 是消息的提供
    在MPI程序中,进程间通信所传送的所有信息称为
    者,由发送进程隐式确定,由进程的 rank 值唯一标识。如果隐含源/目的,就是组通信。
    标识是区别同一进程的不同消息,使程序以一种有序的方式处理到达的消息,它是必要
    的,但不是充分的,因为“tag”的选择具有一定的随意性。MPI用一个新概念“上下文
    (context) ”对“tag”进行扩展。系统运行时分配,不允许统一配置。如果隐含“tag”, 就是组通信,由通信语句的序列决定消息的匹配。
  2. 消息内容(Data) 指明了本消息将要传递的实体数据部分。消息内容由起始地址、数据个数和数据类型组成。
    MPI消息的传递过程
    消息传送并行程序设计原则如下。
  3. 用户必须通过显式地发送和接收消息来实现处理机间的数据交换。
  4. 每个并行进程均有自己独立的地址空间,相互之间访问不能直接进行,必须通过显式
    的消息传送来实现。
  5. 运科编程方式是大规模并行处理机(MPP) 和集群(Cluster) 采用的主要编程方式。
    由于消息传递程序设计要求用户很好地分解问题,组织不同进程间的数据交换,因此并计算粒度大,特别适合于大规模可扩展并行算法。消息传递是当前并行计算领域的一个非常重要的并行程序设计方式。
    MPI常用基本函数
    D1调用接口的总数虽然庞大,但根据实际编写 MPI的经验,常用的MPI 承数的个数知
    是有限的。下面是6个最基本的MPI函数。
  6. MPI Init: 启动MPI环境,标志并行代码的开始。函数原型为:
    int MPI_Init (intargc,char**argv)*
    交通常是第一个被调用的MPI函数,除MPI_Initialized (测试是否已执行 MPI Init) 外。
    其全所有的MPI函数应该在其后被调用。MPI通过 argc、argv 得到命令行参数。
  7. MPI Comm_size: 获得通信空间comm中规定的组包含的进程的数量。函数原型为:
    **int MPI_Comm_size (MPI_Comm comm,intsize)
  8. MPI Comm_rank: 得到本进程在通信空间comm中的rank值,即在组中的逻辑编号
    (从0开始,类似于进程ID) .函数原型为:
    int MPI_Comm_rank (MPI_Comm comm,intrank)
  9. MPI_Send: 标准阻塞发送消息,函数原型为:
    int MPI_Send (void*buff,int count, MPI_Datatype datatype,int dest,int tag, MPI_Comm comm)
    其中,buff 是消息发送缓冲区;count 是指定数据类型 MPI_Datatype 的消息个数,而不是
    字节数;dest是发送消息的目的地;tag 是消息标签;comm是通信空间或通信域。
  10. MPI_Recv: 标准阻塞接收消息,函数原型为:
    unt MPI Recuf voidbuff int count MPI Datatype datatype,int source,int tag, MPL_Comm com*
    调用MPI函数库的并行程序时遵循以下约定:
    1.程序开头必须包含mpi.h头文件。
    2.MPI函数返回出错代码或MPI_SUCCESS成功标志。
    3.MPI_前缀,且只有MPI名称以及MPI_标志后的第一个字母大写,其余小写。
    4.程序的并行部分以MPI_Init()开头,以MPI_Finalize()结束,其他部分为程序的串行部分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值