消息传递并行程序设计_第1页
消息传递并行程序设计_第2页
消息传递并行程序设计_第3页
消息传递并行程序设计_第4页
消息传递并行程序设计_第5页
已阅读5页,还剩76页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

消息传递并行程序设计 消息传递并行程序设计 指用户必须通过显式地发送和接收消息来实现处理机间的数据交换 在这种并行编程中 每个并行进程均有自己独立的地址空间 相互之间访问不能直接进行 必须通过显式的消息传递来实现 这种编程方式是大规模并行处理机 MPP Cluster 采用的主要编程方式 消息传递并行程序设计 并行计算粒度大 特别适合于大规模可扩展并行算法 由于消息传递程序设计要求用户很好地分解问题 组织不同进程间的数据交换 并行计算粒度大 特别适合于大规模可扩展并行算法 消息传递是当前并行计算领域的一个非常重要的并行程序设计方式 什么是MPI MPI MassagePassingInterface 是消息传递函数库的标准规范 由MPI论坛开发 支持Fortran和C 一种新的库描述 不是一种语言 共有上百个函数调用接口 在Fortran和C语言中可以直接对这些函数进行调用 从语法上 它遵守所有对库函数 过程的调用规则 与一般的函数 过程没有区别 MPI是一种标准或规范的代表 而不是特指某一个对它的具体实现 一个正确的MPI程序 可不加修改在所有的并行机上运行 MPI是一种消息传递编程模型 并成为这种编程模型的代表和事实上的标准 最终目标是服务于进程间通信 MPI的发展过程 发展的两个阶段 MPI1 1 1995MPICH 是一种最重要的MPI实现 每当MPI推出新的版本 就会有相应的MPICH的实现版本 由美国Argonne国家实验室和密西西比州立大学联合开学 具有更好的可移植性 MPI1 2 2 0 动态进程 并行I O 支持F90和C 为什么要用MPI 优点 高可移植性 MPI已在IBMPC机上 MSWindows上 所有主要的Unix工作站上和所有主流的并行机上得到实现 使用MPI作消息传递的C或Fortran并行程序可不加改变地运行在IBMPC MSWindows Unix工作站 以及各种并行机上 消息传递方式是广泛应用于多类并行机的一种模式 特别是分布存储并行机 这种模式在一些重要的计算应用中已取得了实质性进步 为什么要用MPI 优点 MPI是被正式的详细说明的 它已经成为一个标准 消息传递标准的定义能提供给生产商清晰定义的程序库 以便他们能有效地实现这些库或在某些情况下为库程序提供硬件支持 因此加强了扩展性 MPI有完备的异步通信 使得send receive能与计算重叠 可以有效的在MPP上或Cluster上用MPI编程 MPI C实现的 HelloWorld include include mpi h main intargc char argv MPI Init MPI C实现的 HelloWorld mpi h是MPI标准规定的 每个MPI实现都要包含 它提供用户MPI程序需要的所有必要的原型和外部变量声明 MPI函数返回出错代码或MPI SUCCESS成功标志 MPI 前缀 且只有MPI以及MPI 标志后的第一个字母大写 其余小写 MPI函数的参数被标志为以下三种类型 IN 参数在例程的调用中不会被修正 OUT 参数在例程的调用中可能会被修正 INOUT 参数在一些例程中为IN 而在另一些例程中为OUT MPI初始化 MPI Init intMPI Init int argc char argv MPI INIT IERROR MPI Init是MPI程序的第一个调用 它完成MPI程序的所有初始化工作 所有的MPI程序的第一条可执行语句都是这条语句 启动MPI环境 标志并行代码的开始 并行代码之前 第一个mpi函数 除MPI Initialize 外 要求main必须带参数运行 否则出错 MPI结束 MPI Finalize intMPI Finalize void MPI FINALIZE IERROR MPI Finalize是MPI程序的最后一个调用 它结束MPI程序的运行 它是MPI程序的最后一条可执行语句 否则程序的运行结果是不可预知的 标志并行代码的结束 清理和关闭除主进程外的其它进程 之后串行代码仍可在主进程 rank 0 上运行 如果必须 MPI程序的的编译与运行 mpif77hello f或mpicchello c默认生成a out的可执行代码 mpif77 ohellohello f或mpicc ohellohello c生成hello的可执行代码 mpirun np4a outmpirun np4hello4指定np的实参 表示进程数 由用户指定 a out hello要运行的MPI并行程序 输出文件命名 Hello是如何被执行的 SPMD SingleProgramMultipleData SPMD 开始写MPI并行程序 在写MPI程序时 我们常需要知道以下两个问题的答案 由多少个进程来进行并行计算 我是哪一个进程 两个函数 MPI提供了下面两个函数来回答上述问题 用MPI Comm size获得进程个数pintMPI Comm size MPI Commcomm int size 这一调用返回给定的通信域中所包含的进程的个数 不同的进程通过这一调用得知在给定的通信域中一共有多少个进程在并行执行 用MPI Comm rank获得进程的一个叫rank的值 该rank值为0到p 1间的整数 相当于进程的IDintMPI Comm rank MPI Commcomm int rank 这一调用返回调用进程在给定的通信域中的进程标识号 有了这个标识号 不同的进程就可以将自身和其它的进程区分开 实现进程的并行和协作 更新的 HelloWorld include include mpi h intmain intargc char argv intmyid numprocs MPI Init 运行结果 dair node01 mpicc ohello1hello1 c dair node01 mpirun np4hello1Hello World Iam0of4Hello World Iam1of4Hello World Iam2of4Hello World Iam3of4 dair node01 计算机打印字符 输入的命令 通信字MPI COMM WORLD MPI Comm size和MPI Comm rank两个函数都用到了同一个参数MPI COMM WORLD MPI COMM WORLD是一个预定的通信域 communicator 包括进程组和通信上下文 用于描述进程间的通信关系 进程组是进程的有限 有序集 通信上下文如同系统设计的超级标签 用于安全地区别不同的通信 以免互相干扰 每个通信域的上下文都不同 一个上下文中的消息发送不能在另一个上下文中被接收 通信上下文不是显示的MPI对象 它们仅作为通信域实现的一部分出现 它在执行MPI Initb函数后自动生成 MPI通信操作函数中必不可少的参数 用于限定参加通信的进程的范围 函数MPI Comm size和MPI Comm rank查询MPI COMM WORLD以获得应用中MPI进程的总数并为这些MPI进程分别获得一个唯一的编号 获取的值放在变量size和rank MPI程序的框架结构 消息发送和接收 MPI SEND buf count datatype dest tag comm INbuf发送缓冲区的起始地址 可选类型 INcount将发送的数据的个数 非负整数 INdatatype发送数据的数据类型INdest目的进程标识号rank 整型 INtag消息标签 用于识别不同的消息 整型 INcomm通信域 句柄 intMPI Send void buf intcount MPI Datatypedatatype intdest inttag MPI Commcomm 一个消息好似一封信 需要定义消息的内容 还需要定义消息的发送者或接收者 前者 buf count datatype 称为消息缓冲 后者 dest tag comm 称为消息信封 说明 MPI Send将发送缓冲区中的count个datatype数据类型的数据发送到目的进程 目的进程在通信域的标识号是dest 本次发送的消息标志是tag 这一标志的目的是把本次发送的消息和本进程向同一目的进程发送的其他消息区别开来 MPI Send操作指定的发送缓冲区是由count个类型为datatype的连续数据空间组成 起始地址为buf 注意 不是以字节计数 而是以数据类型为单位指定消息的长度 其中datatype数据类型 MPI的预定义类型或用户自定义 通过使用不同的数据类型调用MPI Send 可以发送不同类型的数据 消息发送和接收 MPI RECV buf count datatype source tag comm status OUTbuf接收缓冲区的起始地址 可选类型 INcount最多可接收的数据的个数 非负整数 INdatatype接收数据的数据类型INsource接收数据的来源即发送数据的进程的进程标识号 整型 INtag消息标志 与相应的发送操作的消息标识rank相匹配 整型 INcomm本进程和发送进程所在的通信域 句柄 OUTstatus返回状态 status对象 包含实际接收到的消息的有关信息intMPI Recv void buf intcount MPI Datatypedatatype intsource inttag MPI Commcomm MPI Status status 说明 MPI Recv从指定的进程source接收消息 并且该消息的数据类型和接收进程指定的datatype和tag相一致 接收到的消息所包含的数据元素的个数最多不能超过count 接收缓冲区是由count个类型为datatype的连续元素空间组成 起始地址为buf 接收到消息的长度被确定 如果大小缓冲区的长度会发生溢出 如果一个短于接收缓冲区的消息到达 那么只有相应于这个消息的那些地址被修改 count可以为零 此时消息的数据部分是空的 其中datatype数据类型 MPI的预定义类型或用户自定义 通过指定不同的数据类型调用MPI Recv 可以发送不同类型的数据 返回状态status 返回状态变量status用途很广 它是MPI定义的一个数据类型 使用之前需要用户为它分配空间 在C实现中 状态变量是由至少三个域组成的结构类型 这三个域分别是 MPI SOURCE MPI TAG MPI ERROR 它还可以包括其他的附加域 通过对status MPI SOURCE status MPI TAG和staus MPI ERROR的引用就可以得到返回状态中所包含的发送数据进程的标识 发送数据使用的tag标识和本接收操作返回的错误代码 除了以上三个信息之外 对status变量执行MPI GET COUNT调用可得到接收到的消息的长度信息 MPI消息 MPI消息包括信封和数据两个部分 信封指出了发送或接收消息的对象及相关信息 而数据是本消息将要传递的内容 数据 信封 MPI消息 一个消息好似一封信 需要定义消息的内容 还需要定义消息的发送者或接收者 前者称为消息缓冲 后者称为消息信封 什么是缓冲区 应用程序中说明的变量 在消息传递语句中又用作缓冲区的起始位置 也可表示由系统 不同用户 创建和管理的某一存储区域 在消息传递过程中用于暂存放消息 也被称为系统缓冲区 用户可设置一定大小的存储区域 用作中间缓冲区以保留可能出现在其应用程序中的任意消息 系统缓冲区 用户指定缓冲区 用户缓冲区 一个简单的发送和接收例子 一个进程 进程0 向另一个进程 进程1 发送一条消息 该消息是一个字符串 Hello process1 进程1在接收到该消息后 将这一消息打印到屏幕上 include includemain intagrc char argv charmessage 20 intmyrank MPI Init 一个简单的发送和接收例子 MPI Send message strlen message MPI CHAR 1 99 MPI COMM WORLD 先将字符串拷贝到发送缓冲区message中 然后调用MPI Send语句将它发出 用strlen message 指定消息的长度 用MPI CHAR指定消息的数据类型 1指明发往进程1 使用的消息标识是99 MPI COMM WORLD是包含是包含本进程0和接收消息的进程1的通信域 发送方和接收方必须在同一个通信域 由通信域来统一协调和控制消息的发送和接收 elseif myrank 1 若是进程1 一个简单的发送和接收例子 MPI Recv message 20 MPI CHAR 0 99 MPI COMM WROLD 进程1直接执行接收消息的操作 这里它使用message作为接收缓冲区 可见 同一个变量在发送进程和接收进程中的作用是不同的 它指定接收消息的最大长度为20 消息的数据类型为MPI CHAR字符型 接收的消息来自进程0 而接收消息携带的标识必须为99 使用的通信域也是MPI COMM WORLD 接收完成后的各种状态信息存放在status中 接收完成后 直接将接收到的字符串打印在屏幕上 MPI Finalize MPI程序结束 MPI预定义的数据类型 MPI预定义的数据类型 如果宿主语言有附加的数据类型 那么MPI应提供附加的相应数据类型 如下表所示 现在您已经能够用MPI进行并行编程了 点对点通信 点对点通信 Point to PointCommunication 是MPI中比较复杂的一部分 它有两种消息传递机制 阻塞的和非阻塞的 通信模式 通信模式指的是缓冲管理以及发送方和接收方之间的同步方式 MPI支持4种通信模式 即标准通信模式 缓冲通信模式 同步通信模式和就绪通信模式 标准通信模式 在标准通信模式中 是否对发送的数据进行缓冲由MPI来决定 而不是由用户程序来控制的 如果MPI决定缓存将要发出的数据 发送操作不管接收是否已经启动都可以执行 否则只有等待接收操作启动后才能正确返回 缓冲通信模式 在缓冲通信模式中 1 用户直接对通信缓冲区进行申请 使用和释放 2 不管接收是否已经启动 发送操作都可以执行 但是在发送消息之前必须有缓冲区 这由用户保证 3 消息发送能否进行及能否正确返回 不依赖于接收进程 完全依赖于是否有足够的通信缓冲区可用 由MPI Buffer attach来申请和MPI Buffer detach和收回申请的缓冲区 同步通信模式 在同步通信模式中 发送不依赖于接收进程相应的接收操作是否已经启动 但是同步发送必须等到相应的接收进程开始后才可以正确返回 同步发送返回后 发送缓冲区中的数据已经全部被系统缓冲区缓存并且已经开始发送 就绪通信模式 在就绪通信模式中 1 只有当接收进程的接收操作已经启动时 才可以在发送进程启动发送操作 2 对于非阻塞发送操作的正确返回 并不意味着发送已完成 但对于阻塞发送的正确返回 则发送缓冲区可重复使用 3 就绪通信模式的特殊之处就在于它要求接收操作先于发送操作而被启动 MPI的几个函数 MPI Init int argc char argv 初始化MPI系统 其参数由main 提供MPI Initialized int flag 检测MPI系统是否已初始化 唯一可在MPI Init 前使用的函数 如已调用MPI Init 返回flag true 否则flag false MPI Comm size 得到通信域的进程数MPI Comm rank 得到通信域内进程的标号MPI Finalize 退出MPI系统 MPI的几个函数 MPI Abort MPI Commcomm interrorcode 异常终止MPI程序 在出现致命错误而希望异常终止MPI程序时执行 MPI系统会设法终止comm通信域中所有进程 输出整型参数errorcode 将被作为进程的退出码返回给系统 MPI Get processor name char name int resultlen 获取处理器名称 在返回的name中存储进程所在处理器的名称 resultlen存放返回名字所占字节 应提供参数name不小于MPI MAX PRCESSOR NAME个字节的存储空间 MPI的几个函数 MPI Get version int version int subversion 获取MPI版本号 若MPI的版本号为2 0 则返回的version 2 subversion 0MPI Wtime void 返回时间 返回调用时刻的时间 用浮点数表示称数 经常用来计算程序运行时间 rank MPI PROC NULL 空进程 使用空进程的通信不做任何操作 向MPI PROC NULL发送的操作总是成功并立即返回 从MPI PROC NULL接收的操作总是成功并立即返回 且接收缓冲区内容为随机数 任意源和任意标识 一个接收操作对消息的选择是由消息的信封管理的 如果消息的信封与接收操作所指定的值source tag和comm相匹配 那么这个接收操作能接收这个消息 此外 接收者可以给source指定一个任意值MPI ANY SOURCE 标识任何进程发送的消息都可接收 即本接收操作可以匹配任何进程发送的消息 但其它的要求还必须满足 如tag的匹配 如果给tag一个任意值MPI ANY TAG 则任何tag都是可以接收的 这类似于统配符的概念 上述两个任意值可以同时使用或分别单独使用 但是不能给comm指定任意值 点对点通信 定义 两个进程之间的通信源进程发送消息到目标进程目标进程接受消息通信发生在同一个通信域内进程通过其在通信域内的标号表示 MPI系统的通信方式都建立在点对点通信之上 四种通信模式 标准通信模式 缓冲通信模式 同步通信模式和就绪通信模式 这四种通信模式是根据以下不同的情况来区分的 1 是否需要对发送的数据进行缓存 2 是否只有当接收调用执行后才可以执行发送操作 3 什么时候发送调用可以正确返回 4 发送调用正确返回是否 意味着发送已完成 即发送缓冲区可否被覆盖 即发送数据是否已到达接收缓冲区 针对这些情况 MPI给出了不同的通信模式 阻塞式和非阻塞式点对点通信 两种消息传递机制 对于阻塞的方式 它必须等到消息从本地送出之后 才可以执行后续的语句 保证了消息缓冲区等资源的可再用性 而非阻塞的方式不须等到消息从本地送出 就可以执行后续的语句 从而允许通信和计算的重叠 利用合适的硬件可使得计算和数据通信同时执行 但是非阻塞调用的返回并不保证资源的可再用性 阻塞和非阻塞点对点通信 阻塞式点对点通信 消息传递成功 发送进程需指定一个有效的目标接收进程 接收进程需指定一个有效的源发送进程 接收和发送消息的进程要在同一个通信域内 接收和发送消息的tag要相同 接收缓冲区要足够大 编写安全的MPI程序 发送和接收是成对出现的 如果通信调用的顺序使用不当 很容易造成死锁 如下程序总会死锁 ACBD 编写安全的MPI程序 进程0的第一条接收语句A能否完成取决于进程1的第二条发送语句 即A依赖于D 从执行次序上可以明显地看出 进程0和进程1发送消息的语句C的执行又依赖于它前面的接收语句A的完成 即C依赖于A 同时 进程1的第一条接收语句B能否完成取决于进程0的第二条发送语句C的执行 即B依赖于C 从执行次序上可以明显地看出 向进程0发送消息的语句D的执行又依赖于B的完成 故有A依赖于D D又依赖于B B依赖于A 形成了一个环 进程0和进程1相互等待 彼此都无法执行下去 必导致死锁 编写安全的MPI程序 若两个进程需要相互交换数据 在两个进程中首先都进行接收调用显然是不合适的 那么 同时先进行发送调用的结果又是如何的呢 ACBD 编写安全的MPI程序 由于进程0或进程1的发送需要系统提供缓冲区 如果缓冲区不足 则进程0或进程1的发送将无法完成 相应的 进程1和进程0的接收也无法正确完成 显然对于需要相互交换数据的进程 直接将两个发送语句写在前面也是不安全的 编写安全的MPI程序 一个安全的通信调用次序 要求两个进程相互交换数据时 一定要将它们的发送和接收操作按照次序进行匹配 即一个进程的发送操作在前 接收操作在后 而另一个进程的接收操作在前 发送操作在后 前后两个发送和接收操作相互匹配 ACDB 编写安全的MPI程序 C的完成只需要A完成 而A的完成只要有对应的D存在 则不需要系统提供缓冲区也可以进行 因此 A总能够完成 那么D也一定能完成 当A和D完成后 B的完成只需要相应的C 不需要缓冲区也能完成 因此B和C也一定能完成 所以这样的通信形式是安全的 阻塞式点对点通信 标准阻塞通信 是否对发送数据进行缓存 由MPI系统决定 而非程序员 阻塞 发送成功 意味 1 消息被接收完毕 2 或者消息被缓存接收成功 消息已被成功接收 阻塞式点对点通信 MPI Send MPI Recv MPI Get count MPI Sendrecv MPI Sendrecv replace 阻塞式点对点通信 查询接收到的消息长度 intMPI Get count MPI Statusstatus MPI Datatypedatatype int count INstatus接收消息时返回的状态INdatatype接收消息时返回的类型OUTCount接收消息时数组元素的个数 该函数在count中返回数据类型的个数 即消息长度 count属于MPI Status结构的一个域 但不能被用户直接访问 阻塞式点对点通信 发送和接收的捆绑 MPI Sendrecv 即把发送一个消息到一个目的地和从另一个进行接收一个消息合并到一个调用中 源和目的可以是相同的 它可以有效地避免单独书写发送或接收操作时 由于次序的错误而造成的死锁 这是因为该操作是由通信系统来实现 系统会优化通信次序 从而有效地避免不合理的通信次序 最大限度地避免死锁的产生 函数原型为 intMPI Sendrecv void sendbuf intsendcount MPI Datatypesendtype intdest intsendtag void recvbuf intrecvcount MPI Datatyperecvtype intsource intrecvtag MPI Commcomm MPI Status status INsendbuf所要发送消息数据的首地址INsendcount发送消息数组元素的个数INsendtype发送消息的数据类型INdest接收消息的进程编号INsendtag发送消息标签 阻塞式点对点通信 OUTrecvbuf接收消息数据的首地址INrecvcount接收消息数组元素的最大个数INrecvtype接收消息的数据类型INSource发送消息的进程编号INrecvtag接收消息标签INcomm通信子OUTstatus接收消息时返回的状态 阻塞式点对点通信 捆绑发送和接收 收发使用同一缓存区 intMPI Sendrecv replace void sendbuf intcount MPI Datatypedatatype intdest intsendtag intsource intrecving MPI Commcomm MPI Status status OUTbuf发送和接收消息数据的首地址INcount发送和接收消息数组元素的个数INdest接收消息的进程编号INsendtag发送消息标签INsource发送消息的进程编号INrecvtag接收消息标签INcomm通信子OUTstatus接收消息时返回的状态 该操作等价于当前进程先执行一个发送函数再执行一个接收函数 MPI系统保证其消息发出后再接收消息 MPI Sendrecv发收使用不同的缓冲区 该函数使用同一缓存区 阻塞式消息发送模式 按着发送方式和接收方状态要求的不同分类 四个函数拥有完全一样的入口参数 共用一个标准的消息接受函数 发送返回后 发送缓存区可以被释放或者重新使用 标准消息发送函数 MPI Send 发送操作不管接收操作是否启动 都可以开始 发送返回的条件 1 当消息小于MPI系统为每个进程设置的最大消息缓存区MPI BUFFER SIZE 发送数据被MPI系统缓存 此时不要求接收操作收到发送数据 2 不缓存 则数据被接收到接收缓存区 缓存消息发送函数 MPI Bsend 发送操作不管接收操作是否启动 都可以开始 进程直接对缓存区进行控制 用户直接对通信缓存区进行申请 使用 翻译 要求 1 发送消息前必须有足够的缓存可用 否则发送失败 2 缓存发送返回后 不意味申请的缓存区可自由使用 须等待消息发送出去方可 优势 发送操作在缓存了发送数据后 可立刻返回 缓存消息发送函数 MPI Bsend 缓存区申请 intMPI Buffer attach void buffer intsize OUTbuffer缓冲区初始地址 OUTsize以字节为单位的缓冲区大小 可调用MPI Type size函数来确定数据类型所占字节数 缓存区大小 数据长度 常数 常数用于MPI系统管理提交的缓存区 是必须的 同一时刻 一个进程只能定义一个缓存区 即进程再定义另一个 需要释放已经定义的 缓存区释放 intMPI Buffer detach void buffer intsize 此函数为阻塞式调用 等到该缓存消息发送后才释放返回 同步消息发送函数 MPI Ssend 发送操作不管接收操作是否启动 都可以开始 发送返回条件 需在标准模式上确认接收方已经开始接收数据 1 发送数据被存放系统缓存区 需接收方开始接收 发送才能返回 2 发送数据没有被系统缓存 则需要消息发送完毕后 发送才能返回 优势 这种模式发送和接收最为安全 就绪消息发送函数 MPI Rsend 发送操作必须要求接收操作启动 才可开始 1 启动接受操作 意味着接收进程正等待接收发送的消息 2 若发送操作启动而相应接收操作没有启动 发送操作将出错 优势 减少消息发送接收时间开销 可能获得好的计算性能 阻塞式消息发送模式 阻塞和非阻塞点对点通信 两种消息传递机制 非阻塞式点对点通信 非阻塞式点对点通信 MPI Isend MPI Irecv MPI Wait MPI Probe MPI Iprobe MPI Request free MPI Cancel MPI Test cancelled 非阻塞式点对点通信 IntMPI Isend void buf intcount MPI Datatypedatatype intdest inttag MPI Commcomm MPI Request request 该函数启动接收 并立即返回 并不意味着发送成功 MPI系统会在后台完成消息发送 函数为该发送操作创建了一个请求 描述非阻塞通信状况 通过request变量返回 request可供之后查询和等待函数使用 非阻塞式发送 非阻塞式点对点通信 IntMPI Irecv void buf intcount MPI Datatypedatatype intsource inttag MPI Commcomm MPI Request request 该函数仅提交了一个消息发送请求 并立即返回 并不意味着接收成功 MPI系统会在后台完成消息接收 函数为该接收创建了一个请求 通过request变量返回 request可供之后查询和等待函数使用 非阻塞式接收 非阻塞式点对点通信 IntMPI Wait MPI Request request MPI Status status IntMPI Test MPI Request request int flag MPI Status status MPI Wait阻塞等待通信函数完成后返回 MPI Test检测某通信 不论其是否完成 都立即返回 如果通信完成 则flag true 当等待或检测的通信完成时 通信请求request被设置成MPI REQUEST NULL 考察接收请求 status返回与MPI Recv一样 发送请求 则不确定 MPI Test返回时 当flag false status不被赋值 等待 检测一个通信请求的完成 非阻塞式点对点通信 MPI Requestrequest MPI Statusstatus intx y if rank 0 MPI Isend 当request标识的通信结束后 MPI Wait 才返回 MPI Wait 应用示例 非阻塞式点对点通信 MPI Requestrequest MPI Statusstatus intx y flag if rank 0 MPI Isend MPI Test 应用示例 非阻塞式点对点通信 IntMPI Waitall intcount MPI Request array of requests MPI Status array of statuses IntMPI Testall intcount MPI Request array of requests int flag MPI Status array of statuses count表示通信请求的个数 array of requests是一组非阻塞通信的请求 array of status返回该组通信完成的状态 flag表示全部通信是否完成 若完成flag true MPI Testall返回时 当flag false array of statuses不被赋值 等待 检测一组通信请求的全部完成 非阻塞式点对点通信 IntMPI Waitsome intincount MPI Request array of requests intoutcount int array of indices MPI Status array of statuses IntMPI Testsome intincount MPI Request array of requests intoutco

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论