首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个scipy.integrate.ode实例

多个scipy.integrate.ode实例
EN

Stack Overflow用户
提问于 2015-12-15 14:23:18
回答 2查看 3.3K关注 0票数 12

我希望在scipy.integrate.ode (或scipy.integrate.odeint)实例中使用多线程(每个CPU内核一个),以便一次解决多个IVP。然而,文档中说:“这个集成器不是可重入的,不能同时使用”vode“积分器的两个ode实例。”

(如果多次实例化,odeint也会导致内部错误,尽管文档没有这么说。)

知道能做些什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-15 23:54:41

一种选择是使用multiprocessing (即使用进程而不是线程)。下面是一个使用map类的multiprocessing.Pool函数的示例。

函数solve接受一组初始条件,并返回由odeint生成的解决方案。主部分中代码的“串行”版本重复调用solve,对于ics中的每一组初始条件都调用一次。“多处理”版本使用map实例的multiprocessing.Pool函数同时运行多个进程,每个进程调用solvemap函数负责将参数分配给solve

我的电脑有四个核心,当我增加num_processes时,加速比的最大值大约为3.6。

代码语言:javascript
复制
from __future__ import division, print_function

import sys
import time
import multiprocessing as mp
import numpy as np
from scipy.integrate import odeint



def lorenz(q, t, sigma, rho, beta):
    x, y, z = q
    return [sigma*(y - x), x*(rho - z) - y, x*y - beta*z]


def solve(ic):
    t = np.linspace(0, 200, 801)
    sigma = 10.0
    rho = 28.0
    beta = 8/3
    sol = odeint(lorenz, ic, t, args=(sigma, rho, beta), rtol=1e-10, atol=1e-12)
    return sol


if __name__ == "__main__":
    ics = np.random.randn(100, 3)

    print("multiprocessing:", end='')
    tstart = time.time()
    num_processes = 5
    p = mp.Pool(num_processes)
    mp_solutions = p.map(solve, ics)
    tend = time.time()
    tmp = tend - tstart
    print(" %8.3f seconds" % tmp)

    print("serial:         ", end='')
    sys.stdout.flush()
    tstart = time.time()
    serial_solutions = [solve(ic) for ic in ics]
    tend = time.time()
    tserial = tend - tstart
    print(" %8.3f seconds" % tserial)

    print("num_processes = %i, speedup = %.2f" % (num_processes, tserial/tmp))

    check = [(sol1 == sol2).all()
             for sol1, sol2 in zip(serial_solutions, mp_solutions)]
    if not all(check):
        print("There was at least one discrepancy in the solutions.")

在我的计算机上,输出是:

代码语言:javascript
复制
multiprocessing:    6.904 seconds
serial:            24.756 seconds
num_processes = 5, speedup = 3.59
票数 11
EN

Stack Overflow用户

发布于 2018-10-13 18:17:48

SciPy.integrate.ode似乎使用了LLNL日晷解算器,虽然SciPy不使用直白地说,但在我看来,它们应该使用。

CVODE ode解决程序的当前版本3.2.2是可重入的,这意味着它可以用于同时解决多个问题。相关信息出现在CVODE v3.2.0的用户文档(SUNDIALS v3.2.0)中。

cvode用于解决给定问题的所有状态信息都保存在结构中,并将指向该结构的指针返回给用户。cvode包中没有全局数据,因此,在这方面,它是可重入的。特定于线性求解器的状态信息保存在单独的结构中,指向该指针的指针驻留在cvode内存结构中。cvode的重入性是由预期的多计算机扩展驱动的,但在单处理器环境下,通过从单个用户程序中对包的混合调用来解决两个或多个问题也是必不可少的。

但我不知道SciPy.integrate.ode或其他像scikits.odes.ode这样的ode解决程序是否支持这种并发性。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34291639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档