在MPI中模拟全局变量

时间:2018-07-23 23:38:42

标签: synchronization mpi

我试图用Google搜索,但没有找到解决方法

简短的问题如下:是否可以在MPI中模拟全局变量,这样它就不需要进程等待太多时间。

长话短说。我想为涵盖MPI问题的unicost集实现分支定界算法。为此,我需要让每个过程都知道到目前为止其他任何过程所找到的当前全局最优方法,以便该过程可以在其当前解决方案变得比目前找到的全局最优解决方案差的情况下停止分支。某种(同步的)全局变量将是完美的选择。

我想在算法中执行的操作类似于以下内容。我们说有一个全局变量curr_global_min。每个进程在其工作期间会不时读取此变量,并且-如果到目前为止找到的当前最优值小于curr_global_min,则会使用其局部最小值更新此全局变量。我预计更新全局最小值是一种相当罕见的事件(除了算法的开始之外)。

很显然,我希望这样做不会浪费太多的计算时间。另一方面,在更新时,我可以容忍某些延迟,也就是说,curr_global_min不一定需要立即发送到所有进程,但这样做可以节省总计算时间。

1 个答案:

答案 0 :(得分:1)

这是一个乍看之下可能会想到的更复杂的问题。但是,当您需要一些依赖于单个等级的状态/计算的全局同步时,这也是一个非常普遍的问题。可悲的是,没有“圣杯”解决方案。解决方案很多,每种都有优点和缺点...让我们给您两个最常用的解决方案:

1)蛮力... 每次您验证是否有新的最小值时,都可以通过减少值来计算全局最小值...该解决方案将以100%的效率工作,但是涉及到交流,大多数情况下都是无用的...

2)审视双方的交流:这将使您能够完全按照自己的意愿去做。但是,当您更新最小值时,您将需要设置某种机制来“阻止”计算。

此文档的一长串引用: http://pages.tacc.utexas.edu/~eijkhout/pcse/html/mpi-onesided.html

上面,您看到了双面类型的点对点操作:它们需要发送方和接收方的配合。这种合作可能很松散:您可以以MPI_ANY_SOURCE作为发送者来发送接收,但是必须同时有发送和接收呼叫。在本节中,您将看到一种单面的通信例程,其中一个进程可以执行put' or get'操作,将数据写入另一个处理器或从另一个处理器读取数据,而无需其他处理器的参与。

在单面MPI操作(也称为RDMA或RMA操作)中,仍然涉及两个过程:origin,它是发起传输的过程,是否是put' or a get',以及正在访问其内存的目标。与双向操作不同,目标不执行与原点上的动作相对应的动作。

这并不意味着源可以在任意时间访问目标上的任意数据。首先,MPI中的单边通信仅限于访问目标上专门声明的内存区域:目标声明了其他进程可访问的用户空间内存区域。这就是所谓的窗口。 Windows限制了原始进程访问目标内存的方式:您只能get' data from a window or将其放入窗口;其他进程无法访问所有其他内存。

使用Windows的替代方法是使用分布式共享内存或虚拟共享内存:内存是分布式的,但就像共享一样。所谓的PGAS语言(例如UPC)使用此模型。 MPI RMA模型使锁定窗口成为可能,这使编程变得稍微麻烦一些,但实现效率更高。

在单向通信中,MPI具有两种模式:主动RMA和被动RMA。在活动RMA或活动目标同步中,目标在可以访问其窗口的时间段(“时期”)上设置边界。这种模式的主要优点是原始程序可以执行许多小的传输,这些传输聚集在幕后。主动RMA的行为非常类似于带有结尾Waitwait的异步传输。

在被动RMA或被动目标同步中,目标进程对何时可以访问其窗口没有任何限制。 (诸如UPC之类的PGAS语言基于此模型:简单地随意读取或写入数据。)虽然直观上可以在任意时间写入和读取目标很有吸引力,但是仍然存在问题。例如,它需要目标上的远程代理,这可能会干扰主线程的执行,或者相反,它可能不会在最佳时间被激活。被动RMA也很难调试,并且可能导致奇怪的死锁。

我的选择是实施1),然后,如果它确实产生了很大的瓶颈,那么一旦您的整个代码工作完成,便实现了2)使用主动RMA(如果您希望在几周内摆脱调试的烦恼,请使用被动式:-) )