Parallel processing 使用MPI和mpi4py实现循环的内存高效并行化

Parallel processing 使用MPI和mpi4py实现循环的内存高效并行化,parallel-processing,multiprocessing,mpi,shared-memory,mpi4py,Parallel Processing,Multiprocessing,Mpi,Shared Memory,Mpi4py,我是新的并行编程和MPI,我被困在这个可能很容易的问题 我试图写一个代码,让N个引力相互作用的粒子系统在时间上向前演化。这是很容易使用一个幼稚的算法,这是我所做的。但现在我想并行化我的代码。具体来说,我是使用mpi4py用Python编写的。一个简化的(并且高度优化,但这不是重点)非并行实现看起来像这样: # pos and vel are arrays storing the positions and velocities of all particles dt = 0.01 # The

我是新的并行编程和MPI,我被困在这个可能很容易的问题

我试图写一个代码,让N个引力相互作用的粒子系统在时间上向前演化。这是很容易使用一个幼稚的算法,这是我所做的。但现在我想并行化我的代码。具体来说,我是使用mpi4py用Python编写的。一个简化的(并且高度优化,但这不是重点)非并行实现看起来像这样:

# 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
-循环,但每个进程仍然需要访问
pos
vel
的整个过程!也就是说,分散/聚集方案没有帮助

是不是每个进程都必须在内存中保存一份
pos
vel
的副本,还是有办法解决这个问题? 一个简单的解决方法是在所有进程中共享包含
pos
vel
的内存,而不进行重复。我不知道这在MPI(特别是mpi4py)中是否可行


任何帮助都将被感激地接受

我认为通常的方法是使用区域分解。您可以将粒子划分为任意多个域(通常每个MPI进程一个域,如果您正在执行多线程,则每个核心一个域)。然后使用ghost区域和MPI通信来定义不同域之间的交互


给你一个比这更大的答案是相当复杂的,所以我鼓励你去看看那些想法,然后带着具体的问题回来。

多处理、共享内存-这是你需要的两个关键词