并行编程接口规范MPI

▶1.并行编程概述

在计算机领域,“并发”与“并行”有细微的差别。并发是将一个程序分解成多个片段,并在多个处理器上同时执行:并行是多个程序同时在多个处理器中执行,或者多个程序在一个处理器中轮流执行。由于两者具有很强的相关性,以下对并发与并行不做区分,统称为并行。并行程序设计目前仍处于探索阶段,还没有一套普遍认同的并行编程体系。也没有一个专业的并行程序设计语言,大部分并行程序语言或方法,都是附加在传统程序语言之上。如OpenMP附加在C/C++、Fortran语言之上:MPI附加在C/C++、Fortran,PythonJava等语言之上;还有一些并行编程语言是传统语言的并行化改进版,如Go语言。
并行计算技术主要有三大类:一是广泛用于高性能集群计算的MPI技术;二是互联网海量数据计算平台,如Hadoop(读[哈杜普]);三是互联网大规模网格计算。

▶2.并行编程接口规范MPI

并行编程有MPI(消息传递接口)和OpenMP(开放式消息传递)两个系列。MPI适合多主机并行计算(如计算机集群);OpenMP适合于单主机多核/多CPU并行计算。

MPI和OpenMP是并行编程接口规范(函数库),不是具体的编程语言。MPI有多种实现版本,如MPICH、CHIMP、OpenMPI(注:与OpenMP不同)等。MPI与编程语言、操作系统和硬件平台无关,它可以与C/C++、Python、Java语言绑定。MPI降低了并行编程的难度和复杂度,程序员可以把更多的精力投入到并行算法本身,而非具体细节。
MPI并行数据处理的基本思路是:将任务划分为可以独立完成的不同计算部分,将每个计算部分需要处理的数据分发到相应的计算节点,并且分别进行计算。计算完成后,各个节点将各自的结果集中到主计算节点,主节点对计算结果进行最终汇总。
例:一个简单的Python语言MPI程序案例如下。

#-*-coding:gbk -*        #设置中文字符编码

from mpi4py import MPI        #导入mpi4py第三方包

print('我的rank是:8d'%MPI.rank)        #输出进程rank序号(即ID)

D:\>mpirun -np 4 python test.py        #在DOS提示符窗口执行并行处理命令

        我的rank是:0        #-np4表示启动4个MPI进程

        我的rank是:3        #rank是处理进程号

        我的rank是:1        

        我的rank是:2

说明:以上代码需要安装MPICH2软件和Python第三方软件包mpi4py。

▶3.程序并行计算中的相关性

相关性是指指令之间存在某种逻辑关系。并行编程会受到相关性的影响,这些相关性包括数据相关、资源相关和控制相关。消除相关性是并行编程的重要工作。

1)数据相关

如果一条指令产生的结果,可能在后面的指令中使用,这种情况称为数据相关。

例:程序指令序列片段如下:
a=100        #指令1

b=200        #指令2

c=a+b        #指令3

从以上程序可见,指令1和指令2之间没有相关性,它们可以并行执行。但是这两条指令与指令3之间存在数据相关性,也就是说,指令3要等待指令1、2执行完成后,才能执行。在某些情况下,一条指令可以决定下一条指令的执行(如判断、调用等)。

2)资源相关

一条指令可能需要另一条指令正在使用的资源,这种情况称为资源相关。例如,两条指令使用相同的寄存器或内存单元时,它们之间就会存在资源相关。
例:程序的指令序列片段如下:
for a<=100        #指令1,循环,如果a≤100

        a=a+1        #指令2,a赋值

        b=b+a        #指令3,b赋值

end for        #指令4,循环结束

从以上程序可见,指令2与指令3存在资源相关,它们都需要用到变量a的存储单元。如果指令2和指令3并行执行,将会导致错误的结果。

3)控制相关

分支指令会引起指令的控制相关性。如果一条指令是否执行依赖于另外一条分支指令,则称它与该分支指令存在控制相关。
例:程序指令序列片段如下:

if P then        #如果条件P成立

        S        #则执行S语句组

end if        #结束选择语句

从以上程序序列可见,条件P与S语句组存在控制相关。

▶4.Amdahl加速比定律

1)加速比定律

