MPI并行编程入门

合集下载

并行计算_实验三_简单的MPI并行程序及性能分析

并行计算_实验三_简单的MPI并行程序及性能分析

并行计算_实验三_简单的MPI并行程序及性能分析一、实验背景和目的MPI(Massive Parallel Interface,大规模并行接口)是一种用于进行并行计算的通信协议和编程模型。

它可以使不同进程在分布式计算机集群上进行通信和协同工作,实现并行计算的目的。

本实验将设计和实现一个简单的MPI并行程序,并通过性能分析来评估其并行计算的效果。

二、实验内容1.设计一个简单的MPI并行程序,并解决以下问题:a.将一个矩阵A进行分块存储,并将其均匀分配给不同的进程;b.将每个进程分别计算所分配的矩阵块的平均值,并将结果发送给主进程;c.主进程将收到的结果汇总计算出矩阵A的平均值。

2.运行该MPI程序,并记录下执行时间。

3.对程序的性能进行分析:a.利用不同规模的输入数据进行测试,观察程序的运行时间与输入规模的关系;b. 使用mpiexec命令调整进程数量,观察程序的运行时间与进程数量的关系。

三、实验步骤1.程序设计和实现:a.设计一个函数用于生成输入数据-矩阵A;b.编写MPI并行程序的代码,实现矩阵块的分配和计算;c.编写主函数,调用MPI相应函数,实现进程间的通信和数据汇总计算。

2.编译和运行程序:a.使用MPI编译器将MPI并行程序编译成可执行文件;b.在集群上运行程序,并记录下执行时间。

3.性能分析:a.对不同规模的输入数据运行程序,记录下不同规模下的运行时间;b. 使用mpiexec命令调整进程数量,对不同进程数量运行程序,记录下不同进程数量下的运行时间。

四、实验结果和分析执行实验后得到的结果:1.对不同规模的输入数据运行程序,记录下不同规模下的运行时间,得到如下结果:输入规模运行时间100x1002.345s200x2005.678s300x30011.234s...从结果可以看出,随着输入规模的增加,程序的运行时间也相应增加。

2. 使用mpiexec命令调整进程数量,对不同进程数量运行程序,记录下不同进程数量下的运行时间,得到如下结果:进程数量运行时间110.345s26.789s43.456s...从结果可以看出,随着进程数量的增加,程序的运行时间逐渐减少,但当进程数量超过一定限制后,进一步增加进程数量将不再显著减少运行时间。

MPI并行程序设计实例教程教学设计

MPI并行程序设计实例教程教学设计

MPI并行程序设计实例教程教学设计1. 简介MPI (Message Passing Interface) 是一种进程间通信的标准,可用于实现并行计算。

MPI 是一个库,通过对 MPI 中的函数调用,可实现在共享内存和分布式内存计算机中实现并行计算的任务分割和进程通信。

在实际应用中,MPI 会被和多线程一样用于实现算法的并行化,从而提高计算效率和运行速度。

2. 教学目标通过这个实例教程,我们会:1.了解 MPI 并行程序设计的基本概念和原理2.学会使用 MPI 的基本函数和指令3.学会通过实例演示的方式,掌握常见的 MPI 算法和技术4.实现一个简单的 MPI 并行程序,对其进行测试和优化,提高程序的执行效率3. 教学计划本教程共计 5 个部分,每个部分涵盖不同的内容。

每个部分的内容和学习目标如下:第一部分:MPI 基础概念和原理本部分的目标是让学生了解 MPI 的概念、原理和应用场景。

通过课堂讲授、案例分析和问题解答等方式,使学生领悟 MPI 的并行计算模型和通信方式。

第二部分:MPI 基本函数和指令本部分的目标是让学生掌握 MPI 中的基本函数和指令,理解其使用方法和调用方式。

通过讲解 MPI_Init、MPI_Comm_size、MPI_Comm_rank 等函数和指令,让学生能够熟练使用 MPI 构建并行程序。

第三部分:MPI 并行算法实例本部分的目标是让学生通过具体实例学习 MPI 并行算法设计的方法和技巧。

通过案例分析的方式,让学生了解 MPI 算法设计的核心思想、主要步骤和注意事项。

同时,本部分还会介绍一些常见的 MPI 库和工具,如 MPIBLAST 和 OpenMPI。

