Я новичок параллельного программирования и MPI, и я застрял на этом, возможно, легкой проблеме ...памяти эффективное распараллеливание цикла с использованием MPI и mpi4py
Я пытаюсь написать код, эволюционировать систему N гравитационно взаимодействующих частиц вперед во времени. Это довольно просто, используя наивный алгоритм, который я и сделал. Но теперь я хочу распараллелить свой код. В частности, я пишу на Python, используя mpi4py. Упрощенная (и сильно оптимизируемыми, но это не точка), не параллельная реализация будет выглядеть примерно так:
# pos and vel are arrays storing the positions and velocities of all particles
dt = 0.01 # The time step
for i in range(N):
for j in range(N):
if i == j:
continue
# Calculate force between i'th and j'th particle
r = pos[j] - pos[i]
force -= r/norm(r)**3
# Update velocity
vel[i] -= dt*force
# Now use vel to update pos ...
Как идти о распараллеливания этого алгоритма? Поскольку число частиц N
может быть очень большим, я хочу хранить pos
и vel
только в корневом процессе, чтобы сохранить память. Моя первоначальная мысль заключалась в том, чтобы распараллелить i
-loop, но для каждого процесса по-прежнему нужен доступ к pos
и vel
полностью! То есть схема Scatter/Gather не помогает.
Должен ли я иметь копию pos
и vel
в памяти для каждого процесса, или есть какой-то выход из этого? Простым выходом будет совместное использование памяти, содержащей pos
, и vel
для всех процессов без дублирования. Я не знаю, возможно ли это с MPI (и, в частности, mpi4py).
Любая помощь была бы с благодарностью принята!
многопроцессорная обработка, общая память - два ключевых слова, которые вам нужны –