郭福洲
摘 要:步入信息高速快车的时代,基于MPI的并行计算是解决物联网、图像处理获取数据,人工智能处理数据的重要途径之一;同时也是MIMD(多指令多机)并行计算实现高效、高速目标的重要策略与方法。笔者从MPI(Message-Passing-Interface 消息传递接口)一个跨语言的通信协议机制,通过Linux或Windows操作系统平台,以C++语言平台为基础,论述并行计算实现几种方法。
关键词:MPI 并行计算 算法 进程 消息 通信
中图分类号:TP301 文献标识码:A
Abstract: In the era of information high-speed train, MPI-based parallel computing is one of the important ways to solve the Internet of Things, image processing to obtain data, and artificial intelligence to process data; It is also an important strategy and method for MIMD (multiple instruction multiple machine) parallel computing to achieve high efficiency and high speed. Starting from MPI (Message-Passing-Interface), a cross-language communication protocol mechanism, through Linux or Windows operating system platform, based on the C++ language platform, the author discusses several ways to realize parallel computing.
Key Words: MPI; Parallel computing; Algorithm; Process; Message; Communication
1 并行計算发展的背景
经历几十年来电子信息产业的软硬件相互倒逼、促进与发展,人类在许多领域(如:空间气象与遥感、图像处理与捕捉、物联网、人工智能、虚拟现实等)发展迅猛。但随着人类在科学领域对信息与数据处理数量规模与速度的要求更高,对数据处理、信息交换与传输效能、速度也在不断地增加,并行计算[1]与分布式系统调度等新型算法与程控策略也更加日新月异。硬件搭台(基础),软件唱戏(调度与并行计算编程),从硬件实现并行计算基础层面来看:以网络系统支撑重要结点――计算机为标志,单机性能大幅度提升的主要举措有:日益增加的集成电路晶体管密度、将提升信息传递速度增快与集成电路的散热能力已经达到极致,发展多核处理器;从软件实现并行编程与计算层面来看:着力编写任务并行和数据并行的程序,以期更大程度上利用多核处理器将有待解决的问题分解成的任务与数据科学分配并均衡到各个核上完成。
为实现这一目标的并行硬件基础构建:主存+CPU+总线(互连设备)。采用Flynn(费林)法基于指令和数据流方式分类,即,可以将并行计算机划分为SISD、MISD、SIMD和MIMD四种。
除SISD系统外,其他三个才是真正的并行计算系统[2]。其中,SIMD是以同一指令进行对多个数据执行操作,进而实现完成对多数据流进行同时计算的目的。因此,该系统非常适合处理大型数组的简单循环,从此衍生出向量处理器[3],重点对数组或数据向量进行操作。我们常说的GPU(graphics processing unit)图形处理器计算机就是讲物体表面的内部表示为使用点、线、面的像素数组来表示的,其初期也是一个概念上的SIMD系统,不过随着技术的发展,现代GPU也可以有几十个核,每个核也能独立地执行指令流。
在并行计算中,一般将MIMD作为主要研究对象。其中MIMD系统有两种类型:共享内存系统(见图1)和分布式内存系统(见图2)。
在共享内存系统中,自治的CPU通过互连网络与内存系统相连,每个CPU都能访问每个内存系统中的内存。分布式内存系统中,每个CPU都有自己的独立内存,每个单元之间的内存访问通过消息通信或者特殊的函数来进行。
软件编程实现并行计算的策略:无论哪一种互连,均需分布式运算调度与并行计算作为灵魂支撑。SPMD(单程序多数据流):指的不是在每个核上运行不同的程序,而是一个程序仅包含一份代码,通过一定的条件分支,使得这一份代码再执行的时候表现得像是在不同的处理器上执行不同的代码。
以MIMD分布式内存系统来说,其CPU 各个内核以DMA方式各自访问自身内存,负责处理CPU核之间通信的进程进行数据交换时,则只好通过消息[4]传递API来处理。负责消息传递API需提供至少一对发送函数和接收函数。并通过它们的序号(rank)来标识。
并行计算程序的编写主要目的当然是为了提供它们的性能,那么我们应该如何去评价一个并行计算程序的性能呢?答案是:加速比S=T串行T并行S=T串行T并行与效率E=T串行P×T并行E=T串行P×T并行。
理论上而言,如果使用p个进程或者线程来运行一个并行程序,并且每个核中之多只有一个进程/线程,那么,S=p,E=1。但是在实际情况下,S<p, E<1。假设我们已具备如何评判由串行程序改为并行程序性能的能力,若现有一串行程序,为了提高性能,我们如何将串行程序改为并行计算程序获取高性能?从理论层面策略实现如何分步?一般情况下,需要将工作进行拆分,使得分布在每个进程中的工作量均衡,并行让它们之间的通信量最少。于是串行程序并行化设计策略展开一般按以下几步进行:
第一步:划分。将串行程序细分并序化成为与为一个个具备独立并行执行的任务,每个任务都包含自己的指令与数据集;
第二步:通信。确定第一步识别出来的任务之间需要执行那些通信。
第三步:凝聚/聚合。将第一步确定的任务与通信结合成上层宏观任务。
第四步:分配。将层宏观任务再分配至进程/线程。这一步我们就关注:应让通信量最小化,并保证各个进程/线程所领受的工作量基本均衡。
由务虚的理论走向务实,实现的手段有:MPI(Message-Passing-Interface 消息傳递接口,后简称MPI)、Pthreads、OpenMP、OpenCL、GPU、Hadoop等,该文仅就MPI为主要阐述对象,讨论其实现并行算法的途径。
2 MPI的特性与并行编程机制
MPI(Message-Passing-Interface 消息传递接口)其任务是在并行计算进程之间完成消息传递。传递层级为进程层级。它并非编程语言,而是一个独立且可被Fortran、C++和c#程序调用的函数库。它主要集成了可供两个进程之间进行各种情况通信处理的函数。并且其在Windows、Linux等不同平台环境中都有对应的库。该文所述其应用实践,是以Windows10为开发环境为背景。
MPI定义了独特的数据类型参数,不采用字节计数,而是以数据类型为单位指定消息长度;对于C和Fortran,MPI均预定义了一组数据类型和一些附加的数据类型;可以发送或接收连续的数据,还可以处理不连续的数据;允许发送和接收不同的数据类型。
MPI与OpenMP并行程序的区别是:MPI是一种基于信息传递的并行编程技术。消息[5]传递接口是一种编程接口标准,并非一种具体的编程语言。简言之,MPI标准定义了一组具有可移植性的编程接口。主要的MPI-1模型不包括共享内存概念,MPI-2也只有有限的分布共享内存概念。 但MPI程序经常在共享内存的机器上运行。在MPI模型周边设计程序比在NUMA架构下设计要好,是因为MPI鼓励内存本地化。尽管MPI属于OSI参考模型的第五层(会话层)或者更高,他的实现可能通过传输层的sockets和Transmission Control Protocol (TCP)覆盖大部分的层。大部分的MPI实现由一些指定惯例集(API)组成,可由有此类库的语言比如C#, Java or Python直接调用。从通信[6]角度上,可视作为一个跨语言平台的通信协议,用于计算机编写程序实现并行计算。支持点对点和广播。MPI作为一个信息传递应用程序接口,包括协议和和语义说明,用以说明其如何在各种实现中发挥其特性。MPI的特点是高性能、大规模性和可移植性。MPI在今天仍为高性能计算的主要模型。
MPI实现并行是进程级;采用的是分布式内存系统,显式(数据分配方式)实现并行执行,通过通信在进程之间进行消息传递,有较好的可扩展性。MPI虽适合于各类机型,但其编程模型复杂:需要分析及划分应用程序问题,并将问题映射到分布式进程集合;并需解决通信延迟长和负载不平衡两大主要问题。
3 MPI安装与设置要领
(1)MPI以mpich2-1.4.1p1-win-ia32.msi版本下载,地址http://www.mpich.org/static/downloads/1.4.1p1/ ,下载完成后直接安装,安装过程中使用者那里选择everyone,其他的都默认。
(2) 以管理员的身份运行CMD(命令行),输入MPICH[5]的安装路径来到bin目录下,然后输入 smpd –install -phrase [你的关键字,默认是behappy]。
(3)为了使计算机群能够使用MPI,应该给每一个安装MPI的计算机添加一个相同的账户,账户密码必须相同,账户要求是管理员的身份。比如所有的计算机都添加一个账号为mpi,密码是mpi的用户。
(4)在MPICH的安装目下的bin文件夹中找到wmpiregister.exe,将第二步注册的账户密码添加进去,然后点击确定。
(5)打开wmpiexec,在Application那一栏选择MPICH安装后自带的例子,测试是否安装成功,勾选run in an separate window,点击Execute执行。
4 结语
MPI标准,集成了核心库的语法和语义,其函数库可被Fortran、C调用,形成可移植的信息传递程序。MPI提供了适应各种并行硬件商的基础集,它们都能被有效地实现。这促进了硬件厂商可以基于这一系列底层标准来创建高层次的惯例,从而为分布式内存交互系统提供并行机型。MPI还提供了一个简单易用的可移植接口,极大方便了程序员可以用它在高级机器上进行高性能信息传递操作。但MPI接口标准定义的思想与参数定义的原则秘而不宣,也在一定程度上制约了编程开发技术人员思维的广度、深度与拓展力。
参考文献
[1]周志强,崔国民,杨岭,等.一种基于并行计算的混和算法优化有分流换热网络[J/OL].化工学报:1-20[2021-09-23].http://kns.cnki.net/kcms/detail/11.1946.TQ.20210913.1556.002.html.
[2]李铭,丁卫平,鞠恒荣,等.基于Spark的证据邻域粗糙并行分类高效算法[J].南京理工大学学报,2021,45(4):409-419.
[3] CHANG D, LI L, CHANG Y,et al.Implementation of MapReduce parallel computing framework based on multi-data fusion sensors and GPU cluster[J]. EURASIP Journal on Advances in Signal Processing,2021(1):1-14.
[4]邬江兴,祁晓峰,高彦钊.异构计算并行编程模型综述[J].上海航天(中英文),2021,38(4):1-11.
[5]王如斌,李瑞远,何华均,等.面向海量空间数据的分布式距离连接算法[J/OL].计算机科学:1-10[2021-09-23].http://kns.cnki.net/kcms/detail/50.1075.TP.20210819.1850.054.html.
[6]肖汉,郭宝云,李彩林,等.面向异构架构的传递闭包并行算法[J].计算机工程,2021,47(8):131-139.