我想在等级0进程上创建一个MPI Window对象,在其中放置一个数组,并能够使用其他等级上的MPI.Win.Get()访问该数组的元素。归根结底,我想要的是一个可用于所有级别的数组。该数组的元素不会随时更改,因此我希望这样做是相当安全的。
关于如何使用这些功能的示例代码不多,所以我主要是根据mpi4py本身的测试代码找到自己的方法。有示例代码here,但它不能与我的MPI实现一起运行,如果可能的话,我宁愿找到一个可以在我的安装中使用的解决方案。
我的设置非常简单。我使用conda install -c anaconda mpi4py
安装了mpi4py。 Anaconda也安装了mpich,并且大概正在使用mpich。
这是我到目前为止所拥有的。这将使一个窗口具有足够的空间来容纳等级1上8个字节整数的数组,并将该序列从100到110放置在该等级0的窗口中,并从等级2读取该数组。
import numpy as np
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
Npus = comm.Get_size()
N = 10
ary = None
if rank == 1:
ary = np.ndarray(dtype=np.int64, shape=(N,))
win = MPI.Win.Create(ary, N, comm=comm)
if rank == 0:
arr = np.arange(100, 110, dtype=np.int64)
win.Put((arr, MPI.INTEGER), 1)
if rank == 1:
print(ary)
win.Fence()
if rank == 2:
ar2 = np.ndarray(dtype=np.int64, shape=(N,))
win.Get((ar2, MPI.INTEGER), 1)
win.Free()
我用
mpirun -n 3 python window_test.py
没有一行错误,但是缓冲区ary
在第1级上仍然为空。我确定我缺少明显的东西,但是我找不到任何答案。
感谢您的帮助!
第二次编辑:我发现让mpi4py在启用MPI-3的情况下运行并不像我想的那样困难,并且这样做可以使link here中定义的功能正常工作,所以我我将尝试使用MPI.Win.Allocated_shared(),看看我能想到什么。我仍然想知道是否有人对我提供的示例出了什么问题。 单独说明一下,如果mpi4py的conda软件包自动安装了MPI-3版本,那就太好了。