使用MPI和mpi4py进行内存高效的循环并行化

时间:2014-10-19 20:41:41

标签: 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 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的数量可能非常大,我想仅在根进程上存储posvel,以节省内存。我最初的想法是并行化i - 循环,但每个进程仍然需要完整访问posvel!也就是说,Scatter / Gather方案没有帮助。

我是否被迫在每个进程的内存中都有posvel的副本,或者是否有某种方法可以解决这个问题? 一个简单的方法是在所有进程中共享包含posvel的内存,而不会重复。我不知道这是否可以用MPI(特别是mpi4py)。

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

1 个答案:

答案 0 :(得分:1)

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

给你一个比这更大的答案非常复杂,所以我鼓励你去查看这些想法并回过头来解决具体问题。