Synchronization 在MPI中模拟全局变量

Synchronization 在MPI中模拟全局变量,synchronization,mpi,Synchronization,Mpi,我试着用谷歌搜索,但没有找到解决办法 简短的问题如下:是否可以在MPI中模拟全局变量,这样就不需要进程等待太多时间 长话短说。我想用MPI实现一个用于unicost集合覆盖问题的分支定界算法。为此,我需要一种方法,让每个进程知道到目前为止由任何其他进程找到的当前全局最优值,这样,如果进程的当前解变得比迄今为止找到的全局最优值更差,那么该进程就可以停止分支。某种类型的(同步的)全局变量非常适合这样做 我想在我的算法中做的事情如下。假设有一个全局变量curr\u global\u min。每个过程在

我试着用谷歌搜索,但没有找到解决办法

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

长话短说。我想用MPI实现一个用于unicost集合覆盖问题的分支定界算法。为此,我需要一种方法,让每个进程知道到目前为止由任何其他进程找到的当前全局最优值,这样,如果进程的当前解变得比迄今为止找到的全局最优值更差,那么该进程就可以停止分支。某种类型的(同步的)全局变量非常适合这样做

我想在我的算法中做的事情如下。假设有一个全局变量
curr\u global\u min
。每个过程在其工作过程中会不时读取此变量,如果到目前为止找到的当前最佳值小于当前全局最小值,则会使用其局部最小值更新此全局变量。我预计更新全局最小值是一个相当罕见的事件(除了算法的最开始)


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

这是一个更加复杂的问题,乍一看就可以想到。但是,当您需要依赖于单个秩的状态/计算的全局同步时,这也是一个非常常见的问题。遗憾的是,没有“圣杯”解决方案。有多种解决方案,每种都有优点和缺点。。。让我们为您提供两个最常用的选项:

1) 蛮力。。。 每次验证是否存在新的最小值时,都会使用reduce。。。此解决方案将以100%的速度工作,但涉及的通信在大多数情况下都是无用的

2) 看一下单边沟通:这将允许你做你想做的事情。但是,当您更新最小值时,您需要设置一些机制来“阻止”计算

本文件中的长引用:

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

在单边MPI操作(也称为RDMA或RMA操作)中,仍然涉及两个过程:原始进程,即发起传输的过程,无论是
put'还是
get',以及正在访问内存的目标。与双面操作不同,目标不执行与原点上的操作相对应的操作

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

使用windows的另一种选择是使用分布式共享内存或虚拟共享内存:内存是分布式的,但其行为就好像它是共享的一样。UPC等所谓的PGAS语言使用此模型。MPI RMA模型使锁定窗口成为可能,这使得编程稍微更加繁琐,但实现更加高效

在单边通信中,MPI有两种模式:主动RMA和被动RMA。在主动RMA或主动目标同步中,目标在可访问其窗口的时间段(“历元”)上设置边界。此模式的主要优点是,源程序可以执行许多小型传输,这些传输在幕后聚合。主动RMA的行为非常类似于带结束等待的异步传输

在被动RMA或被动目标同步中,目标进程不限制何时可以访问其窗口。(像UPC这样的PGAS语言就是基于这个模型的:数据可以随意读取或写入。)从直觉上看,能够在任意时间写入和读取目标是很有吸引力的,但也存在一些问题。例如,它需要目标上的远程代理,这可能会干扰主线程的执行,或者相反,它可能不会在最佳时间被激活。被动RMA也很难调试,并可能导致奇怪的死锁


我的选择是实现1)然后如果它真的产生了一个大瓶颈,那么一旦你的整个代码都工作了,就使用主动RMA实现2)(如果你想在几周内对调试感到恼火,就使用被动RMA:-))

如果有人对我想尝试解决的问题的大小感兴趣:元素的总数是9740685,我有759个大小为504152的子集、2576个大小为49140的子集和759个大小为4096的子集。我仍然想知道在一周内在集群上计算是否可行。如果您可以接受一些延迟,您可以发布一个非阻塞接收(
MPI_Recv(…,source=MPI_ANY_source,…)
在所有列组上。当应更新全局变量时,只需将新值发送到所有列组。所有列组应定期检查全局变量是否已使用
MPI\u Test()更新。