第四部分:MPI 程序设计和优化本部分的目标是让学生实践 MPI 代码的编写、调试和优化过程。

通过一个综合实例,让学生学习 MPI 并行程序的设计、实现和测试。

同时,本部分还会讲授MPI 排序算法和负载平衡算法的具体实现方法。

OpenMP+MPI混合并行编程

OpenMP+MPI混合并行编程

H a r b i n I n s t i t u t e o f T e c h n o l o g y并行处理与体系结构实验报告实验题目: OpenMP+MPI混合并行编程院系:计算机科学与技术姓名:学号:实验日期: 2011-12-25哈尔滨工业大学实验四:OpenMP+MPI混合并行编程一、实验目的1、复习前几次实验的并行机制,即OpenMP与MPI编程模式。

2、掌握OpenMP与MPI混合并行编程模式。

二、实验内容1、使用OpenMP+MPI混合编程并与OpenMP、MPI单独编程的比较。

在OpenMp并行编程中,主要针对细粒度的循环级并行,主要是在循环中将每次循环分配给各个线程执行,主要应用在一台独立的计算机上;在MPI并行编程中,采用粗粒度级别的并行,主要针对分布式计算机进行的,他将任务分配给集群中的所有电脑,来达到并行计算;OpenMp+MPI混合编程,多台机器间采用MPI分布式内存并行且每台机器上只分配一个MPI进程,而各台机器又利用OpenMP进行多线程共享内存并行。

2、分析影响程序性能的主要因素。

在采用OpenMP实现的并行程序中,由于程序受到计算机性能的影响,不能大幅度的提高程序运行速度,采用了集群的MPI并行技术,程序被放到多台电脑上运行,多台计算机协同运行并行程序,但是,在集群中的每台计算机执行程序的过程又是一个执行串行程序的过程,因此提出的OpenMP+MPI技术,在集群内采用MPI技术,减少消息传递的次数以提高速度,在集群的每个成员上又采用OpenMP技术,节省内存的开销,这样综合了两种并行的优势,来提升并行程序的执行效率。

三、实验原理OpenMP编程:使用Fork-Join的并行执行模式。

开始时由一个主线程执行程序,该线程一直串行的执行,直到遇到第一个并行化制导语句后才开始并行执行。

含义如下:①Fork:主线程创建一队线程并行执行并行域中的代码;②Join:当各线程执行完毕后被同步或中断,最后又只有主线程在执行。

MPI用户手册

MPI用户手册

