MPI

  • 原文MPI:http://baike.baidu.com/link?url=-XUAMycWp5UatunJE-l7Gd4I9MfdQh4j4IvcK0lnN0rvw0RHd_JpWgnzahMe-VIyFF0UtU96BmZiJ5sB24scfKmUBC9j2wL2SJeMOL1BxFm
  • MPI (信息传递接口)

    MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。 主要的MPI-1模型不包括共享内存概念,MPI-2只有有限的分布共享内存概念。 但是MPI程序经常在共享内存的机器上运行。在MPI模型周边设计程序比在NUMA架构下设计要好因为MPI鼓励内存本地化。 尽管MPI属于OSI参考模型的第五层或者更高,他的实现可能通过传输层的sockets和Transmission Control Protocol (TCP)覆盖大部分的层。大部分的MPI实现由一些指定惯例集(API)组成,可由C,C++,Fortran,或者有此类库的语言比如C#, Java or Python直接调用。MPI优于老式信息传递库是因为他的可移植性和速度。

简介

与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可移植性的编程接口

组成

数据类型 定义了精确的数据类型参数而不使用字节计数,以数据类型为单位指定消息的长度;对于C和Fortran,MPI均预定义了一组数据类型和一些附加的数据类型;可以发送 或接收连续的数据,还可以处理不连续的数据;允许发送和接收不同的数据类型[1] 。 通信域 MPICH中的一个通信域定义了一组进程和一个通信的上下文,虚拟处理器拓扑、属性等内容。它以对象形式存在,作为通信操作的附加参数。MPI预定义的通信域:mpi comm world(包含所有进程)、mpi comm self(只包含各个进程自己的进程组)

6个MPI调用接口

1.mpi init()初始化MPI执行环境,建立多个MPI进程之间的联系,为后续通信做准备[1] ; 2.mpi finalize 结束MPI执行环境[1] ; 3.mpi comm rank用来标识各个MPI进程的,给出调用该函数的进程的进程号,返回整型的错误值。两个参数:MPI_Comm类型的通信域,标识参与计算的MPI进程组; &rank返回调用进程中的标识号[1] ; 4.mpi comm size用来标识相应进程组中有多少个进程[1] ; 5.mpi send(buf,counter,datatype,dest,tag,comm): buf:发送缓冲区的起始地址,可以是数组或结构指针;count:非负整数,发送的数据个数;datatype:发送数据的数据类型;dest:整型,目的的进程号;tag:整型,消息标志;comm:MPI进程组所在的通信域[1] 含义:向通信域中的dest进程发送数据,数据存放在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其它消息区别开来[1] 。 6.mpi recv(buf,count,datatype,source,tag,comm,status): source:整型,接收数据的来源,即发送数据进程的进程号; status:MPI_Status结构指针,返回状态信息[1] 。

MPI并行编程

并行编程模式 对等模式—程序的各个部分地位相同,功能和代码基本一致,只是处理的数据或对象不同;主从模式—程序通信进程之间的一种主从或依赖关系[1] 。 点对点通信模式 阻塞—发送完成的数据已经拷贝出发送缓冲区,即发送缓冲区可以重新分配使用,阻塞接受的完成意味着接收数据已经拷贝到接收缓冲区,即接收方已可以使用。非阻塞—在必要的硬件支持下,可以实现计算和通信的重叠。4种通信模式:标准通信模式、缓存通信模式、同步通信模式、就绪通信模式[1] 。 组通信 一个特定组内所有进程都参加全局的数据处理和通信操作[1] 。 功能:通信—组内数据的传输;同步—所有进程在特定的点上取得一致;计算—对给定的数据完成一定的操作[1] 。 类型:1)数据移动:广播(mpi bcast) 收集(mpi gather) 散射(mpi scater)组收集(mpi all gather)全交换(all to all);2)聚集:规约(mpi reduce)将组内所有的进程输入 缓冲区中的数据按,定操作OP进行运算,并将起始结果返回到root进程的接收缓冲区扫描(mpi scan)要求每一个进程对排在它前面的进程进行规约操作,结果存入自身的输出缓冲区;3)同步:路障(mpi barrier)实现通信域内所有进程互相同步,它们将处于等待状态,直到所有进程执行它们各自的MPI-BARRIER调用[1] 。