【问题标题】:MPI: shared variable value for all processorsMPI:所有处理器的共享变量值
【发布时间】:2013-07-06 08:23:38
【问题描述】:

这是关于 MPI 的一个问题。我需要两个处理器来不断修改一个变量,并且我希望两个处理器都能访问具有最新值的变量。

from mpi4py import MPI
from time import sleep

comm = MPI.COMM_WORLD
rank = comm.rank
assert comm.size == 2

msg = 0
sec = 10
if comm.rank == 0:
    for i in range(sec):
        print msg
        sleep(1)
        msg = comm.bcast(msg,root = 1)
else:
    for i in range(sec*2):
        msg += 1
        sleep(0.5)
        comm.bcast(msg,root = 1)

所以我希望程序打印如下内容:0 2 4 ...

但程序结果显示:0 1 2 3 4 5 6 7 8 9

我很好奇 mpi4py 中是否有一种机制使得变量 msg 由两个处理器共享?也就是说,每当处理器 1 修改 msg 时,新值立即可供处理器 0 使用。换句话说,我希望处理器 0 访问 msg 而不是等待处理器 1 对 msg 所做的所有更改。

【问题讨论】:

  • 您的代码广播排名 1 的值,该值在每次迭代中递增 1,因此是观察到的输出。
  • 抱歉误导。我已经更改了代码。我的问题是,在 1 秒时,等级 1 已经将 msg 增加到 2,但是为什么等级 0 仍然将 msg 打印为 1?我需要一种方法来使等级 0 接受值为 2 而不是 1 的味精。

标签: parallel-processing mpi


【解决方案1】:

我认为您对分布式内存编程的工作原理感到困惑。在 MPI 中,每个进程(或等级)都有自己的内存,因此当它通过加载/存储操作更改值时(就像您使用 msg += 1 所做的那样),它不会影响另一个变量的值过程。更新远程值的唯一方法是发送消息,您正在使用 comm.bcast() 调用。这会将 msg 的本地值从等级 1 发送到所有其他等级。在此之前,等级 0 无法知道等级 1 上发生了什么。

如果您想在进程之间共享值,那么您可能需要看看其他东西,也许是线程。如果您切换到 OpenMP,您将失去 MPI 的分布式功能,但这可能不是您首先需要 MPI 的。有一些方法可以使用分布式内存模型(例如统一并行 C、全局数组等 PGAS 语言),但您总是会遇到延迟问题,这意味着会有一段时间排名上的值0 和 1 不会同步,除非您有某种保护措施来强制执行它。

【讨论】:

  • Rank 1 广播 20 次,但 Rank 0 只接收前 10 次更新。这在我的问题中是不希望的。我知道等级 0 仅更新 msg 十次,但为什么它接受等级 1 所做的前 10 次更新?是否存在队列以使 0 级始终遵循 msg 发送到队列的顺序?
【解决方案2】:

正如 Wesley Bland 所提到的,这在纯分布式内存环境中实际上是不可能的,因为内存不是共享的。

然而,MPI 已经有一段时间(自 1997 年以来)允许在 MPI-2 中使用类似的内容,作为单方面的通信;这些已在MPI-3 (2012) 中进行了重大更新。这种方法可以有真正的优势,但必须小心一点;由于内存并不是真正共享的,因此每次更新都需要昂贵的通信,并且由于过度依赖共享状态,很容易在代码中意外地造成重大的可伸缩性/性能瓶颈。

Using MPI-2 书中有一个使用 MPI-2 单面通信实现计数器的示例;该计数器的一个简单版本在 C 中描述和实现in this answer。在 mpi4py 发行版中,在“演示”下,在“nxtval”演示中有这些相同计数器的实现;与nxtval-onesided.py 相同的简单计数器和更复杂但更可扩展的实现,也如使用 MPI-2 书中所述,为nxtval-scalable.py。您应该能够在上面的代码中或多或少地使用这些实现中的任何一个。

【讨论】:

  • 谢谢,这个例子对我很有用。我认为我的问题可以通过 MPI 的单方面沟通来解决。
猜你喜欢
  • 2019-12-11
  • 2015-06-08
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 1970-01-01
  • 2021-08-23
相关资源
最近更新 更多