5.8 形式化的松同步模型 BACKWARD FORWARD


在本节,我们进一步讨论松同步模型,尤其是组内通信.

5.8.1 基本说明

当一个调用者将一个通信子(包含上下文和组)传给一个被调用者,在整个子程序执行过程中, 该通信子一定不受其它的影响:即应该没有基于该通信子的涉及到进程的唤醒操作.这样就提供了一个写库并安全工作的模型.对于这样指定的库,允许被调用者用通信子作任何它所喜欢的通信,而且在上述保证下,不会有其它通信进行干扰.因为我们允许好的实现来创建没有同步的新通信子(例如在通信子上预分配上下文),这样就没有增加显著的开销.

这种形式的安全性类似于其它一般的计算机科学的使用,例如将一个数组描述符传给一个库函数.此库函数有权期望这个标志符是有效的且可更改的.

5.8.2 执行模型

在松同步模型中,通过使每个执行进程唤醒过程的方法来影响对并行过程的控制传输.该唤醒是一个集合操作:执行组中所有进程都执行它,而且此唤醒命令类似于是对所有进程发出的.但是此唤醒不需要同步。

我们说一个并行过程在某进程内是活动的,仅当该进程属于一个共同执行该过程的组,而且该组内的一些成员当前正在执行该过程的代码.如果一个并行过程在一个进程内是活动的,则此进程可能正在接收属于这个过程的消息,即使它当前没执行此过程的代码.

静态通信子分配

这里包含了这样的情况,在任意时间点,在任意进程内至多有一个唤醒的并行过程是活动的,而且执行进程的组是严格的.例如,所有唤醒的并行过程包含所有的进程,进程是单线索的,且没有递归唤醒.

在这种情况下,通信子可以静态地分配给每个过程.可以在开始作静态分配,作为初始化代码的一部分.如果并行过程可被组织成库,由于在每个处理器上,每个库中仅有一个过程可同时是活动的,因此每个库分配一个通信子就足够了.

动态通信子分配

如果一个新的并行过程总是在执行同一并行过程的组中被唤醒,则并行过程的调用是紧嵌套的. 这样,执行同一并行过程的进程具有同一执行堆栈.

在这种情况下,需要为每一个并行过程的新的唤醒动态分配一个新的通信子.此分配由调用者执行.如果被调用者执行组与调用者执行组相同,则可通过调用MPI_COMM_DUP产生新的通信子; 或者,如果调用者执行组被分成几个执行不同并行函数的子组,则可通过调用MPI_COMM_SPLIT来产生新通信子.新的通信子作为参数传给唤醒函数.

可以减少在每次唤醒都产生一个新通信子的需求,或者在某些情况下,可以避免一起产生:如果执行组不被分割,则我们可以在开始分配一个通信子堆栈,而且可以以模仿递归调用堆栈的方式来管理堆栈.

人们也可以利用通信已排好序的特性来避免调用者与被调用者通信间的混淆, 即使两者都使用同一通信子.为做到这一点,人们需要遵循下面两个规则:

一般情况

一般情况下,可能在同一组内会有对同一并行过程的多重同时活动唤醒;唤醒可能不是紧嵌套的.每次唤醒需要创建一个新的通信子.由用户负责确保两个并行过程在重迭的进程组上被同时唤醒,通信子的创建可以是适当并列的.


Copyright: NPACT BACKWARD FORWARD