计算机系统设计专家阿姆达尔(Amdahl)指出:系统中某一部件由于采用某种更快的执行方式后,整个系统的性能提高,与这种执行方式的使用频率或占总执行时间的比例有关。阿姆达尔的设计思想是:加快经常性事件的处理速度能明显地提高整个系统的性能。
Amdahl定律阐述了一个回报递减规律:如果仅仅改进一部分计算的性能,则改进越多.系统获得的加速比增量会逐渐减小。这一结论与美国社会学家霍曼斯(George Casper Homans)提出的“边际效益递减率”相同

2)Amdahl定律在多核处理器系统中的应用

例:有些任务可以并行处理,例如有100亩庄稼已经成熟,等待收割,越多的人参与收割庄稼,就能越快地完成收割任务。而另外一些任务只能串行处理,增加更多资源也无法提高处理速度。例如,有100亩庄稼,它们的成熟日期不一,增加更多人来收割,也无发很快完成收割任务。为了充分发挥多核处理器的能力,计算机使用了多线程技术,但是多线程技术要求对问题进行恰当地并行化分解,并且程序必须具备有效使用这种并行计算的能力。大多数并行程序都与收割庄稼有很多相似之处,它们都是由一系列并行和串行化的片段组成。由此可以看出,一个给定问题中的并行加速比受到问题中串行部分的限制。尽管精确估算出程序执行中串行部分所占的比例非常困难,但是Amdahl定律还是可以对计算性能提高做一个大致的评估。
并行计算必须将一个大问题分割成许多能同时求解的小问题。哪些问题需要并行编程处理呢?字处理不需要,但是语音识别用并行处理会比串行处理更有效。解决并行编程的困难并不在于并行编程语言或程序开发平台,最难处理的是已有的串行程序。

▶5.程序并行执行的基本层次

程序的并行执行可分为三个层次:应用程序的并行、操作系统的并行和硬件设备的并行。目前的CPU和主流操作系统均已具备并行执行功能,一般来说,硬件(主要是CPU)和操作系统都会支持应用程序级的并行。简单地说,即使应用程序没有采用并行编程,硬件和操作系统还是可以对应用程序进行并行执行。下面仅讨论应用程序级的并行。
并行编程和分布式编程是程序并行执行的基本途径。并行编程技术是将程序分配到单个或多个CPU内核或者GPU内核中运行;而分布式编程技术是将程序分配给两台或多台计算机运行。一般而言,应用程序级的并行编程可分为以下几个层次。

1)指令级的并行执行

当一条指令中的多个部分被同时执行时,便产生了指令级的并行执行。

2)函数级并行

如果程序中的某一段语句组,可以分解成若干个没有相关性的函数,那么就可以将这些函数分配给不同的进程并行执行。这种并行执行对象以函数为单位,并行粒度次于指令级并行。在并行程序设计中,这种级别的并行是最常见的一种。

3)对象级的并行

这种并行编程的划分粒度较大,通常以对象为单位。当这些对象满足一定的条件,不违背程序流程执行的先后顺序时,就可以把每个对象分配给不同的进程或线程进行处理。例如,在3D游戏程序中,不同游戏人物的图形渲染计算量巨大,在并行编程中,可以对游戏人物进行并行渲染处理,实现对象级的并行执行。

4)应用程序级的并行

语言程序级的并行执行并不陌生,操作系统能同时并行运行数个应用程序。如我们可以同时打开几个网页进行浏览,还可以同时欣赏美妙的音乐。这种语言程序级的并行性,在游戏程序设计中也屡见不鲜,它提高了多个应用程序并行运行的效率。

▶6.并行程序设计的难点

在并行编程中,程序可以分解成多个任务,并且每个任务都可以在相同的时间点执行,每个任务又可以分配给多个线程执行。程序执行的顺序和位置通常不可预知。例如,3个任务(A、B、C)在4内核CPU中执行时,不能确定哪个任务首先完成,任务按照什么次序来完成,以及由哪个CPU内核执行哪个任务。除了多个任务能够并行执行外,单个任务也可能具有能同时执行的部分。这就不得不对并行执行的任务加以协调,让这些任务之间彼此通信,以便在进程之间实现同步。并行编程有以下主要特征。
(1)确认问题在应用环境中是否存在并行性。

(2)将程序适当地分解成多个任务,使这些任务可以在同一时间执行。

(3)进行任务之间的通信协调,使任务能够同步高效地运行。

(4)竞争和死锁是并行编程中经常出现的问题,因此要注意避免任务调度错误。

你可能感兴趣的:(java,服务器,linux,学习)