《并行计算的编程模型》一1.5 非阻塞式通信

1.5 非阻塞式通信

非阻塞式通信方式是MPI的重要特性之一。非阻塞式通信初始化后,不需等待通信完成后再进行操作。该特性具有两个优势:一是非阻塞式通信实现了通信与其他计算等操作异步执行;二是针对复杂的通信模式,不需要严格的通信顺序和内存空间管理。为了更好地理解第二个优势,执行如下代码,其中partner是其他进程的进程号。

MPI_Send需要将buf中的1亿个整数发送到partner进程上。若发送操作未申请到内存,程序将处于等待状态,直到内存申请成功。同理,调用MPI_Recv等接收操作后,也需要等待内存申请成功。在本程序示例中,两个进程都先调用MPI_Send执行发送操作,所以程序有可能永远处于等待状态。该程序运行是不安全的,程序能否正确执行依赖于内存申请情况以及发送和接收操作的合理匹配。
针对死锁的问题,经典的解决办法如图1-4所示,
通过改变发送和接收顺序消除进程间等待。该方法仅适用于通信模式简单或者程序编译时通信方式已明确的情况下。复杂的通信模式有时在程序运行时才决定通信方式,从而不适用该方法。针对复杂的通信模式,解决方法是在通信结束前MPI通信操作可以返回,无需等待通信过程结束。在MPI中,这种通信方式称之为非阻塞式通信,通常在函数名称前加入字母“I”,例如MPI_Send的非阻塞发送函数名为MPI_Isend。非阻塞式通信方式的参数设置类似于阻塞式通信方式。非阻塞比阻塞式通信方式增加了一个输出参数MPI_Request。MPI_Request是用于查询操作状态和等待操作完成的句柄。使用非阻塞式通信方式进行发送和接收的程序实例如图1-5所示。用户需要调用一个测试或者等待函数完成通信操作。MPI_Wait函数会阻塞程序执行,直到通信操作完成。MPI_Test函数不会阻塞程序执行,该函数执行后立即返回,用于测试通信操作是否完成。同时,MPI提供组测试和组等待函数,用于同时测试和等待多个通信操作,例如图1-5中MPI_Waitall函数。
在很多应用程序中,需要重复相同的通信方式。针对重复的通信需求,MPI提供重复非阻塞式通信方式,例如通过使用MPI_Send_init和MPI_Recv_init函数实现重复通信初始化。在重复通信模式中,通信操作初始化后并没有启动消息通信,消息通信由MPI_Start函数触发。如果消息通信结束,例如调用MPI_Wait后返回结果,可通过调用MPI_Start再次启动消息通信。当不再需要进行消息通信时,通过调用MPI_Request_free释放通信对象。

时间: 2024-09-07 04:45:04

《并行计算的编程模型》一1.5 非阻塞式通信的相关文章

《并行计算的编程模型》一1.7 单边通信

1.7 单边通信 在点对点通信和聚合通信方式中,发送进程和接收进程共同参与通信过程.MPI提供另外一种通信方式,即单边通信方式.在单边通信方式中,单个进程便可指定发送和接收的数据.单边通信主要用于ARMCI/GA(见第5章).UPC(见第4章)和OpenSHMEM(见第3章)等函数库中,单边通信也可称之为远程内存访问(RMA). 单边通信模型主要分为三部分.第一部分是创建MPI_Win窗口对象,用于可被其他进程访问的内存区域.第二部分是进程间数据移动方式,包含从远程进程上读.写.更新等数据移动方

《并行计算的编程模型》一1.6 聚合通信

1.6 聚合通信 除了进程间点对点的消息通信,MPI还提供大量针对一组进程间通信的函数,基于一组进程的通信称之为聚合通信.聚合通信的进程都需要调用相同的聚合通信函数.通过大量的聚合通信算法研究,聚合通信采用具有高性能的聚合通信实现算法[73,270,284],因此该通信方式在并行编程中广泛应用. 聚合通信有以下三种类型: (1)同步.MPI_Barrier函数用于同步通信域内的所有进程,执行到MPI_Barrier函数的进程必须等待,直到所有进程均执行到MPI_Barrier函数,所有进程才会进

《并行计算的编程模型》一导读

