Python多进程池运行N体模拟CPU利用率极低问题求助
问题:Python多进程并行N体模拟性能极差
我需要在Python中并行运行大量独立的N体模拟,单个模拟的耗时会因天体参数不同而差异巨大。我采用multiprocessing模块构建进程池,通过starmap()分配任务,并按进程ID将结果保存至不同文件,但并行性能极差:我的笔记本有4核CPU,2进程和4进程之间无加速效果,Unix的time工具显示CPU使用率仅约150%。
以下是我的代码:
import rebound import numpy as np import multiprocessing as mp def two_orbits_one_pool(orbit1, orbit2): ####################################### print('process number', mp.current_process().name) ####################################### # build simulation sim = rebound.Simulation() # add sun sim.add(m=1.) # add two overlapping orbits sim.add(primary=sim.particles[0], m=orbit1['m'], a=orbit1['a'], e=orbit1['e'], inc=orbit1['i'], \ pomega=orbit1['lop'], Omega=orbit1['lan'], M=orbit1['M']) sim.add(primary=sim.particles[0], m=orbit2['m'], a=orbit2['a'], e=orbit2['e'], inc=orbit2['i'], \ pomega=orbit2['lop'], Omega=orbit2['lan'], M=orbit2['M']) sim.move_to_com() # integrate for 10 orbits of orbit1 P = 2.*np.pi * np.sqrt(orbit1['a']**3) sim.automateSimulationArchive("archive-{}.bin".format(mp.current_process().name), interval=P) sim.integrate(10.*P) if __name__ == "__main__": # orbit definitions N_M = 10 N_lop = 10 m = 1e-6 a, e = 1., 0.3 inc, lop, lan = 0., 0., 0. M = np.linspace(0., 2*np.pi, endpoint=False, num=N_M) dlop = np.linspace(0., 0.05, num=N_lop) # orbit dictionaries args = [] for i in range(dlop.shape[0]): for j in range(M.shape[0]): for k in range(M.shape[0]): args.append( ( {'m':m, 'a':a, 'e':e, 'i':inc, \ 'lop':lop, 'lan':lan, 'M':M[j]}, {'m':m, 'a':a, 'e':e, 'i':inc, \ 'lop':lop+dlop[i], 'lan':lan, 'M':M[k]} ) ) # fill the pool with orbit jobs with mp.Pool() as pool: pool.starmap(two_orbits_one_pool, args)
我更熟悉OpenMP和MPI,对Python并行编程不太了解,对multiprocessing模块的表现很失望,考虑尝试使用numba模块。
补充分析
测试分析显示:部分初始条件因天体近距离交会导致积分时间极长,且保存时间约为积分时间的5倍,任务不仅被慢进程拖慢,还受磁盘IO限制。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

