【问题标题】:Simulating a global variable in MPI在 MPI 中模拟全局变量
【发布时间】:2018-07-29 11:07:56
【问题描述】:

我尝试谷歌但没有找到解决方案

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

现在说来话长。我想为 MPI 的单成本集覆盖问题实现分支定界算法。为此,我需要一种方法让每个进程都知道迄今为止任何其他进程找到的当前全局最优值——这样如果它的当前解决方案变得比目前找到的全局最优值更差,该进程就可以停止分支。某种(同步的)全局变量非常适合。

我想在我的算法中做的事情类似于以下内容。假设有一个全局变量curr_global_min。每个进程在其工作期间不时读取这个变量,并且如果它目前发现的当前最优值小于curr_global_min,则用他的局部最小值更新这个全局变量。我预计更新全局最小值是相当罕见的事件(算法一开始除外)。

显然,我想在不浪费太多计算时间的情况下做到这一点。另一方面,我可以容忍更新中的一些延迟,也就是说,curr_global_min 不一定需要立即发送到所有进程——前提是这样可以节省总计算量时间。

【问题讨论】:

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

标签: synchronization mpi


【解决方案1】:

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

1) 蛮力... 每次您验证是否有新的最小值时,您都会使用 reduce 来计算全局最小值...此解决方案将以 100% 的速度工作,但涉及到大部分时间无用的通信...

2) 着眼于单方面的沟通:这将使您能够完全按照自己的意愿行事。但是当您更新最小值时,您将需要设置一些机制来“阻止”计算。

来自该文档的长引用: http://pages.tacc.utexas.edu/~eijkhout/pcse/html/mpi-onesided.html

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

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

这并不意味着源可以在任意时间访问目标上的任意数据。首先,MPI 中的单向通信仅限于访问目标上明确声明的内存区域:目标声明其他进程可以访问的用户空间内存区域。这被称为窗口。 Windows 限制了源进程如何访问目标的内存:你只能get' data from a window orput' 把它放到一个窗口中;其他进程无法访问所有其他内存。

拥有 windows 的替代方法是使用分布式共享内存或虚拟共享内存:内存是分布式的,但就像共享内存一样。 UPC 等所谓的 PGAS 语言使用这种模型。 MPI RMA 模型可以锁定一个窗口,这使编程稍微麻烦一些,但实现效率更高。

在单向通信中,MPI 有两种模式:主动 RMA 和被动 RMA。在活动 RMA 或活动目标同步中,目标在可以访问其窗口的时间段(“纪元”)上设置边界。这种模式的主要优点是源程序可以执行许多小传输,这些传输是在幕后聚合的。主动 RMA 的行为很像带有结尾 Waitall 的异步传输。

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

我的选择是实施 1) 如果它真的产生了一个很大的瓶颈,那么一旦你的整个代码工作实施 2) 使用主动 RMA(如果你想在几周内因调试而生气,请使用被动的 :-) )

【讨论】:

    猜你喜欢
    • 2013-12-29
    • 1970-01-01
    • 2016-11-15
    • 2013-05-16
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多