使用MPI的共享内存

0 投票
1 回答
77 浏览
提问于 2025-04-14 16:59

我想用 multiprocessing 创建一个共享内存块,这样就可以存放一个 numpy 数组,供通过 mpi4py 创建的进程访问。这里有一个基本的教程,详细介绍了如何使用这个功能,链接在这里。我写了一个简单的代码来实现这个功能,并通过终端运行命令 mpirun -np 2 python myscript.py

import numpy as np
from multiprocessing import shared_memory
from mpi4py import MPI

comm = MPI.COMM_WORLD
pid = comm.Get_rank()
npros = comm.Get_size()

npts = 10
dtyp = np.int64

if pid == 0:
    arr = np.arange(npts, dtype=dtyp)
    shm = shared_memory.SharedMemory(create=True, size=arr.nbytes, name='trial')
    brr = np.ndarray(arr.shape, dtype=arr.dtype, buffer=shm.buf)
    brr[:] = arr[:]
    del arr

comm.barrier()

if pid == 1:
    existing_shm = shared_memory.SharedMemory(name='trial')
    crr = np.ndarray((npts), dtype=dtyp, buffer=existing_shm.buf)
    print(crr)

comm.barrier()

if pid == 1:
    del crr
    existing_shm.close()

comm.barrier()

if pid == 0:
    del brr
    shm.close()
    shm.unlink()

不过,它给我抛出了几个警告。

/home/peedaruos/miniconda/envs/py39/lib/python3.9/multiprocessing/resource_tracker.py:216: UserWarning: resource_tracker: There appear to be 1 leaked shared_memory objects to clean up at shutdown
  warnings.warn('resource_tracker: There appear to be %d '
/home/peedaruos/miniconda/envs/py39/lib/python3.9/multiprocessing/resource_tracker.py:229: UserWarning: resource_tracker: '/trial': [Errno 2] No such file or directory: '/trial' warnings.warn('resource_tracker: %r: %s' % (name, e))

我不确定这是否是个问题,或者将来会不会变得严重……

1 个回答

0

你在混用两种不同的并行编程方式。

  1. 你把这个程序当作MPI来运行,这意味着有两个Python进程在同时运行。一个进程创建了一个多进程共享内存的缓冲区,但另一个进程找不到这个缓冲区。

  2. 通常情况下,你会先启动一个Python进程,它创建一个共享缓冲区,然后再启动多个多进程,这些进程可以读取这个缓冲区。显然,它们能看到这个缓冲区,因为它们是从父进程那里获得的。在你的情况中,没有父进程。

撰写回答