Parallel processing 使用MPI和mpi4py实现循环的内存高效并行化
我是新的并行编程和MPI,我被困在这个可能很容易的问题 我试图写一个代码,让N个引力相互作用的粒子系统在时间上向前演化。这是很容易使用一个幼稚的算法,这是我所做的。但现在我想并行化我的代码。具体来说,我是使用mpi4py用Python编写的。一个简化的(并且高度优化,但这不是重点)非并行实现看起来像这样: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
# 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通信来定义不同域之间的交互
给你一个比这更大的答案是相当复杂的,所以我鼓励你去看看那些想法,然后带着具体的问题回来。多处理、共享内存-这是你需要的两个关键词