并行算法讲义 联系客服

发布时间 : 星期日 文章并行算法讲义更新完毕开始阅读d6ac36768e9951e79b8927da

进程 (process): 一个MPI并行程序由一组运行在相同或不同计算机/计算结点上的进程或线程构成;为统一起见,我们将 MPI 程序中一个独立参与通信的个体称为一个进程 在 Unix 系统中,MPI 的进程通常是一个 Unix 进程 在共享内存/消息传递混合编程模式中,一个 MPI 进程可能代表一组 Unix 线程;

进程组 (process group) 指一个 MPI程序的全部进程集合的一个有序子集 进程组中每个进程被赋于一个在该组中唯一的序号 (秩rank),用于在该组中标识该进程,序号的取值范围是0 到进程数-1。

通信器(communicator) 通信器 (也有译成通信子的) 是完成进程间通信的基本环境,它描述了一组可以互相通信的进程以及它们之间的联接关系等信息。 MPI 的所有通信必须在某个通信器中进行。通信器分域内通信器 (lntracommuni cator) 和域间通信器

(lntercommunicator) 两类,前者用于属于同一进程组的进程间的通信,后者用于分属两个不同进程组的进程间的通信。域内通信器 由一个进程组和有关该进程组的进程间的拓扑联接关系构成。

MPI 系统在一个 MPI 程序运行时会自动创建两个通信器,一个称为 MPI_COMM_WORLD,它包含该 MPI 程序中的所有进程,另一个称为MPI_COMM_SELF,它指单个进程自己所构成的通信器.

序号 (rank) 序号用来在一个进程组或通信器中标识一个进程 MPI 程序中的进程由进程组/序号或通信器/序号所唯一确定。 序号是相对于进程组或通信器而言的,同一个进程在不同的进程组或通信器中可以有不同的序号,进程的序号是在进程组或通信器被创建时赋予的。

MPI 系统提供了一个特殊的进程序号 MPI_PROC_NULL,它代表空进程 (不存在的进程)。与MPI_PROC_NULL间的通信实际上没有任何作用。

消息 (message) MPI程序中在进程间传送的数据称为消息。一个消息由通信器、 源地址、目的地址、消息标签和数据构成

通信 (communication): 通信指在进程之间进行消息的收发、 同步等操作。 §2.3 编程模式

SPMD 编程模式: Single Program Multiple Data 的缩写。指构成一个程序的所有进程运行的是同一份可执行代码,不同进程根据自己的序号可能执行该代码中的不同分支。这是 MPI 编程中最常用的编程方式。用户只需要编写 、 维护一份源代码。 11

MPMD 编程模式: Multiple Program Multiple Data的缩写 指构成一个程序的不同进程运行不同的可执行代码 用户需要编写、 维护多份源代码。 主/从编程模式: 英文为Master/Slave。它是 MPMD 编程模式的一个特例,也是 MPMD 编程模式中最常见的方式。构成一个程序的进程之一负责所有进程间的协调及任务调度,该进程称为主进程(Master),其余进程称为从进程 (Slave) 通常用户需要维护两份源代码。 §2.4 MPI函数的一般形式

C:一般形式为

int MPI_Xxxxxx(...)

MPI 的 C 函数名中下划线后笫一个字母大写,其余字母小写 除 MPI_Wtime() 和MPI_Wtick()外,所有 MPI 的 C 函数均返回一个整型错误码,当它等于 MPI_SUCCESS (0)时表示调用成功,否则表示调用中产生了某类错误 Fortran 77::一般形式为

SUBROUTINE MPI_XXXXXX(...., IERR) 除 MPI_WTIME 和 MPI_WTICK 外,Fortran 77 的 MPI 过程全部是 Fortran 77 子程序 (SUBROUTINE),它们与对应的 MPI 的 C 函数同名 (但不区分大小写),参数表除最后多出一个整型参数IERR 用于返回调用错误码及参数的类型不同外,也和 MPI 的 C 函数一样。 §2.5 MPI的原始数据类型

MPI 系统中数据的发送与接收都是基于数据类型进行的 数据类型可以是 MPI 系统预定义的,称为原始数据类型,也可以是用户在原始数据类型的基础上自己定义的数据类型。 MPI 为 Fortran 77 和 C 定义的原始的数据类型在下面两个表格中给出。除表中列出的外,有的MPI 实现可能还提供了更多的原始数据类型,如 MPI_INTEGER2, MPI_LONG_LONG,等等。 § 2.5.1 Fortran 77 原始数据类型 MPI数据类型 MPI_INTEGER MPI_REAL MPI_DOUBLE_PRECISION MPI_COMPLEX MPI_DOUBLE_COMPLEX MPI_LOGICAL MPI_CHARACTER MPI_BYTE MPI_PACKED