前 言 对于正在编程的程序员,编程模型可被看作一台虚拟机,并可通过编程语言和函数库实现.如果某个编程模型成为计算机科学研究中的热点,需要具有以下特性:高效性(易于描述各种抽象算法).移植性(兼容各种硬件计算平台).高性能(高效均衡地利用硬件平台的计算能力).通用性(广泛地描述各种算法).针对特定的编程模型,同时具有上述四种特性中的一种或两种相对容易,但同时具备这四种特性几乎是不可能的.特定的编程模型无法同时具备四种特性的主要原因在于编程模型的多样性,因此需要根据具体的科学应用,选择不同的编程模型

《并行计算的编程模型》一1.1 引言

第1章 Programming Models for Parallel Computing 消息传递接口 William D. Gropp,伊利诺伊大学厄巴纳–香槟分校 Rajeev Thakur,阿贡国家实验室 1.1 引言 在使用分布式内存编程模型的并行程序中,MPI是一个标准和可移植的通信接口.MPI既为并行通信提供丰富的函数接口,也为并行文件I/O访问等提供函数接口.同时,MPI也支持多程序多数据(MPMD)编程模型.MPI是一种基于库的系统,而非编译器或者编程语言.MPI库函数通过C和

《并行计算的编程模型》一1.3 点对点通信

1.3 点对点通信 点对点通信是MPI中最常用的基础通信模式.一个进程发送数据,另一个进程接收数据.发送进程需要指定发送的数据.接收数据的进程号和通信域.考虑到一些老式消息传递系统,每个消息还有一个消息号,消息号的数据类型为单精度非负整数.同理,接收进程需要指定数据接收地址.数据来源进程号.通信域和消息号.另外,可能需要提供一个消息状态参数,用于保存数据接收的状态信息. 针对早期的消息传递系统和多数文件I/O库,用包含地址和字节数的二元数组指定数据缓冲区.MPI将该二元数组扩展成三元数组,三元数

《并行计算的编程模型》一1.10 MPI开发心得

1.10 MPI开发心得 与其他的编程方法一样,MPI编程需要了解MPI特性,只有掌握MPI编程方法的优点和缺点,才能编写高效的MPI程序.对MPI最重要的认识是MPI属于一种函数库.MPI操作需要至少调用一个或多个MPI函数,针对特别少量的数据传输,MPI编程方法的效率可能不是最高的.因此,若使用MPI编程,在每次数据通信中需传输尽可能多的数据,从而提高通信效率. MPI支持用户构建自己的软件库.相对于在程序中调用MPI函数,利用MPI在程序中实现自定义接口的方法更好.很多应用程序采用自定义接

《并行计算的编程模型》一1.9 其他特性

1.9 其他特性 MPI为大规模并行软件开发和应用提供丰富的函数库.MPI提供一种创新的特性,即为每个MPI函数提供其他的执行方式,从而实现在原有MPI函数中执行特殊代码.若采用PMPI接口,MPI函数存在其他的执行方式,即MPI分析接口.例如,PMPI_Bcast函数是MPI_Bcast函数的另一种执行方式.PMPI提供的函数与MPI中的函数参数和功能一致,区别在于用户通过PMPI可定义自己的MPI函数,如图1-13程序示例所示.若采用图1-13中代码编译程序,当调用MPI_Bcast函数时,

《Java NIO文档》非阻塞式服务器

即使你知道Java NIO 非阻塞的工作特性(如Selector,Channel,Buffer等组件),但是想要设计一个非阻塞的服务器仍然是一件很困难的事.非阻塞式服务器相较于阻塞式来说要多上许多挑战.本文将会讨论非阻塞式服务器的主要几个难题,并针对这些难题给出一些可能的解决方案. 查找关于非阻塞式服务器设计方面的资料实在不太容易,所以本文提供的解决方案都是基于本人工作和想法上的.如果各位有其他的替代方案或者更好的想法,我会很乐意听取这些方案和想法!你可以在文章下方留下你的评论,或者发邮件给我(

Java多线程程序非阻塞式锁定实现

Java对多线程程序的锁定已经有良好的支持,通常使用synchronized修饰一个方法或者一段代码.但是有一个问题,多个线程同时调用同一个方法的时候,所有线程都被排队处理了.该被调用的方法越耗时,线程越多的时候,等待的线程等待的时间也就越长,甚至于几分钟或者几十分钟.对于Web等对反应时间要求很高的系统来说,这是不可以接受的.本文就介绍一种自己实现的锁定方法,可以在没有拿到锁之后马上返回,告诉客户稍候重试. 某一段程序同一时刻需要保证只能单线程调用,那么策略很简单,最先到的线程获取锁成功,在它