版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于国产众核服务器的高性能集群MPI 用户手册2013 年 11 月目录第一章 MPI 简介11.1消息传递编程的相关概念21.1.11.1.21.1.31.1.41.1.51.1.61.1.71.1.81.1.9分布式内存2消息传输3进程3消息传递库3发送/接收3同步/异步3阻塞通讯4非阻塞通讯4应用程序缓冲区41.1.10 系统缓冲区4MPI 环境51.21.2.11.2.21.2.31.2.41.2.5头文件5MPI 调用格式5一般 MPI 程序结构6通信因子和组6秩6第二章 MPI 环境管理调用7函数调用7MPI_Init72.1.22.1.32.1.42.1.52.1.62.1.72
2、.1.82.1.9m_size7m_r.7MPI_Abort7MPI_Get_prosor_name8MPI_Initialized8MPI_Wtime8MPI_Wtick8MPI_Finalize82.2MPI 环境管理例子9C 语言例子9Fortran 语言例子9第三章 点对点通信函数113.1 传递参数说明113.1.13.1.23.1.33.1.43.1.53.1.63.1.73.1.8MPI 消息传递函数参数11缓冲区(buffer)12元素个数(count)12数据元素类型(type)12目的地 (dest)12源 (source)12标识符(tag)13通信因子(comm)13状
3、态(sus)13请求(request)13阻塞消息通信函数133.23.2.13.2.23.2.33.2.43.2.53.2.63.2.73.2.83.2.9MPI_Send13MPI_Recv14MPI_Ssend14MPI_Bsend14MPI_Buffer_attaPI_Buffer_detach14MPI_Rsend15MPI_Sendrecv15MPI_Wait、MPI_Waitany、MPI_Waitall、MPI_Waitsome15MPI_Probe153.3阻塞消息传递例子16C 程序例子16Fortran 程序例子16非阻塞消息通信函数173.43.4.13.4.23.4.
4、33.4.43.4.53.4.63.4.7MPI_Isend17MPI_Irecv18MPI_Issend18MPI_Ibsend18MPI_Irsend18MPI_Test 、MPI_Testany 、MPI_Testall 、MPI_Testsome18MPI_Iprobe193.5非阻塞消息传递例子19C 语言例子19Fortran 语言例子20第四章 集合通信函数214.1集合通信函数214.1.14.1.24.1.34.1.44.1.54.1.64.1.74.1.84.1.9MPI_Barrier21MPI_Bcast21MPI_Scatter22MPI_Gather22MPI_Al
5、lgather23MPI_Reduce23MPI_Allreduce24MPI_Reduce_scatter24MPI_Alltoall244.1.10 MPI_Scan24集合通信操作例子264.24.2.14.2.24.2.3C 语言例子26Fortran 语言例子27例子输出结果28第五章 派生数据类型295.1 派生数据类型函数295.1.15.1.25.1.35.1.45.1.55.1.6MPI_Type_contiguous29MPI_Type_vector 、MPI_Type_hvector30MPI_Type_indexed 、MPI_Type_hindexed30MPI_Ty
6、pe_struct31MPI_Type_extent31mit315.2连续数据类型的例子325.2.15.2.25.2.3C 语言例子32Fortran 语言例子33例子输出结果345.3向量派生数据类型例子345.3.15.3.25.3.3C 语言例子34Fortran 语言例子35程序输出结果365.4索引派生数据类型例子375.4.15.4.25.4.3C 语言例子37Fortran 语言例子38例子输出结果395.5结构派生数据类型例子405.5.15.5.25.5.3C 语言例子40Fortran 语言例子41例子输出结果43第六章 组和通信因子管理函数446.1组和通信因子管理函
7、数456.1.16.1.26.1.36.1.46.1.56.1.66.1.76.1.86.1.96.1.106.1.116.1.126.1.136.1.14m_group45MPI_Group_r.45MPI_Group_size45MPI_Group_excl45MPI_Group_incl45MPI_Group_ersection45MPI_Group_union46MPI_Group_difference46pare46MPI_Group_free46m_create46m_dup46pare47m_free476.2组和通信因子管理函数运用例子476.2.16.2.26.2.3C 语言
8、例子47Fortran 语言例子48例子结果输出49第七章 虚拟拓扑507.1 虚拟拓扑函数507.1.17.1.27.1.37.1.47.1.57.1.67.1.77.1.87.1.97.1.107.1.117.1.127.1.137.1.147.1.15MPI_Cart_coords50MPI_Cart_create50MPI_Cart_get50MPI_Cart_map50MPI_Cart_r.50MPI_Cart_shift51MPI_Cart_sub51MPI_Cartdim_get51MPI_Dims_create51MPI_Graph_create51MPI_Graph_get5
9、2MPI_Graph_map52MPI_Graph_neighbors52MPI_Graphdims_get52MPI_Topo_test52虚拟拓扑例子52C 语言例子53Fortran 语言例子54例子输出结果557.27.2.17.2.27.2.3第八章 MPI 运行环境568.1 MPI 用户程序的编译与连接568.2 例子568.2.18.2.28.2.3例子一(o 程序)56例子二(一个简单的串行程序转换为并行程序)57例子三(计算 的串行及并行程序)59第一章 MPI 简介在消息传递库方法的并行编程中,一组进程所执行的程序是用标准串行语言书写的代码加上用于消息接收和发送的库函数调
10、用。其中,MPPassingerface )是1994年5月发布的一种消息传递接口,它实际上是一个消息传递函数库的标准说明,吸取了众多消息传递系统的优点,是目前国际上最流行的并行编程环境之一,尤其是分布式的可缩放并行计算机和工作站网络以及机群的一种编程范例。MPI具有许多优点:具有可移植性和易用性;有完备的异步通信功能;有正式和详细的精确定义。固而为并行的条件。产业的增长提供了必要在基于MPI编程模型中,计算是由一个或多个彼此通过调用库函数进行消息收、发通信的进程所组成。在绝大部分MPI实现中,一组固定的进程在程序初始化时生成,一般情况下,一个处理器只生成一个进程。这些进程可以执行相同或不同的
11、程序(相应地称为单程序多数据(SPMD)或多程序多数据(MPMD)模式)。进程间的通信可以是点到点的,也可以是集合的。MPI只是为程序员提供一个并行环境库,程序员通过调用MPI的库程序来达到程序员所要达到的并行目的,MPI提供C语言和Fortran语言接口。MPI是个复杂的系统,它包含了129个函数(根据1994年发布的MPI标准)。事实上,1997年修订的标准,称之为MPI-2,已超过200个,目前最常用的也有约30个,然而可以只使用其中的6个最基本的函数就能编写一个完整的MPI程序去求解很多问题。这6个基本函数,包括启动和结束MPI环境,识别进程以及发送和接收消息:MPI_INIT:MPI
12、_Init();启动MPI环境MPI_FIANLIZE:MPI_Finalize();结束MPI环境M_SIZE:m_size();确定进程数M_Rm_r:();确定自己的进程标识符MPI_SEND:MPI_Send();发送一条消息MPI_RECV:MPI_Recv()接收一条消息一个简单例子:#include “mpi.h”main(argc,char *argv)myr,i,j,k; MPI_Sus sus; char msg20;MPI_Init(&argc,&argv);m_r= 0)(M_WORLD,&myr);if(myrstrcpy(msg,”o there”);MPI_Sen
13、d(msg,strlen(msg) + 1,MPIM_WORLD);else if(myr= 1)MPI_Recv(msg,20,MPIprf(“Receive message = %sn”,msg);M_WORLD,&sus);MPI_Finalize();其中,M_WORLD是一个却省的进程组,它指明所有的进参与计算。1.1消息传递编程的相关概念1.1.1 分布式内存每个处理器都有自己的私有空间,数据从一个处理器到另一个处理器只有通过网络来传输,而共享中的多个处理器可同时同一内存单元。分布式系统的示意图如下:1.1.2 消息传输消息传输是消息数据从一个处理器的内存拷贝到另一个处理器内存的方
14、法。在分布式存储系统中,数据通常是以消息包的形式通过网络从一个处理器发送到另一个处理器。在消息包中,包含了消息头控制信息及消息体数据信息两部分。1.1.3 进程进程是运行在一个处理器上的一个程序,多个进程可运行在同一个处理器上。在消息传递系统中,即使是在同一个处理器中运行的多个进程,他们之间的数据通讯也是通过消息传输来实现的。为了提高效率,在消息传递系统中,一般一个处理器只运行一个进程。1.1.4 消息传递库可连接到用户应用程序中实现消息发送、消息接收以及其他消息传递操作的一组函数的集合。1.1.5 发送/接收消息通信包括数据传输从一个进程(发送)到另一个进程(接收)。这就要求两个进程协作完成
15、消息发送和接收过程,发送进程一般要求指定发送数据的源、数据长度、数据类型及目的地,而接收操作也要求指定相应的操作与发送相匹配。1.1.6 同步/异步同步发送操作只有等到消息被接收进程安全接收后才完成,而异步发送操作完成后消息不一定被接收进程接收。1.1.7 阻塞通讯阻塞通讯的调用是否完成要依靠某些“事件”:对于阻塞发送,数据必须成功的发送或被拷贝到系统缓冲区,使得该数据缓冲区可被重新使用;对于阻塞接收,数据必须保证正确接收到本地缓冲区。1.1.8 非阻塞通讯非阻塞通讯不等待任何通讯事件就可以完成,它不保证数据已正确发送或接收。发送或接收的数据也许在源方,也许正在网上,也许已经到目的方。1.1.
16、9 应用程序缓冲区在用户应用程序中定义的用于保存发送和接收数据的地址空间。1.1.10系统缓冲区保留消息的系统空间。在异步通讯的条件下,一般需要把数据从应用程序缓冲区中拷贝到系统缓冲区,保证用户数据不被覆盖。1.2MPI 环境1.2.1 头文件要求所有包含 MPI 调用得程序文件应加入:1.2.2 MPI 调用格式C 程序区分大小写,Fortran 程序不区分大小写在 C 语言描述中,函数名均冠以 MPI 前缀,且其首字母需大写。返回的状态值是整数;成功完成的返回代码是 MPI_SUCS;失败时也会定义一组错误代码。编译时的常数均须大写且被定义在文件 mpi.h 中,mpi.h 在任何需调用
17、MPI 的程序中必须被包含进来。在 Fortran 语言描述中,函数名也冠以 MPI 前缀,且必须大写。函数返回代码由一个附加的整数变量表示之;成功完成的返回代码是 MPI_SUCS;失败时也会定义一组错误代码。编译时的常数均须大写且被定义在文件 mpif.h 中,它在任何需调用 MPI 的程序中必须被包含进来。Fortran 程序格式:CALL MPI_XX(parameter,., ierr)call mpi_xx(parameter,., ierr)例子:CALL MPI_BSEND(buf,countm,ierr)错误码:如果调用成功则 ierr 返回 MPI_SUCSC 程序格式:r
18、c = MPI_xx(parameter, . )例子:rc = MPI_Bsend(&buf,countm)错误码:如果调用成功则 rc 返回 MPI_SUCSC 包含文件Fortran 包含文件#include “mpi.h”include mpif.h1.2.3 一般 MPI 程序结构.1.2.4 通信因子和组MPI 通过指定通信因子和组来完成各个进程间得通信,大多数 MPI 调用要求加入通信因子这个参数。M_WORLD 通信因子是在 MPI 环境初始化过程中创建地包含了所有进程,也是最重要的一个通信因子,详细的用法下面再介绍。1.2.5 秩有一个唯一的整数标识符,该标识符在 MPI 初
19、始化时在一个通信因子中,每个进创建,有时也称作“进程 ID”,秩是从 0 开始的连续整数。在用户程序中,经常用秩来判断程序的运行方向。如:if (r=0) do this else if(r= 1) dot退出 MPI 环境消息交换处理及计算等初始化 MPI 环境包含 MPI 头文件.第二章 MPI 环境管理调用2.1 函数调用2.1.1 MPI_Init初始和启动 MPI 运行环境。每个 MPI 程序必须调用这个函数,并且这个函数必须在所有调用 MPI 函数之前调用,而且只能调用一次。对于 C 程序,MPI_Init 必须传递所有令行参数,即要把 argc 和 argv 传递到 MPI 初始
20、化函数中:MPI_Init (*argc,*argv) MPI_INIT (ierr)2.1.2m_size该函数返回与该组通信因子相关的进程数, 通常可以根据全局通信因子M_WORD 来查询用户程序包含的进程数:m_size (comm,*size) M_SIZE (comm,size,ierr)INOUTcommsize通信因子;在该通信因子中包含的进程数目。2.1.3m_r该函数返回该进程在指定通信因子中的秩(0 进程数-1),一个进程在不同通信因子中的秩可能不同:m_r(comm,*)M_Rcomm(comm,ierr)通信因子;在该通信因子中本进程的进程号。INOUT2.1.4 MP
21、I_Abort结束所有与该通信因子相关的进程,但一般来说,调用该函数后,所有的进不管该进程是否与该通信因子相关:MPI_Abort (comm,errorcode)MPI_ABORT (comm,errorcode,ierr)退出,INcomm通信因子;OUTerrorcode进程退出时返回的错误号。2.1.5 MPI_Get_prosor_name返回该进程所在的计算节点的名称,该名称根据网络地址命名,name 缓冲区的大小必须大于 MPI_MAX_PROSOR_NAME,真正的长度返回在 resultlength 变量中:MPI_Get_proMPI_GET_PROsor_name (*n
22、ame,*resultlength)SOR_NAME (name,resultlength,ierr)OUTOUTnameresultlength计算节点名称(即计算节点的 hostname);该名称字符串的实际长度。2.1.6 MPI_Initialized判断 MPI_Init 是否被执行,返回 true(1),false(0),MPI 应用程序只允许每一个进程仅运行一次 MPI_Init:MPI_Initialized (*flag)MPI_INITIALIZED (flag,ierr)OUTflagMPI_Init 是否运行标识(0/1)。2.1.7 MPI_Wtime返回调用进程已经
23、执行过地时间,以秒为MPI_Wtime () MPI_WTIME (),双精度:2.1.8 MPI_Wtick按秒返回 MPI_Wtime 的分辨率,也就是返回一个双精度值(连续时间之间的秒数)。例如,如果时钟由作为按毫秒递增的计数器实现,则 MPI_Wtick 返回的值是 10-3。MPI_Wtick ()MPI_WTICK ()2.1.9 MPI_Finalize结束 MPI 执行环境。该函数一旦被应用程序调用时,就不能调用 MPI 的其它例行函数(包括 MPI_Init),用户必须保证在进程调用 MPI_Finalize 之前把与完成进程有关的所有通信结束。MPI_Finalize ()
24、MPI_FINALIZE (ierr)2.2 MPI 环境管理例子2.2.1 C 语言例子#include mpi.h#include main(argc,argv) argc;char *argv;numtasks, r, rc;rc = MPI_Init(&argc,&argv); if (rc != 0) prf (Error starting MPI program. Terminating.n);MPI_Abort(M_WORLD, rc);m_size(M_WORLD,&numtasks);m_r(M_WORLD,&r);prf (Number of tasks= %d My r=
25、 %dn, numtasks,r);/*do some work */MPI_Finalize();2.2.2 Fortran 语言例子programincludesimplempif.hegernumtasks, r, ierr, rccall MPI_INIT(ierr) if (ierr .ne. 0) thenpr*,Error starting MPI program. Terminating.call MPI_ABORT(end ifM_WORLD, rc, ierr)callcall prM_R(M_WORLD, r, ierr)M_SIZE(*, Number ofM_WORL
26、D, numtasks, ierr)tasks=,numtasks, My r=,rC * do some work *call MPI_FINALIZE(ierr)end第三章点对点通信函数点对点通信(Po-to-PoCommunication)是 MPI 中比较复杂的一部分,其数据传送有阻塞和非阻塞两组机制:对于阻塞方式,它必须等到消息从本地送出之后才可以执行后续的语句,保证了缓冲区等资源的可再用性;对于非阻塞方式,它不须等到消息从本地送出就可以执行后续的语句,从而允许通信和计算的再用性。如下图所示,阻塞和非阻塞有四种模式:,但非阻塞调用的返回并不保证资源的可1.标准模式,包括阻塞(标准)
27、发送 MPI_SEND、阻塞(标准)接收 MPI_RECV、非阻塞(标准)发送 MPI_ISEND、非阻塞(标准)接收 MPI_IRECV;缓冲区模式:包括阻塞缓冲发送 MPI_BSEND 和非阻塞缓冲发送 MPI_IBSEND;同步模式:包括阻塞同步发送 MPI_SSEND 和非阻塞同步发送 MPI_ISSEND;就绪模式:包括阻塞就绪发送 MPI_RSEND 和非阻塞就绪发送 MPI_IRSEND。2.3.4.在标准通信模式中,MPI 根据当前的状况选取其它三种模式或用户定义的其它模式;缓冲区模式在相匹配的接收未开始的情况下,总是将送出的消息放在缓冲区内,这样发送者可以很快地继续计算,然后
28、由系统处理放在缓冲区中的消息,但这不仅占用内存,而且多用了一次内存拷贝;在同步模式中,MPI 必须保证接收者执行到某一点,这样接收者是必须有确认信息的;在就绪模式下,系统默认与其相匹配的接收已经调用。标准SR缓冲SR1232同步SR就绪SR点到点消息通信四种模式3.1传递参数说明3.1.1 MPI 消息传递函数参数MPI 点对点通信函数的参数格式一般如下所示:阻塞发送MPI_Send(buffer,countm)非阻塞发送MPI_Isend(buffer,countm,request)阻塞接收MPI_Recv(buffer,count,tm,sus)非阻塞接收MPI_Irecv(buffer,
29、count,tm,request)12113.1.2 缓冲区(buffer)指应用程序定义地用于发送或接收数据的缓冲区。3.1.3 元素个数(count)指发送或接收数据元素的个数。3.1.4 数据元素类型(type)MPI 定义了一些缺省的数据类型,用户也可以根据需要建立自己的数据类型,其中MPI_BYTE和MPI_PACKED 与 C 或 Fortran 语言的类型不对应:3.1.5 目的地 (dest)发送进程指定的接收该消息的目的进程,也就是接收进程的秩。3.1.6 源 (source)接收进程指定的发送该消息的源进程, 也就是发送进程的秩。 如果该值为MPI_ANY_SOURCE 表
30、示接收任意源进程发来的消息。MPI C 语言数据类型MPI Fortran 语言数据类型MPI_CHARsigned charMPI_CHARACTERcharacter(1)MPI_SHORTsigned shortMPI_signedMPI_EGERegerMPI_LONGsigned longMPI_UNSIGNED_CHARunsigned charMPI_UNSIGNED_SHORTunsigned shortMPI_UNSIGNEDunsignedMPI_UNSIGNED_LONGunsigned longMPI_FLOATfloatMPI_REALrealMPI_DOUBLEdo
31、ubleMPI_DOUBLE_PRECIdouble preciMPI_LONG_DOUBLElong doublePLEXcomplexMPI_LOGICALlogicalMPI_BYTE8 binary digitsMPI_BYTE8 binary digitsMPI_PACKEDdata packed or unpacked with MPI_Pack()/ MPI_UnpackMPI_PACKEDdata packed or unpacked with MPI_Pack()/ MPI_Unpack3.1.7 标识符(tag)由程序员指定地为标识一个消息的唯一非负整数值(0-32767)
32、,发送操作和接收操作的标识符一定要匹配,但对于接收操作来说,如果 tag 指定为 MPI_ANY_TAG 则可与任何发送操作的 tag 相匹配。3.1.8 通信因子(comm)包含源与目的进程的一组上下文相关的进程集合,除非用户自己定义(创建)了新的通信因子,否则一般使用系统预先定义的全局通信因子参与计算。M_WORLD,它表示所有进3.1.9 状态(sus)对于接收操作,包含了接收消息的源进程(source)和消息的标识符(tag)。在 C 程序中,这个参数是指向 MPI_Sus 结构的指针(如:sus.MPI_SOURus.MPI_TAG);在 Fortran 程序中, 这个参数是大小为
33、MPI_SUS_SIZE 的整数矩阵( 如:sus(MPI_SOURCE) 、 sus(MPI_TAG) )。 另外, 实际接收到的消息长度可以通过MPI_Get_count()函数从该参数中得到。3.1.10请求(request)这个参数用于非阻塞发送和非阻塞接收操作。由于非阻塞操作返回后,消息实际上还没有完成到达真正发送或接收,因此用户可以根据该变量调用其它函数完成消息的实际发送和接收。在 C 程序中,这个参数是指向 MPI_Request 结构的指针;在 Fortran 程序中,这个参数是一个整数。3.2 阻塞消息通信函数这里介绍一些最主要的阻塞消息通信函数:3.2.1 MPI_Send
34、该函数是最基本的阻塞发送函数。当函数返回时,应用程序的发送缓冲区空闲,可以继续使用。MPI_Send (*buf,count,datMPI_SEND (buf,count,datm) m,ierr)发送数据缓冲区的起始地址;发送数据元素的个数(=0);数据元素的数据类型;IN ININbuf countdaypeININ INdesttag comm接收进程的进程号;消息标识;通信因子。3.2.2 MPI_Recv阻塞接收消息,直到该消息到达本进程的接收缓冲区后才返回。MPI_Recv (*buf,count,daMPI_RECV (buf,count,dam,*sus) m,sus,ierr
35、)接收数据缓冲区的起始地址;接收数据元素的个数(=0);接收数据元素的数据类型;发送进程的进程号或 MPI_ANY_SOURCE;消息标识或 MPI_ANY_TAG;通信因子;接收状态信息OUT IN IN IN IN INOUTbuf count daype source tag commsus3.2.3 MPI_Ssend同步阻塞发送:发送一个消息,直到发送进程的缓冲区空闲并且接收进程已经开始接收该消息后返回MPI_Ssend (*buf,count,datMPI_SSEND (buf,count,datm,ierr)m,ierr)3.2.4 MPI_Bsend缓冲区阻塞发送:应用程序首先
36、应申请一个足够大的缓冲区,然后用 MPI_Buffer_attach函数加以确认,当 MPI_Bsend 函数返回时,消息数据已经从应用程序发送缓冲区拷贝到分配的缓冲区中。MPI_Bsend (*buf,count,datMPI_BSEND (buf,count,datm)m,ierr)3.2.5 MPI_Buffer_attaPI_Buffer_detach用于 MPI_Bsend 函数的发送缓冲区,size 参数是以字节为计的缓冲区用于分配和大小:MPI_Buffer_attach (*buffer,size) MPI_Buffer_detach (*buffer,size) MPI_BU
37、FFER_ATTACH (buffer,size,ierr)MPI_BUFFER_DETACH (buffer,size,ierr)3.2.6 MPI_Rsend预备方式的阻塞发送。如果能确认接收进程已经开始匹配接收时,可以使用该发送函数:MPI_Rsend (*buf,count,datMPI_RSEND (buf,count,datm)m,ierr)3.2.7 MPI_Sendrecv阻塞发送并阻塞接收一个消息。只有当发送缓冲区空并接收缓冲区消息有效后该函数才返回:MPI_Sendrecv (*sendbuf,sendcoundtype,desdtag,*recvbuf,recvcount
38、,recvtype,source,recvtag,comm,*sus)MPI_SENDRECV (sendbuf,sendcoundtype,desdtag,recvbuf,recvcount,recvtype,source,recvtag,comm,sus,ierr)3.2.8 MPI_Wait、MPI_Waitany、MPI_Waitall、MPI_WaitsomeMPI_Wait 函数只有当指定的消息发送或接收完成后才返回,对于多个非阻塞的操作,程序员可以指定任何一个或一些或全部的消息发送或接收完成后再返回:MPI_Wait (*request,*sus)MPI_Waitany (cou
39、nt,*array_of_requests,*index,*sus) MPI_Waitall (count,*array_of_requests,*array_of_suses)MPI_Waitsome (incount,*array_of_requests,*oMPI_WAIT (request,sus,ierr)ount, array_of_offsets, *array_of_suses)MPI_WAITANY (count,array_of_requests,index,sus,ierr) MPI_WAITALL (count,array_of_requests,array_of_su
40、ses, ierr) MPI_WAITSOME (incount,array_of_requests,oount,array_of_offsets, array_of_suses,ierr)3.2.9 MPI_Probe该函数探测一个消息是否完成接收,只有当探测到消息接收完成后才返回:MPI_Probe (MPI_PROBE (m,*sus)m,sus,ierr)3.3 阻塞消息传递例子3.3.1 C 程序例子#include mpi.h#include main(argc,argv) argc;char *argv;numtasks, r, dest, source, rc, tag=1;c
41、harsg, outmsg=x;MPI_Sus S;MPI_Init(&argc,&argv);m_size( m_r(M_WORLD, &numtasks);M_WORLD, &r);if (r= 0) dest = 1;source = 1;rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag,M_WORLD);M_WORLD,rc = MPI_Recv(&Ssg, 1, MPI_CHAR, source,);tag, else if (rdest = 0;= 1) source = 0;rc = MPI_Recv(&Ssg, 1, MPI_CHAR,
42、 source,);tag,M_WORLD,rc = MPI_Send(&outmsg, 1, MPI_CHAR, dest, tag,M_WORLD);MPI_Finalize();3.3.2 Fortran 程序例子progringinclude mpif.heger numtasks, r, dest, source, tag, ierreger s(MPI_SUS_SIZE)charactertag = 1sg, outmsgcall MPI_INIT(ierr)callcallM_RM_SIZE(M_WORLD, r, ierr)M_WORLD, numtasks, ierr)if
43、(r.eq. 0) thendest = 1source = 1 outmsg = xcall MPI_SEND(outmsg, 1, MPI_CHARACTER, dest, tag,M_WORLD, ierr)&call MPI_RECV(sg, 1, MPI_CHARACTER, source, tag,M_WORLD, s, ierr)&else if (rdest = 0.eq. 1) thensource = 0call MPI_RECV(sg, 1, MPI_CHARACTER, source, tag,M_WORLD, s, err)&call MPI_SEND(outmsg,
44、 1, MPI_CHARACTER, dest, tag,M_WORLD, err)endif&call MPI_FINALIZE(ierr)end3.4非阻塞消息通信函数这里介绍一些最主要的非阻塞消息通信函数。3.4.1 MPI_Isend非阻塞发送,该函数调用后立即返回,并回送一个发送消息句柄,发送的消息还在应用程序缓冲区中,应用程序不能再使用该发送缓冲区,直到完成 MPI_Wait 或 MPI_Test 函数调用后:MPI_Isend (*buf,count,datMPI_ISEND (buf,count,datm,*request)m,request,ierr)3.4.2 MPI_Ir
45、ecv非阻塞接收,该调用返回后,所要接收的消息未必到本地接收缓冲区中,直到完成MPI_Wait 或 MPI_Test 函数调用后,该接收缓冲区的消息才有效:MPI_Irecv (*buf,count,daMPI_IRECV (buf,count,dam,*request)m,request,ierr)3.4.3 MPI_Issend同步方式的无阻塞发送,类似于 MPI_Isend()函数去掉 MPI_Wait() 或 MPI_Test()调用:MPI_Issend (*buf,count,datMPI_ISSEND (buf,count,datm,*request)m,request,ierr
46、)3.4.4 MPI_Ibsend非阻塞缓冲区发送,类似于 MPI_Bsend()函数去掉 MPI_Wait() 或 MPI_Test()调用:MPI_Ibsend (*buf,count,datMPI_IBSEND (buf,count,datm,*request)m,request,ierr)3.4.5 MPI_Irsend预备方式的非阻塞发送,类似于 MPI_Rsend()函数去掉 MPI_Wait() 或 MPI_Test()调用,只有确认接收进程已经开始匹配接收时才可以调用该函数:MPI_Irsend (*buf,count,datMPI_IRSEND (buf,count,datm
47、,*request)m,request,ierr)3.4.6 MPI_Test 、MPI_Testany、MPI_Testall 、MPI_TestsomeMPI_Test 函数用于检测非阻塞发送或接收的消息是否完成,完成则返回 true(1), 否则返回 false(0),对于多个非阻塞操作,可以用 MPI_Testany 或 MPI_Testall 或 MPI_Testsome调用来检测是否有任一个或所有或一些操作完成:MPI_Test (*request,*flag,*sus)MPI_Testany (count,*array_of_requests,*index,*flag,*sus)
48、 MPI_Testall (count,*array_of_requests,*flag,*array_of_suses)MPI_Testsome (incount,*array_of_requests,*oMPI_TEST (request,flag,sus,ierr)ount,*array_of_offsets, *array_of_suses)MPI_TESTANY (count,array_of_requests,index,flag,sus,ierr) MPI_TESTALL (count,array_of_requests,flag,array_of_suses,ierr) MPI
49、_TESTSOME (incount,array_of_requests,oount,array_of_offsets, array_of_suses,ierr)3.4.7 MPI_Iprobe该函数探测一个消息接收是否完成,并立即返回,如果接收成功参数 falg 为 1,否则为0:MPI_Iprobe (MPI_IPROBE (m,*flag,*sus)m,flag,sus,ierr)3.5 非阻塞消息传递例子3.5.1 C 语言例子#include mpi.h#include main(argc,argv) argc;char *argv;numtasks, r, next, prev,
50、buf2, tag1=1, tag2=2;MPI_Request reqs4;MPI_Sus ss4;MPI_Init(&argc,&argv);m_size( m_r(M_WORLD, &numtasks);M_WORLD, &r);prev = r next = r if (rif (r-1;+1;= 0)prev = numtasks - 1;= (numtasks - 1)next = 0;MPI_Irecv(&buf0, 1, MPI_MPI_Irecv(&buf1, 1, MPI_, prev, tag1, next, tag2,M_WORLD, &reqs0);M_WORLD,
51、&reqs1);MPI_Isend(&rMPI_Isend(&r, 1, MPI_, 1, MPI_, prev, tag2, next, tag1,M_WORLD, &reqs2);M_WORLD, &reqs3);MPI_Waitall(4, reqs, ss);MPI_Finalize();3.5.2 Fortran 语言例子program ringtopoinclude mpif.heger numtasks, r eger ss(MPI_Stag1 = 1tag2 = 2, next, prev, buf(2), tag1, tag2, ierrUS_SIZE,4), reqs(4)
52、call MPI_INIT(ierr)callcallM_RM_SIZE(M_WORLD, r, ierr)M_WORLD, numtasks, ierr)prev = rnext = r if (r- 1+ 1.eq. 0) thenprev = numtasks - 1endifif (r.eq. numtasks - 1) thennext = 0endifcall MPI_IRECV(buf(1), 1, MPI_EGER, prev, tag1,&M_WORLD, reqs(1), ierr)call MPI_IRECV(buf(2), 1, MPI_EGER, next, tag2
53、,&M_WORLD, reqs(2), ierr)call MPI_ISEND(r, 1, MPI_EGER, prev, tag2,&M_WORLD, reqs(3), ierr)call MPI_ISEND(r, 1, MPI_EGER, next, tag1,&M_WORLD, reqs(4), ierr)call MPI_WAITALL(4, reqs, ss, ierr);call MPI_FINALIZE(ierr)end第四章集合通信函数集合通信是包含在通信因子中的所有进M_WORLD 时,应用程序中所有进集合操作的三种类型:参加操作, 当通信因子为参加。同步(Barrier):
54、集合中所有进到达后,每个进程再接着运行;数据传递:广播(Broadcast)、分散(Scatter)、收集(Gather)、全部到全部(Alltoall);归约(Reduction):集合中的其中一个进程收集所有进程的数据并计算(如:求最大值、求最小值、加、乘等);集合操作是阻塞的。集合操作不带标识符(tag)参数。只支持 MPI 标准的数据类型,不支持派生数据类型。4.1集合通信函数4.1.1 MPI_Barrier在组中建立一个同步栅栏。当每个进行:MPI_Barrier (comm)MPI_BARRIER (comm,ierr)到达 MPI_Barrier 调用后,程序才接着往下执4.1
55、.2 MPI_Bcast从指定的一个根进程中把数据广播发送给组中的所有其它进程:MPI_Bcast (*buffer,countMPI_BCAST (buffer,countm)m,ierr)4.1.3 MPI_Scatter把指定的根进程中的数据分散发送给组中的所有进程(包括自己):MPI_Scatter (*MPI_SCATTER (dtype,*recvbuf,dtype,recvbuf,tm)m,ierr)t4.1.4 MPI_Gather在组中指定一个进程收集组中所有进程发送来的消息,这个函数操作与 MPI_Scatter 函数操作相反:MPI_Gather (*MPI_GATHER
56、 (dtype,*recvbuf, recvcountdtype,recvbuf, recvcountm)m,ierr)4.1.5 MPI_Allgather在组中的每个进收集组中所有进程发送来的消息:MPI_Allgather (*sendbuf,sendcounMPI_ALLGATHER (sendbuf,sendcoundtype,*recvbuf, recvdtype,recvbuf,recvm)m,info)4.1.6 MPI_Reduce在组内所有的进程中,执行一个归约操作,并把结果存放在指定的一个进程中:MPI_Reduce (*sendbuf,*recvbuf,count,da
57、MPI_REDUCE (sendbuf,recvbuf,count,dam)m,ierr)MPI 缺省定义了如下的归约操作,用户可根据自己的需要用 MPI_Op_create 函数创建新的归约操作:MPIC 语言数据类型Fortran 语言数据类型归约操作MPI_MAXeger, floateger, real, complex求最大值MPI_MINeger, floateger, real, complex求最小值MPI_SUMeger, floateger, real, complex和MPI_PRODeger, floateger, real, complex乘积MPI_LANDeger
58、logical逻辑与MPI_BANDeger, MPI_BYTEeger, MPI_BYTE按位与MPI_LORegerlogical逻辑或MPI_BOReger, MPI_BYTEeger, MPI_BYTE按位或MPI_LXORegerlogical逻辑异或MPI_BXOReger, MPI_BYTEeger, MPI_BYTE按位异或MPI_MAXLOCfloat,doubleand long doublereal,complex,double最大值和单元preciMPI_MINLOCfloat,doubleand long doublereal,complex,double最小值和单元
59、preci4.1.7 MPI_Allreduce执行一个归约操作, 并把结果广播到组内的所有进程中。该操作等价于先执行MPI_Reduce 操作,然后再执行 MPI_Bcast:MPI_Allreduce (*sendbuf,*recvbuf,couMPI_ALLREDUCE (sendbuf,recvbuf,coum)m,ierr)4.1.8 MPI_Reduce_scatter在组内按元素先进行归约操作,然后把结果分段后分布到组内的其它进程上。该操作等价于先执行 MPI_Reduce 函数,然后再执行 MPI_ Scatter 函数:MPI_Reduce_scatter (*sendbuf
60、,*recvbuf,recvcount,daype, MPI_REDUCE_SCATTER (sendbuf,recvbuf,recvcount,daype,m)m,ierr)4.1.9 MPI_Alltoall组中每个进程执行一个发散操作,发送不同的消息到组内的所有进程上(包括自己):MPI_Alltoall (*sendbuf,sendcounMPI_ALLTOALL (sendbuf,sendcoundtype,*recvbuf,dtype,recvbuf,m)m,ierr)4.1.10MPI_Scan用来对分布在进程组上的数据执行前缀归约:MPI_Scan (*sendbuf,*rec
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年工程承包商合同范本
- 2024年土地集体承包协议
- 2024年保险合同:保险标的、保险金额、保险期间及费用
- 2024年广告发布合同标的及广告内容
- 2024年工程项目咨询服务升级版合同
- 2024年修订版:戴悦与旅游公司的旅游服务合同(2024版)
- 2024年市场推广分包合同
- 2024年vrar游戏开发与授权合同
- 2024年在线教育平台运营承包合同
- 2024年大数据分析应用合同
- 我的应许之地:以色列的荣耀与悲情
- 二年级特色作业
- 农村寄宿制高中生心理健康现状及对策研究 论文
- 宾馆酒店标准化-安全管理人员任命书
- 药房药品养护记录表
- DBJ51-T 196-2022 四川省智慧工地建设技术标准
- 义务教育英语课程标准2022年英文版
- 可靠性的基本概念演示
- 中印边境争议地区
- htr-pm通风空调系统核电站hvac简介
- 工业园区企业环境风险和安全隐患排查情况表优质资料
评论
0/150
提交评论