用于小型计算的Python可伸缩并行处理

2024-04-29 08:41:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,它本质上是数值积分(龙格库塔),用于矢量场中可能有数百个粒子的路径。我已经探索过使用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问题

谢谢你的建议


Tags: fielddt粒子scipydaskyixiinterpolate
1条回答
网友
1楼 · 发布于 2024-04-29 08:41:05

Dask通常用于磁盘或分布式数据处理,在这种特殊情况下,它不是最好的工具

相反,考虑使用Cython/NUBA/PYPY实现数字压缩,例如在您的示例中。这将绕过GIL,将函数预编译到二进制库中,然后CPython可以在本机使用这些库。这将导致5-10倍的加速,具体取决于手头的任务

此外,如果您的粒子可以并行处理,则应该考虑多重处理/射线来进一步利用多个CPU核。p>

如果您执行了这两个步骤,但仍在与性能作斗争,请检查算法渐近性并寻找替代算法

相关问题 更多 >