我使用一个 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)
这将打印:
<memory at 0x7f362a405048>
1 0x7f362a405048
2 0x7f362a405048
...
因此,我认为一定有一种方法可以在另一个进程中重新构建对象。然而,在文档中我找不到任何线索如何实现它。
简而言之,我的问题是:在mpi4py
中,是否可能在同一节点的进程之间共享对象?