Parallel processing MPI:所有处理器的共享变量值

Parallel processing MPI:所有处理器的共享变量值,parallel-processing,mpi,Parallel Processing,Mpi,这里有一个关于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 sl

这里有一个关于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)
所以我希望这个程序能打印出如下内容:024

但是这个程序打印出来了:01 2 3 4 5 6 7 8 9


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

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


如果您希望在进程之间共享值,那么您可能需要查看其他内容,例如线程。如果切换到OpenMP,您将失去MPI的分布式功能,但这可能不是您首先需要MPI的原因。使用分布式内存模型(如统一并行C、全局数组等PGAS语言)可以实现这一点,但是您总是会遇到延迟问题,这意味着在一定时间内,列组0和列组1上的值将不同步,除非您有某种保护来实施它。

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

然而,MPI已经有一段时间(自1997年以来)允许类似的事情出现在网络中,比如单边通信;这些数据在(2012年)中进行了重大更新。这种方法可能有真正的优势,但必须小心一点;由于内存不是真正共享的,所以每次更新都需要昂贵的通信,而且由于过度依赖共享状态,很容易意外地在代码中造成严重的可伸缩性/性能瓶颈


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

您的代码广播秩1中的值,该值在每次迭代中递增1,因此是观察到的输出。很抱歉造成误导。我已经更改了代码。我的问题是,在时间1秒时,排名1已经将msg增加到2,但为什么排名0仍然将msg打印为1?我需要一个方法使排名0接受值为2而不是1的消息。排名1广播20次,但排名0只接收前10次更新。这在我的问题中是不可取的。我知道排名0只更新msg十次,但为什么它接受排名1的前10次更新?是否存在一个队列,以便排名0始终遵循消息发送到队列的顺序?谢谢,该示例对我非常有用。我认为我的问题可以通过MPI的单边通信来解决。