12 § 2.5.2 C 原始数据类型 MPI数据类型 MPI_INT MPI_FLOAT MPI_DOUBLE MPI_SHORT MPI_LONG MPI_CHAR MPI_UNSIGNED_CHAR MPI_UNSIGNED_SHORT 对应的C数据类型 int float double short long char unsigned char unsigned short 对应的Fortran77数据类型 INTEGER REAL DOUBLE PRECISION COMPLEX DOUBLE COMPLEX LOGICAL CHARACTER*1 MPI_UNSIGNED MPI_UNSIGNED_LONG MPI_LONG_DOUBLE MPI_BYTE MPI_PACKED unsigned unsigned long long double §2.6 MPI的几个基本函数

本节介绍 MPI 系统的几个基本函数 § 2.6.1 初始化 MPI 系统 C:

int MPI_Init(int *argc, char ***argv)

Fortran 77:

MPI_INIT(IERR) INTEGER IERR

初始化 MPI 系统 通常它应该是笫一个被调用的 MPI 函数 除 MPI_Initialized 外,其它所有MPI 函数仅在调用了该函数后才可以被调用。

在 C 接口中,MPI 系统通过 argc 和 argv 得到命令行参数,并且会将其中 MPI 系统专用的参数删除,而仅留下供用户程序解释的参数。 § 2.6.2 检测 MPI 系统是否己经初始化 C

int MPI_Initialized(int *flag)

Fortran 77

MPI_INITIALIZED(FLAG, IERR) LOGICAL FLAG INTEGER IERR

如果已经调用过MPI_Init 则返回flag = true,否则返回 flag = false。这是唯一可以在MPI_Init之前调用的函数。

13 § 2.6.3 得到通信器的进程数及进程在通信器中的序号 C

int MPI_Comm_size(MPI_Comm comm, int *size) int MPI_Comm_rank(MPI_Comm comm, int *rank)

Fortran 77

MPI_COMM_SIZE(COMM, SIZE, IERR) INTEGER COMM, SIZE, IERR

MPI_COMM_RANK(COMM, RANK, IERR) INTEGER COMM, RANK, IERR

上述两个函数分别返回指定通信器中的进程数及本进程在该通信器中的序号

§ 2.6.4 退出 MPI 系统 C

int MPI_Finalize(void)

Fortran 77

MPI_FINALIZE(IERR) INTEGER IER

退出 MPI 系统。所有 MPI 进程在正常退出前都必须调用该函数,它是 MPI 程序中最后一个被调用的 MPI 函数 调用int MPI_Finalize后不允许再调用任何 MPI 函数。用户在调用该函数前应该确认所有的 (非阻塞) 通信均已完成。 § 2.6.5 异常终止 MPI 程序的执行 C

int MPI_Abort(MPI_Comm comm, int errorcode)

Fortran 77

MPI_ABORT(COMM, ERRORCODE, IERR) INTEGER COMM, ERRORCODE, IERR

调用该函数时表明因为出现了某种致命错误而希望异常终止 MPI 程序的执行。MPI 系统会尽量设法终止通信器 comm 中的所有进程。 在 Unix 系统环境中,errcode 被作为进程的退出码 (exitcode)返回给操作系统。 § 2.6.6 查询处理器名称 C

int MPI_Get_processor_name(char *name, int *resultlen)

Fortran 77

MPI_GET_PROCESSOR_NAME( NAME, RESULTLEN, IERR) CHARACTER*(*) NAME

INTEGER RESULTLEN, IERR

14

该函数在name 中返回进程所在的处理器的名称,参数 name 应该提供不少于MPI_MAX_PROCESSOR_NAME个字节的存储空间用于存放处理器名称。 § 2.6.7 获取墙上时间及时钟精度 C

double MPI_Wtime(void) double MPI_Wtick(void)

Fortran 77

DOUBLE PRECISION FUNCTION MPI_WTIME() DOUBLE PRECISION MPI_WTICK()

MPI_WTIME 返回当前墙上时间,以从某一固定时刻算起的秒数为单位。而 M