zhh*_*210 4 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
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)
Run Code Online (Sandbox Code Playgroud)
所以我期望程序打印出类似的内容: 0 2 4 ...
但程序结果打印: 0 1 2 3 4 5 6 7 8 9
我很好奇 mpi4py 中是否有一种机制可以使变量msg由两个处理器共享?也就是说,每当处理器 1 修改msg时,新值立即可供处理器 0 使用。换句话说,我希望处理器 0 访问msg的最新值,而不是等待之前的每个更改。由处理器 1 根据消息生成。
我认为您对分布式内存编程的工作原理感到困惑。在 MPI 中,每个进程(或等级)都有自己的内存,因此当它通过加载/存储操作更改值时(就像您对 msg += 1 所做的那样),它不会影响另一个进程上的变量值过程。更新远程值的唯一方法是发送消息,您可以使用 comm.bcast() 调用来执行此操作。msg
这会将排名 1的本地值发送到所有其他排名。到目前为止,等级 0 无法知道等级 1 发生了什么。
如果您想在进程之间共享值,那么您可能需要看看其他东西,也许是线程。如果您切换到 OpenMP,您将失去 MPI 的分布式功能,但这可能不是您最初需要 MPI 的目的。有多种方法可以使用分布式内存模型(例如统一并行 C、全局数组等 PGAS 语言)来实现此目的,但您总是会遇到延迟问题,这意味着排名上的值需要一段时间0 和 1 不同步,除非您有某种保护来强制执行。