Я работаю над проектом, который по сути является численным интегрированием (Рунге-Кутта) для пути потенциально сотен частиц в векторном поле. Я изучал использование Dask для распараллеливания задачи, но я не уверен, соответствует ли моя проблема специализации Dask. Dask подходит для работы с данными, объем которых превышает объем памяти, за счет параллельной обработки (при которой каждое вычисление может занять минуту). Моя проблема - это примерно 100000 вычислений за 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.
Спасибо за любой совет!