MPI并行编程

MPI

$1 概述

参考老师PPT,加粗部分即为重点内容。

MPI是一个跨语言(编程语言如C, Fortran等)的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可移植性的编程接口。

Ref.:

MPI Tutorial Introduction - Wes Kendall

$2 MPI基本函数

MPI调用接口的总数虽然庞大, 但根据实际编写MPI的经验, 常用的MPI调用的个数却十分有限。

下面是6个最基本的MPI函数。

  1. MPI_Init(…);
  2. MPI_Comm_size(…);
  3. MPI_Comm_rank(…);
  4. MPI_Send(…);
  5. MPI_Recv(…);
  6. MPI_Finalize();

$2.1 MPI_Init(int* argc, char** argv[])

  • 该函数通常应该是第一个被调用的MPI函数用于并行环境初始化,其后面的代码到 **MPI_Finalize()**函数之前的代码在每个进程中都会被执行一次。
  • 除**MPI_Initialized()**外, 其余所有的MPI函数应该在其后被调用。
  • MPI系统将通过argc, argv得到命令行参数(也就是说main函数必须带参数,否则会出错)。

$2.2 MPI_Finalize(void)

  • 退出MPI系统, 所有进程正常退出都必须调用。 表明并行代码的结束,结束所有子进程。
  • 串行代码仍可在主进程(rank = 0)上运行, 但不能再有MPI函数(包括MPI_Init())。

$2.3 MPI_Comm_size(MPI_Comm comm, int* size )

  • 获得进程个数 size。
  • 指定一个通信子,也指定了一组共享该空间的进程, 这些进程组成该通信子的group(组)。
  • 获得通信子comm中规定的group包含的进程的数量。

$2.4 MPI_Comm_rank (MPI_Comm comm, int* rank)

  • 得到本进程在通信空间中的rank值,即在组中的逻辑编号(该 rank值为0到p-1间的整数,相当于进程的ID

$2.5 MPI_Send(...)

int MPI_Send(void *buff, int count, MPI_Datatype datatype, 	// 消息数据
             int dest, int tag, MPI_Comm comm)				// 消息信封
  • void *buff:发送缓冲区。
  • int count:要发送的消息个数(注意:不是长度,例如你要发送一个int整数,这里就填写1,如要是发送“hello”字符串,这里就填写6(C语言中字符串未有一个结束符,需要多一位))。
  • MPI_Datatype datatype:要发送的数据类型,这里需要用MPI定义的数据类型,可在网上找到,在此不再罗列。
  • int dest:目的地进程号,你要发送给哪个进程,就填写目的进程的进程号。
  • int tag:消息标签,接收方需要有相同的消息标签才能接收该消息。
  • MPI_Comm comm:通讯域。表示你要向哪个组发送消息。

$2.6 MPI_Recv(...)

int MPI_Recv(void *buff, int count, MPI_Datatype datatype,
             int source, int tag, MPI_Comm comm,
             MPI_Status *status)
  • void *buff:接收缓冲区。
  • int count:接收数据长度的上界。具体接收到的长度可通过调用MPI_Get_count函数得到。
  • MPI_Datatype datatype:你要接收的数据类型,这里需要用MPI定义的数据类型,可在网上找到,在此不再罗列。
  • int dest:接收端进程号,你要需要哪个进程接收消息就填写接收进程的进程号。
  • int tag:消息标签,需要与发送方的tag值相同的消息标签才能接收该消息。
  • MPI_Comm comm:通讯域。
  • MPI_Status *status:消息状态。接收函数返回时,将在这个参数指示的变量中存放实际接收消息的状态信息,包括消息的源进程标识,消息标签,包含的数据项个数等

$3 MPI消息数据类型

$3.1 定义

​ 每个MPI消息都有相应的数据类型,MPI通过引入消息数据类型来解决消息传递过程中的异构性问题以及数据不连续问题。MPI的消息数据类型可以分为两种: 预定义数据类型派生数据类型 (Derived Data Ty

中文版mpi编程手册 写得很详细 都志辉编著 李三立审阅 陈渝刘鹏 校对 本书介绍目前最常见的并行程序—MPI并行程序的设计方法它适合高校三四年级本科 生非计算机专业研究生作为教材和教学自学参考书也适合于广大的并行计算高性能计 算用户作为自学参考书使用对于有FORTRAN和C编程经验的人员都可以阅读并掌握 本书的内容 首先介绍了并行程序设计的基础提供给读者进行并行程序设计所需要的基本知识然 后介绍了MPI的基本功能从简单的例子入手告诉读者MPI程序设计的基本过程和框架 这一部分是具有C或/FORTRAN串行程序设计经验的人员很容易理解和接受的接下来介绍 MPI程序设计的高级特征是已经掌握了MPI基本程序设计的人员进一步编写简洁高效的 MPI程序使用各种高级和复杂的MPI功能所需要的最后一部分介绍了MPI的最新发展和 扩充MPI-2 主要包括三个部分动态进程管理远程存储访问和并行文件读写 本书包括了MPI-1的全部调用和MPI-2的关键扩充部分的调用并附以大量的图表和示 例性程序对程序的关键部分给出了讲解或注释读者若能将例子和对MPI调用的讲解结合 起来学习会取得更好的效果 本书的目的不仅是教给读者如何去编写从简单到复杂的MPI并行程序更重要的是 希望在学习本书之后在读者以后解决问题的过程中能够树立并行求解的概念使并行方 法真正成为广大应用人员和程序开发员手中的重要工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值