[MPI] 非阻塞通信MPI程序设计

学习参考

     《高性能计算之并行编程技术----MPI并行程序设计》 第12章

 

学习笔记

      非阻塞通信

      非阻塞通信主要用于计算和通信的重叠,从而提高整个程序执行的效率,此外,非阻塞通信还可以实现一些特殊的控制功能。

      对于阻塞通信,只需要一个调用函数即可以完成,但是对于非阻塞通信,一般需要两个调用函数,首先是非阻塞通信的“启动”,但启动并不意味该通信过程的完成,因此,为了保证通信的完成,还必须调用与该通信相联系的通信“完成”调用接口,通信完成调用才真正将非阻塞通信完成。

                                      [MPI] 非阻塞通信MPI程序设计 - applesun - 计算机技术学习笔记
                                                                   图 阻塞与非阻塞调用对比

        非阻塞通信的完成

        由于非阻塞通信的返回并不意味着该通信过程的完成,MPI提供了两个调用MPI_WAIT和MPI_TEST用于明确阻塞通信是否完成。

        单个非阻塞通信的完成,主要函数:

        > MPI_WAIT,以阻塞通信对象为参数,一直等到与该非阻塞通信对象相应的非阻塞通信完成才返回,同时释放该阻塞通信对象,因此程序员不需要显示释放该对象。

        > MPI_TEST,也以阻塞通信对象为参数,但是它的返回不一定等到与非阻塞通信对象相联系的非阻塞通信的结束。 若在调用MPI_TEST时,该非阻塞通信已经结束,则它和MPI_WAIT的效果完全相同,完成标志 flag=true; 若在调用MPI_TEST时,该非阻塞通信还没有完成,则它和MPI_WAIT不同,它不必等待该非阻塞通信的完成, 可以直接返回, 但是完成标志 flag=false, 同时也不释放相应的非阻塞通信对象。

         多个非阻塞通信的完成,主要函数:

         > MPI_WAITANY, 用于等待非阻塞通信对象表中任何一个非阻塞通信对象的完成,释放已完成的非阻塞通信对象,然后返回。

         > MPI_WAITALL, 必须等到非阻塞通信对象表中所有的非阻塞通信对象相应的非阻塞操作完成后才返回, 效果上等价于

               DO i=1, COUNT

                        MPI_WAIT(array_of_requests[i], status)

               END DO

          > MPI_WAITSOME,介于MPI_WAITANY和MPI_WAITALL之间,只要有一个或多个非阻塞通信完成,则该调用就返回。

          > MPI_TESTANY, 用于测试非阻塞通信对象表中是否有任何一个对象已经完成,若有对象完成(若有多个非阻塞通信对象完成则从中任取一个)则令 flag=true, 释放该对象后返回; 若没有任何一个非阻塞通信对象完成,则令 fla=false 返回。

          > MPI_TESTALL, 只有当所有的非阻塞通信对象都完成时,才使得flag=true返回,并且释放所有的查询对象, 只要有一个阻塞对象没有完成,则令 flag=false 立即返回。

          > MPI_TESTOME,和MPI_WAITSOME类似, 只不过它可以立即返回。

 

        非阻塞通信对象

        由于非阻塞通信在该调用返回后并不保证通信的完成,因此需要它提供给程序员一些手段来查询通信的状态,MPI调用通过提供给程序员一个"非阻塞通信对象",程序员可以通过对这一对象的查询,得到非阻塞通信的相关信息。 所有的非阻塞发送或接收操作通信都会返回一个“非阻塞通信对象”。

         非阻塞通信取消

          >MPI_CANCEL, 允许取消已调用的非阻塞通信,用取消命令来释放发送或接收操作所占用的资源,该调用立即返回。

          >MPI_TEST_CANCEL, 检查通信操作是否被取消。

         非阻塞通信对象的释放

          > MPI_REQUEST_FREE

         消息到达的检查

         MPI 提供MPI_PROBE 和 MPI_IPROBE 调用,允许程序在不实际执行接收操作的情况下,检查给定的消息是否到达。 程序员可以根据返回的消息决定如何接收该消息,另外,程序员可以根据被检查消息的长度分配缓冲区大小。

         非阻塞通信有序接收的语义约束

         进程A向进程B发送的消息只能被进程B第一个匹配的接收语句接收。

         不管是阻塞通信,还是非阻塞通信, 都保持“顺序接收”的语义约束, 即根据程序的书写顺序, 先发送的消息一定被先匹配的接收调用接收,若实际运行过程中后发送的消息先到达,它也只能等待。

         重复非阻塞通信

         如果一个通信会被重复执行,比如循环结构内的通信调用,MPI提供了特殊的实现方式, 对这样的通信并行优化, 以降低不必要的通信开销, 它将通信参数和 MPI 的内部对象建立固定的联系, 然后通过该对象完成重复通信的任务。 这样的通信方式在 MPI 中都是非阻塞通信。

         重复非阻塞通信需要如下步骤:

         1)通信的初始化,比如 MPI_SEND_INIT

         2) 启动通信, MPI_START

         3) 完成通信, MPI_WAIT , 2) 3) 重复执行

         4) 释放查询对象, MPI_REQUEST_FREE

         >MPI_SEND_INIT

posted on 2012-09-13 23:42  applesun0757  阅读(1718)  评论(0)    收藏  举报