神威Ⅰ计算机系统MPI培训手册国家并行计算机工程技术研究中心二零零零年八月目录第一章MPI简介 (1)1.1 名词解释 (2)1.1.1 分布式内存 (2)1.1.2 消息传输 (2)1.1.3 进程 (2)1.1.4 消息传递库 (2)1.1.5 发送/ 接收 (3)1.1.6 同步/ 异步 (3)1.1.7 阻塞通讯 (3)1.1.8 非阻塞通讯 (3)1.1.9 应用程序缓冲区 (3)1.1.10 系统缓冲区 (4)1.2 MPI环境简介 (4)1.2.1 头文件 (4)1.2.2 MPI调用格式 (4)1.2.3 一般MPI程序结构 (5)1.2.4 通信因子和组 (5)1.2.5 秩 (5)第二章MPI环境管理调用 (6)2.1 函数调用 (6)2.1.1 MPI_Init (6)2.1.2 MPI_Comm_size (6)2.1.3 MPI_Comm_rank (6)2.1.4 MPI_Abort (6)2.1.5 MPI_Get_processor_name (6)2.1.6 MPI_Initialized (7)2.1.7 MPI_Wtime (7)2.1.8 MPI_Wtick (7)2.1.9 MPI_Finalize (7)2.2 MPI环境管理例子 (7)2.2.1 C 语言例子: (7)2.2.2 Fortran语言例子 (8)第三章点对点通信函数 (9)3.1 参数说明 (9)3.1.1 MPI消息传递函数参数 (9)3.1.2 缓冲区(buffer) (9)3.1.3 数据个数(count) (9)3.1.4 数据类型(type) (9)3.1.5 目的地(dest) (10)3.1.6 源(source) (10)3.1.7 标识符(tag) (10)3.1.8 通信因子(comm) (10)3.1.10 请求(request) (10)3.2 阻塞消息通信函数 (11)3.2.1 MPI_Send (11)3.2.2 MPI_Recv (11)3.2.3 MPI_Ssend (11)3.2.4 MPI_Bsend (11)3.2.5 MPI_Buffer_attach、MPI_Buffer_detach (11)3.2.6 MPI_Rsend (12)3.2.7 MPI_Sendrecv (12)3.2.8 MPI_Wait、MPI_Waitany、MPI_Waitall、MPI_Waitsome (12)3.2.9 MPI_Probe (12)3.3 阻塞消息传递例子 (13)3.3.1 C 程序例子 (13)3.3.2 Fortran 程序例子 (14)3.4 非阻塞消息通信函数 (15)3.4.1 MPI_Isend (15)3.4.2 MPI_Irecv (15)3.4.3 MPI_Issend (15)3.4.4 MPI_Ibsend (15)3.4.5 MPI_Irsend (15)3.4.6 MPI_Test 、MPI_Testany 、MPI_Testall 、MPI_Testsome (16)3.4.7 MPI_Iprobe (16)3.5 非阻塞消息传递例子 (17)3.5.1 C 语言例子 (17)3.5.2 Fortran 语言例子 (18)第四章集合通信函数 (19)4.1 集合通信函数 (19)4.1.1 MPI_Barrier (19)4.1.2 MPI_Bcast (19)4.1.3 MPI_Scatter (20)4.1.4 MPI_Gather (20)4.1.5 MPI_Allgather (21)4.1.6 MPI_Reduce (21)4.1.7 MPI_Allreduce (22)4.1.8 MPI_Reduce_scatter (22)4.1.9 MPI_Alltoall (22)4.1.10 MPI_Scan (22)4.2 集合通信操作例子 (24)4.2.1 C 语言例子 (24)4.2.2 Fortran 语言例子 (25)4.2.3 例子输出结果: (25)第五章派生数据类型 (26)5.1 派生数据类型函数: (26)5.1.2 MPI_Type_vector 、MPI_Type_hvector (27)5.1.3 MPI_Type_indexed 、MPI_Type_hindexed (27)5.1.4 MPI_Type_struct (28)5.1.5 MPI_Type_extent (28)5.1.6 MPI_Type_commit (28)5.2 连续数据类型的例子 (28)5.2.1 C 语言例子 (29)5.2.2 Fortran 语言例子 (30)5.2.3 例子输出结果: (31)5.3 向量派生数据类型例子 (31)5.3.1 C 语言例子 (31)5.3.2 Fortran 语言例子 (32)5.3.3 程序输出结果: (33)5.4 索引派生数据类型例子 (34)5.4.1 C 语言例子 (34)5.4.2 Fortran 语言例子 (35)5.4.3 例子输出结果: (36)5.5 结构派生数据类型例子 (37)5.5.1 C 语言例子 (37)5.5.2 Fortran 语言例子 (38)5.5.3 例子输出结果: (40)第六章组和通信因子管理函数 (41)6.1 组和通信因子管理函数 (42)6.1.1 MPI_Comm_group (42)6.1.2 MPI_Group_rank (42)6.1.3 MPI_Group_size (42)6.1.4 MPI_Group_excl (42)6.1.5 MPI_Group_incl (42)6.1.6 MPI_Group_intersection (42)6.1.7 MPI_Group_union (43)6.1.8 MPI_Group_difference (43)6.1.9 MPI_Group_compare (43)6.1.10 MPI_Group_free (43)6.1.11 MPI_Comm_create (43)6.1.12 MPI_Comm_dup (43)6.1.13 MPI_Comm_compare (44)6.1.14 MPI_Comm_free (44)6.2 组和通信因子管理函数运用例子 (44)6.2.1 C 语言例子 (44)6.2.2 Fortran 语言例子 (45)6.2.3 例子结果输出: (46)第七章虚拟拓扑 (47)7.1 虚拟拓扑函数 (47)7.1.2 MPI_Cart_create (47)7.1.3 MPI_Cart_get (47)7.1.4 MPI_Cart_map (47)7.1.5 MPI_Cart_rank (47)7.1.6 MPI_Cart_shift (48)7.1.7 MPI_Cart_sub (48)7.1.8 MPI_Cartdim_get (48)7.1.9 MPI_Dims_create (48)7.1.10 MPI_Graph_create (48)7.1.11 MPI_Graph_get (49)7.1.12 MPI_Graph_map (49)7.1.13 MPI_Graph_neighbors (49)7.1.14 MPI_Graphdims_get (49)7.1.15 MPI_Topo_test (49)7.2 笛卡儿虚拟拓扑例子 (49)7.2.1 C语言例子 (50)7.2.2 Fortran 语言例子 (51)7.2.3 例子输出结果: (52)第八章与机器相关的MPI环境 (53)8.1 新增的与机器相关的MPI调用 (53)8.1.1 取进程ID号 (53)8.1.2 取当前进程所处的逻辑PE号 (53)8.1.3 取系统长时钟(以ms为单位的值) (53)8.1.4 初始化节点共享空间 (53)8.1.5 取节点共享空间 (54)8.1.6 初始化分布共享空间 (54)8.1.7 取分布共享空间 (54)8.2 神威MPI版本的安装 (54)8.3 神威MPI用户程序的编译、连接与运行 (55)8.3.1 主机MPI版本用户程序的编译、连接与运行 (55)8.3.2 前端机MPI版本用户程序的编译、连接与运行 (56)8.4 例子 (56)8.4.1 例子一 (56)8.4.2 例子二(节点共享例子) (57)8.4.3 例子三(一个简单的串行程序转换为并行程序) (59)8.4.4 例子四(一个计算PI的并行程序) (62)第一章MPI简介MPI(Message Passing Interface )是1994年5月发布的一种消息传递接口。

