我正在做一个项目,它本质上是数值积分(龙格库塔),用于矢量场中可能有数百个粒子的路径。我已经探索过使用Dask并行化任务,但我不确定我的问题是否与Dask的专业一致。通过利用并行处理(每次计算可能需要一分钟),Dask非常适合于对大于内存的数据进行操作。我的问题更多的是10万秒的1秒计算
只是为了说明其中一个计算是什么:
def RK4(field, x0, y0, t0, dt):
k1x, k1y = field.interpolate(x0, y0, t0) #predefined interpolation routine using scipy.interpolate
xi = x0+.5*k1x*dt
yi = y0+.5*k1x*dt
k2x, k2y = field.interpolate(xi, yi, t0+.5*dt)
xi = x0+.5*k2x*dt
yi = y0+.5*k2x*dt
k3x, k3y = field.interpolate(xi, yi, t0+.5*dt)
xi = x0+k3x*dt
yi = y0+k3x*dt
k4x, k4y = field.interpolate(xi, yi, t0+dt)
xi = x0+1/6*(k1x*dt+2*k2x*dt+2*k3x*dt+k4x*dt)
yi = y0+1/6*(k1y*dt+2*k2y*dt+2*k3y*dt+k4y*dt)
return xi, yi, t0+dt
上述操作将在每100个粒子上运行大约100次。在HPC/云上扩展的能力至关重要。理想的情况是一次处理一批粒子,但由于scipy.interpolate依赖性,我有一个GIL问题
谢谢你的建议
Dask通常用于磁盘或分布式数据处理,在这种特殊情况下,它不是最好的工具
相反,考虑使用Cython/NUBA/PYPY实现数字压缩,例如在您的示例中。这将绕过GIL,将函数预编译到二进制库中,然后CPython可以在本机使用这些库。这将导致5-10倍的加速,具体取决于手头的任务
此外,如果您的粒子可以并行处理,则应该考虑多重处理/射线来进一步利用多个CPU核。p>
如果您执行了这两个步骤,但仍在与性能作斗争,请检查算法渐近性并寻找替代算法
相关问题 更多 >
编程相关推荐