我是并行编程和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
!也就是说,Scatter / Gather方案没有帮助。
我是否被迫在每个进程的内存中都有pos
和vel
的副本,或者是否有某种方法可以解决这个问题?
一个简单的方法是在所有进程中共享包含pos
和vel
的内存,而不会重复。我不知道这是否可以用MPI(特别是mpi4py)。
任何帮助都将被感激地接受!
答案 0 :(得分:1)
我认为通常的方法是使用域分解。您可以根据需要将粒子划分为多个域(如果您正在进行多线程处理,通常每个MPI进程一个或每个核心一个)。然后使用ghost区域和MPI通信来定义不同域之间的交互。
给你一个比这更大的答案非常复杂,所以我鼓励你去查看这些想法并回过头来解决具体问题。