MPI使用操作流程

MPI使用操作流程

《mpi使用操作流程》xx年xx月xx日contents •MPI介绍•MPI安装与配置•MPI基本使用方法•MPI并行文件IO操作•MPI并行计算实例•MPI错误处理与调试目录01 MPI介绍Multiple Processor Interface:一种并行计算编程模型,用于多处理器或多线程并行计算。

Message Passing Interface:一种消息传递编程模型,用于分布式或并行计算系统中的进程间通信。

MPI含义MPI标准由美国Argonne国家实验室开发,成为并行计算领域的重要工具。

1993年MPI-2标准发布,增加了对异步通信和动态进程管理的支持。

1997年MPI-3标准发布,优化了并行计算性能和可扩展性。

2008年MPI发展历程MPI应用场景并行数据库MPI可以用于并行数据库系统中的数据分发和通信,提高数据处理速度和效率。

并行图处理MPI可以用于大规模图处理中的并行计算,提高图算法的效率和速度。

高性能计算MPI是高性能计算中常用的并行计算编程模型,被广泛应用于天气预报、物理模拟、数据分析等领域。

02MPI安装与配置确认操作系统版本和支持的MPI版本准备MPI安装所需组件和工具确认网络连接和远程访问能力下载对应版本的MPI安装包解压缩MPI安装包执行安装脚本,如`.bin/install.sh`等待安装过程完成,不要手动中断按照提示进行下一步操作,如选择安装路径、配置环境变量等MPI配置步骤进入MPI安装目录下的`etc`子目录编辑`mpd.conf`文件,配置MPI守护进程的参数配置MPI启动脚本,如`mpd.sh`、`mpdstart.sh`等设置启动脚本属性为可执行,如`chmod +x mpd.sh`使用启动脚本启动MPI守护进程,如`./mpd.sh &`确认MPI守护进程是否成功启动,可以使用`ps -ef |grep mpd`命令查看进程状态03MPI基本使用方法MPI运行环境设置安装MPI选择适合的MPI版本并按照说明进行安装。

mpi程序编译运行指令

mpi程序编译运行指令

mpi程序编译运行指令MPI(Message Passing Interface)是一种用于并行计算的编程模型。

下面将介绍MPI程序的编译和运行指令。

编译MPI程序通常需要使用MPI编译器,常见的MPI编译器有MPICH、OpenMPI等。

在编译MPI程序之前,需要确保已经正确安装了MPI编译器和相关的库文件。

编译MPI程序的指令通常为:```mpiicc -o program program.c```其中,`mpiicc`是MPI编译器的命令,`-o program`指定输出的可执行文件名为`program`,`program.c`是要编译的MPI程序源代码文件。

运行MPI程序的指令通常为:```mpiexec -n <进程数> ./program```其中,`mpiexec`是MPI程序运行的命令,`-n <进程数>`指定运行时的进程数,`./program`指定要运行的MPI可执行文件。

