2015-09-09 3 views
2

Я использую сценарий MPI (mpi4py) (на одном узле), который работает с очень большим объектом. Чтобы все процессы имели доступ к объекту, я распространяю его через comm.bcast(). Это копирует объект во все процессы и потребляет много памяти, особенно во время процесса копирования. Поэтому я хотел бы поделиться чем-то вроде указателя вместо самого объекта. Я нашел некоторые функции в memoryview, чтобы повысить работу с объектом внутри процесса. Также реальный адрес памяти объекта доступен через строковое представление memoryview объекта и может быть распределен следующим образом:Общая память в mpi4py

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?

ответ

2

Я не очень много знаю о mpi4py, но это не должно быть возможным с точки зрения MPI. MPI означает интерфейс передачи сообщений, что означает именно то, что: передавать сообщения между процессами. Вы можете попробовать и использовать MPI One-sided communication, чтобы походить на нечто вроде глобальной доступной памяти, но в противном случае память процесса недоступна для других процессов.

Если вам нужно полагаться на большой блок общей памяти, вам нужно использовать что-то вроде OpenMP или потоков, которые вы абсолютно можете использовать на одном узле. Гибридная распараллеливание с MPI и некоторая параллельная разнесенная память позволит вам иметь один общий блок памяти на узел, но все же вариант использования многих узлов.

+1

Этот ответ неверен в свете общей памяти MPI 3.0 (https://software.intel.com/en-us/article s/using-mpi-3-shared-memory-in-xeon-phi-processor) –

+0

@BenThompson OK, вы хотите, чтобы я удалил его или изменил ответ? У меня есть 0 опыта с этой новой функцией ... – haraldkl

0

Вот простой пример общей памяти с использованием MPI, слегка измененный от https://groups.google.com/d/msg/mpi4py/Fme1n9niNwQ/lk3VJ54WAQAJ

Вы можете запустить его с: mpirun -n 2 python3 shared_memory_test.py (предполагая, что вы сохранили его как shared_memory_test.py)

from mpi4py import MPI 
import numpy as np 

comm = MPI.COMM_WORLD 

# create a shared array of size 1000 elements of type double 
size = 1000 
itemsize = MPI.DOUBLE.Get_size() 
if comm.Get_rank() == 0: 
    nbytes = size * itemsize 
else: 
    nbytes = 0 

# on rank 0, create the shared block 
# on rank 1 get a handle to it (known as a window in MPI speak) 
win = MPI.Win.Allocate_shared(nbytes, itemsize, comm=comm) 

# create a numpy array whose data points to the shared mem 
buf, itemsize = win.Shared_query(0) 
assert itemsize == MPI.DOUBLE.Get_size() 
ary = np.ndarray(buffer=buf, dtype='d', shape=(size,)) 

# in process rank 1: 
# write the numbers 0.0,1.0,..,4.0 to the first 5 elements of the array 
if comm.rank == 1: 
    ary[:5] = np.arange(5) 

# wait in process rank 0 until process 1 has written to the array 
comm.Barrier() 

# check that the array is actually shared and process 0 can see 
# the changes made in the array by process 1 
if comm.rank == 0: 
    print(ary[:10]) 

должен вывести это (напечатано с ранга 0):

[0. 1. 2. 3. 4. 0. 0. 0. 0. 0.] 
Смежные вопросы