使用MPI.Win在mpi4py中进行远程内存访问

时间:2018-10-22 17:21:24

标签: python mpi mpi4py numpy-ndarray

我想在等级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版本,那就太好了。

0 个答案:

没有答案