我使用MPI(mpi4py)脚本(在单个节点上),它与一个非常大的对象一起使用.为了让所有进程都可以访问该对象,我通过comm.bcast()分发它.这会将对象复制到所有进程并占用大量内存,尤其是在复制过程中.因此,我想分享像指针而不是对象本身.我发现memoryview中的一些功能对于增强进程内对象的工作非常有用.对象的实际内存地址也可以通过memoryview对象字符串表示来访问,并且可以像这样分发:
from mpi4py import MPI
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
if rank:
content_pointer = comm.bcast(root = 0)
print(rank, content_pointer)
else:
content = ''.join(['a' for i in range(100000000)]).encode()
mv = memoryview(content)
print(mv)
comm.bcast(str(mv).split()[-1][: -1], root = 0)
这打印:
1 0x7f362a405048
2 0x7f362a405048
...
这就是为什么我认为必须有一种方法可以在另一个过程中重建对象.但是,我在文档中找不到有关如何操作的线索.
简而言之,我的问题是:是否可以在mpi4py中的同一节点上的进程之间共享对象?