在MPI程序中,可以使用MPI库中的函数来实现进程间的通信和协调。

常用的MPI函数包括`MPI_Init`、`MPI_Finalize`、`MPI_Comm_size`、`MPI_Comm_rank`、`MPI_Send`、`MPI_Recv`等。

这些函数可以实现进程的初始化、获取进程数和进程编号、发送和接收消息等功能。

MPI程序的运行流程一般为:1. 所有进程调用`MPI_Init`进行初始化。

2. 调用`MPI_Comm_size`获取进程总数,调用`MPI_Comm_rank`获取当前进程编号。

3. 根据进程编号的不同,执行不同的代码逻辑。

4. 进程间需要通信时,使用`MPI_Send`和`MPI_Recv`进行消息的发送和接收。

5. 所有进程执行完毕后,调用`MPI_Finalize`进行清理工作。

MPI程序的并行计算模型是基于消息传递的,即进程之间通过发送和接收消息来实现数据的交换和协同计算。

c语言mpi并行计算矩阵乘法

c语言mpi并行计算矩阵乘法

c语言mpi并行计算矩阵乘法
C语言中的MPI(Message Passing Interface)是一种用于编写并行程序的标准,它允许多个进程在不同的计算节点上进行通信和协作。

矩阵乘法是一个经典的并行计算问题,可以通过MPI来实现并行化。

首先,我们需要将矩阵乘法的计算任务分配给不同的进程。

可以将两个矩阵分别分块,然后将这些块分配给不同的进程。

每个进程负责计算其分配到的部分,并将结果发送回主进程。

在C语言中,可以使用MPI库来实现这一过程。

首先,需要初始化MPI环境,并确定每个进程的编号和总进程数。

然后,主进程可以负责将矩阵分块并发送给其他进程,其他进程则接收并进行计算。

计算完成后,结果可以发送回主进程,由主进程进行汇总。

需要注意的是,在并行计算中,需要考虑数据通信的开销以及负载均衡等问题。

合理地分配任务和减少通信开销是并行计算中需要考虑的重要问题。

另外,还可以考虑使用一些优化技术来提高并行矩阵乘法的性
能,比如使用非阻塞通信、优化数据布局以减少通信量、使用多级并行等技术。

总之,使用C语言和MPI实现矩阵乘法的并行计算需要考虑任务分配、数据通信、性能优化等多个方面,需要综合考虑并合理设计并行算法。

并行编程——MPIOPENMP混合编程

并行编程——MPIOPENMP混合编程

并⾏编程——MPIOPENMP混合编程在⼤规模节点间的并⾏时,由于节点间通讯的量是成平⽅项增长的,所以带宽很快就会显得不够。

所以⼀种思路增加程序效率线性的⽅法是⽤MPI/OPENMP混合编写并⾏部分。

这⼀部分其实在了解了MPI和OPENMP以后相对容易解决点。

⼤致思路是每个节点分配1-2个MPI进程后,每个MPI进程执⾏多个OPENMP线程。

OPENMP部分由于不需要进程间通信,直接通过内存共享⽅式交换信息,不⾛⽹络带宽,所以可以显著减少程序所需通讯的信息。

