2.3.9 屏障

最后一个同步机制是准备用于进程组而不是用于双进程的生产者-消费者类情形的。在有些应用中划分了若干阶段,并且规定,除非所有的进程都就绪准备着手下一个阶段,否则任何进程都不能进入下一个阶段。可以通过在每个阶段的结尾安置屏障(barrier)来实现这种行为。当一个进程到达屏障时,它就被屏障阻拦,直到所有进程都到达该屏障为止。屏障的操作如图2-37所示。

阅读 ‧ 电子书库
图 2-37 屏障的使用:a)进程接近屏障;b)除了一个之外所有的进程都被屏障阻塞;c)当最后一个进程到达屏障时,所有的进程一起通过

在图2-37a中可以看到有四个进程接近屏障,这意味着它们正在运算,但是还没有到达每个阶段的结尾。过了一会儿,第一个进程完成了所有需要在第一阶段进行的计算。它接着执行barrier原语,这通常是调用一个库过程。于是该进程被挂起。一会儿,第二个和第三个进程也完成了第一阶段的计算,也接着执行barrier原语。这种情形如图2-37b所示。结果,当最后一个进程C到达屏障时,所有的进程就一起被释放,如图2-37c所示。

作为一个需要屏障的例子,考虑在物理或工程中的一个典型弛豫问题。这是一个带有初值的矩阵。这些值可能代表一块金属板上各个点的温度值。基本想法可以是准备计算如下的问题:要花费多长时间,在一个角上的火焰才能传播到整个板上。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

计算从当前值开始,先对矩阵进行一个变换,从而得到第二个矩阵,例如,运用热力学定律考察在∆T之后的整个温度分布。然后,进程不断重复,随着金属板的加热,给出样本点温度随时间变化的函数。该算法从而随时间变化生成出一系列矩阵。

现在,我们设想这个矩阵非常之大(比如100万行乘以100万列),所以需要并行处理(可能在一台多处理器上)以便加速运算。各个进程工作在这个矩阵的不同部分,并且从老的矩阵按照物理定律计算新的矩阵元素。但是,除非第n次迭代已经完成,也就是说,除非所有的进程都完成了当前的工作,否则没有进程可以开始第n+1次迭代。实现这一目标的方法是通过编程使每一个进程在完成当前迭代部分后执行一个barrier操作。只有当全部进程完成工作之后,新的矩阵(下一次迭代的输入)才会完成,此时所有的进程会被释放而开始新的迭代过程。