Fortran:Program hellouse mpiuse omp_libImplicit NoneInteger :: myid,numprocs,rc,ierrInteger :: i,j,k,tidCall MPI_INIT(ierr)Call MPI_COMM_RANK(MPI_COMM_WORLD,myid,ierr)Call MPI_COMM_SIZE(MPI_COMM_WORLD,numprocs,ierr)!$OMP Parallel private(tid)tid=OMP_GET_THREAD_NUM()write(*,*) 'hello from',tid,'of process',myid!$OMP END PARALLELCall MPI_FINALIZE(rc)StopEnd Program helloC++:# include <cstdlib># include <iostream># include <ctime># include "mpi.h"# include "omp.h"using namespace std;int main ( int argc, char *argv[] );//****************************************************************************80int main ( int argc, char *argv[] ){int myid;int nprocs;int this_thread;MPI::Init();myid=MPI::COMM_WORLD.Get_rank();nprocs=MPI::COMM_WORLD.Get_size();#pragma omp parallel private(this_thread){this_thread=omp_get_thread_num();cout <<this_thread<<" thread from "<<myid<<" is ok\n";}MPI::Finalize();return0;}这⾥值得要注意的是,似乎直接⽤mpif90/mpicxx编译的库会报错,所以需要⽤icc -openmp hello.cpp -o hello -DMPICH_IGNORE_CXX_SEEK -L/Path/to/mpi/lib/ -lmpi_mt -lmpiic -I/path/to/mpi/include其中-DMPICH_IGNORE_CXX_SEEK为防⽌MPI2协议中⼀个重复定义问题所使⽤的选项,为了保证线程安全,必须使⽤mpi_mt库对于intel的mpirun,必须在mpirun后加上-env I_MPI_PIN_DOMAIN omp使得每个mpi进程会启动openmp线程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 进程序号(rank) 用来在一个进程组或通信器中标识一个进程
– MPI 程序中的进程由进程组或通信器序号唯一确定, 序号相对于进 程组或通信器而言(假设np个处理器,标号0…np-1)
– 同一个进程在不同的进程组或通信器中可以有不同的序号,进程的序 号是在进程组或通信器被创建时赋予的
– MPI 系统提供了一个特殊的进程序号MPI_PROC_NULL,它代表空 进程(不存在的进程), 与MPI_PROC_NULL 间的通信实际上没有任 何作用
会把MPI系统专用的参数删除,留下用户的解释参数
MPI几个基本函数
• 检测 MPI 系统是否已经初始化 C:
int MPI_Initialized(int *flag)
Fortran 77:
MPI_INIT(FLAG,IERROR) LOGICAL FLAG INTEGER IERROR
• 唯一可在 MPI_Init 前使用的函数 • 已经调用MPI_Init,返回flag=true,否则flag=false
进程与消息传递
• 包含于通过网络联接的不同处理器的多个进程
– 进程独立存在,并位于不同的处理器,由各自独立的操作系统调度,享 有独立的CPU和内存资源
– 进程间相互信息交换,可依靠消息传递 – 最基本的消息传递操作包括发送消息send、接受消息receive、进程同
步barrier、归约reduction等
}
MPI几个基本函数
• Index
– MPI_Init – MPI_Initialized – MPI_Comm_size – MPI_Comm_rank – MPI_Finalize – MPI_Abort – MPI_Get_processor_name – MPI_Get_version – MPI_Wtime
MPI重要概念
• 进程组(process group) 指MPI 程序的全部进程集合的一个有序
子集且进程组中每个进程被赋于一个在该组中唯一的序号(rank), 用于 在该组中标识该进程。序号的取值范围是[0,进程数- 1]
• 通信器(communicator)
– 理解为一类进程的集合即一个进程组,且在该进程组,进程间可以 相互通信
{
int np, rank, ierr;
ierr = MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD,&rank);
MPI_Comm_size(MPI_COMM_WORLD,&np);
/*
Do Some Works
*/
ierr = MPI_Finalize();
• What is the message?
DATA+ENVELOPE
• MPI的目标 – 较高的通信性能 – 较好的程序可移植性 – 强大的功能
消息传递平台MPI
• MPI的产生 – 1992-1994年,MPI 1.1版本问世 – 1995-1997年,MPI 2.0版本出现 • 扩充并行I/O • 远程存储访问 • 动态进程管理等
消息传递平台MPI
• MPI程序编译与运行
– 程序编译
C:
%mpicc -o mpiprog mpisrc.c
Fortran 77: %mpif77 -o mpiprog mpisrc.f
– 程序运行
%mpirun -np 4 mpiprog
•程序执行过程中不能动态改变进程的个数 •申请的进程数np与实际处理器个数无关
MPI_LOGICAL
LOGICAL
MPI_CHARACTER
CHARACTER(1)
MPI_BYTE
MPI_PACKED
MPI程序基本结构
MPI include file
变量定义
MPI 环境初始化 执行程序 进程间通信
退出 MPI 环境
#include <mpi.h>
void main (int argc, char *argv[])
• 若 mpi 版本号为2.0,则返回的version=2,subversion=0机内多个进程 – 多个进程可同时存在于单机内同一操作系统。操作系统负责 调度分时共享处理机资源(CPU、内存、存储、外设等) – 进程间相互独立(内存空间不相交)。在操作系统调度下各 自独立地运行,例如多个串行应用程序在同一台计算机运行 – 进程间可以相互交换信息。例如数据交换、同步等待,消息 是这些交换信息的基本单位,消息传递是指这些信息在进程 间的相互交换,是实现进程间通信的唯一方式
MPI几个基本函数
• 初始化 MPI 系统 C:
int MPI_Init(int *argc, char *argv[])
Fortran 77:
MPI_INIT(IERROR) INTEGER IERROR
• 通常为第一个调用的MPI函数,除 MPI_Initialized 外 • 在C接口中,MPI系统通过argc和argv得到命令行参数,并且
MPI_BYTE 一个字节 MPI_PACKED 打包数据
MPI原始数据类型
MPI Datatype
Fortran Datatype
MPI_INTEGER
INTEGER
MPI_REAL
REAL
MPI_DOUBLE_PRECISION DOUBLE PRECISION
MPI_COMPLEX
COMPLEX
MPI_COMM_RANK(COMM, RANK, IERROR) INTEGER COMM, RANK, IERROR
MPI几个基本函数
• 退出 MPI 系统 C:
int MPI_Finalize(void)
Fortran 77:
MPI_FINALIZE(IERROR)
• 每个进程都必须调用,使用后不准许调用任何MPI函数 • 若不执行MPI退出函数,进程可能被悬挂 • 用户在调用该函数前,应确保非阻塞通讯结束
• 消息(message)
– 分为数据(data)和包装(envelope)两个部分 – 包装由接收进程序号/发送进程序号、消息标号和通信器三部分组成;
数据包含用户将要传递的内容
MPI重要概念
• MPI 对 象 MPI 系 统 内部 定 义 的 数 据 结 构 , 包 括 数 据 类 型 ( 如 MPI_INT)、通信器(MPI_Comm)、通信请求(MPI_Request) 等,它们对用户不透明。在FORTRAN语言中,所有MPI对象均必须 说明为“整型变量INTEGER” 。
– 整型错误码由函数值返回 – 除MPI_Wtime() 和MPI_Wtick()外, 所有MPI 的C 函数均返回一个整型
错误码。成功时返回MPI_SUCCESS,其他错误代码依赖于执行
Fortran 77 : CALL MPI_XXXXX(parameter,...,IERROR)
– 整型错误码由函数的参数返回 – 除MPI_WTIME() 和MPI_WTICK()外为子函数程序(function),
MPI几个基本函数
• 异常终止MPI程序 C:
int MPI_Abort(MPI_Comm comm, int errorcode)
Fortran 77:
MPI_ABORT(COMM, ERRORCODE, IERROR) INTEGER COMM, ERRORCODE, IERROR
• 在出现了致命错误而希望异常终止MPI程序时执行 • MPI系统会设法终止comm通信器中所有进程 • 输入整型参数errorcode,将被作为进程的退出码返回给系统
MPI几个基本函数
• 获取处理器的名称 C:
int MPI_Get_processor_name(char *name, int *resultlen)
Fortran 77:
MPI_GET_PROCESSOR_NAME(NAME, RESULTLEN, IERR) CHARACTER *(*) NAME INTEGER RESULTLEN, IERROR • 在返回的name中存储所在处理器的名称 • resultlen存放返回名字所占字节 • 应提供参数name不少于MPI_MAX_PRCESSOR_NAME个字
MPI几个基本函数
• 得到通信器的进程数和进程在通信器中的标号 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, IERROR) INTEGER COMM, SIZE, IERROR
节的存储空间
MPI几个基本函数
• 获取 MPI 版本号 C:
int MPI_Get_version(int *version, int *subversion)
Fortran 77:
MPI_GET_VERSION(VERSION,SUBVERSION,IERR) INTEGER VERSION, SUBVERSION, IERROR
– 任何MPI通信函数均必须在某个通信器内发生 – MPI系统提供省缺的通信器MPI_COMM_WORLD,所有启动的MPI
进程通过调用函数MPI_Init()包含在该通信器内;各进程通过函数 MPI_Comm_size()获取通信器包含的(初始启动)的MPI进程个数 – 组内通信器和组间通信器
MPI重要概念
• MPI联接器(handles) 联接MPI对象的具体变量,用户可以通过 它访问和参与相应MPI对象的具体操作。例如,MPI系统内部提供的 通信器MPI_COMM_WORLD。在FORTRAN语言中,所有MPI联接 器均必须说明为“整型变量INTEGER”
相关文档
最新文档