在JULIA的分布式for循环中写入共享数组

在JULIA的分布式for循环中写入共享数组,julia,differential-equations,plots.jl,differentialequations.jl,Julia,Differential Equations,Plots.jl,Differentialequations.jl,我有一个ODE,我需要在广泛的参数范围内求解。 之前,我使用MATLAB的parfor在多个线程之间划分参数范围。我是朱莉娅的新手,现在需要在朱莉娅身上做同样的事情。这是我正在使用的代码 using DifferentialEquations, SharedArrays, Distributed, Plots function SingleBubble(du,u,p,t) du[1]=@. u[2] du[2]=@. ((-0.5*u[2]^2)*(3-u[2]/(p[4])

我有一个ODE,我需要在广泛的参数范围内求解。 之前,我使用MATLAB的parfor在多个线程之间划分参数范围。我是朱莉娅的新手,现在需要在朱莉娅身上做同样的事情。这是我正在使用的代码

using DifferentialEquations, SharedArrays, Distributed, Plots


function SingleBubble(du,u,p,t)
    du[1]=@. u[2]
    du[2]=@. ((-0.5*u[2]^2)*(3-u[2]/(p[4]))+(1+(1-3*p[7])*u[2]/p[4])*((p[6]-p[5])/p[2]+2*p[1]/(p[2]*p[8]))*(p[8]/u[1])^(3*p[7])-2*p[1]/(p[2]*u[1])-4*p[3]*u[2]/(p[2]*u[1])-(1+u[2]/p[4])*(p[6]-p[5]+p[10]*sin(2*pi*p[9]*t))/p[2]-p[10]*u[1]*cos(2*pi*p[9]*t)*2*pi*p[9]/(p[2]*p[4]))/((1-u[2]/p[4])*u[1]+4*p[3]/(p[2]*p[4]))
end

R0=2e-6
f=2e6
u0=[R0,0]
LN=1000

RS = SharedArray(zeros(LN))
P = SharedArray(zeros(LN))
bif = SharedArray(zeros(LN,6))

 @distributed     for i= 1:LN
    ps=1e3+i*1e3
    tspan=(0,60/f)
    p=[0.0725,998,1e-3,1481,0,1.01e5,7/5,R0,f,ps]
    prob = ODEProblem(SingleBubble,u0,tspan,p)
    sol=solve(prob,Tsit5(),alg_hints=:stiff,saveat=0.01/f,reltol=1e-8,abstol=1e-8)
    RS[i]=maximum((sol[1,5000:6000])/R0)
    P[i]=ps
    for j=1:6
          nn=5500+(j-1)*100;
          bif[i,j]=(sol[1,nn]/R0);
     end
end


plotly()
scatter(P/1e3,bif,shape=:circle,ms=0.5,label="")#,ma=0.6,mc=:black,mz=1,label="")


当使用一个辅助线程时,for循环基本上是作为一个普通的单线程循环执行的,并且工作良好。但是,当我使用addprocs(n)添加n个工人时,没有任何内容写入到sharedarray RS、P和bif中。我感谢任何人提供的任何指导。

这些更改是使您的程序与多个工作人员一起工作并显示所需结果所必需的:

  • @分布式
    循环下使用的任何包和函数都必须在使用
    @everywhere
    的所有进程中可用,如前所述。因此,在您的例子中,它将是
    微分方程
    SharedArrays
    包以及
    SingleBubble()
    函数
  • 只有在所有工人完成任务后,才需要绘制绘图。为此,您需要与
    @distributed
    一起使用
  • 通过这些更改,您的代码将如下所示:

    using Distributed, Plots
    
    @everywhere using DifferentialEquations, SharedArrays
    
    @everywhere function SingleBubble(du,u,p,t)
        du[1]=@. u[2]
        du[2]=@. ((-0.5*u[2]^2)*(3-u[2]/(p[4]))+(1+(1-3*p[7])*u[2]/p[4])*((p[6]-p[5])/p[2]+2*p[1]/(p[2]*p[8]))*(p[8]/u[1])^(3*p[7])-2*p[1]/(p[2]*u[1])-4*p[3]*u[2]/(p[2]*u[1])-(1+u[2]/p[4])*(p[6]-p[5]+p[10]*sin(2*pi*p[9]*t))/p[2]-p[10]*u[1]*cos(2*pi*p[9]*t)*2*pi*p[9]/(p[2]*p[4]))/((1-u[2]/p[4])*u[1]+4*p[3]/(p[2]*p[4]))
    end
    
    R0=2e-6
    f=2e6
    u0=[R0,0]
    LN=1000
    
    RS = SharedArray(zeros(LN))
    P = SharedArray(zeros(LN))
    bif = SharedArray(zeros(LN,6))
    
    @sync @distributed     for i= 1:LN
        ps=1e3+i*1e3
        tspan=(0,60/f)
        p=[0.0725,998,1e-3,1481,0,1.01e5,7/5,R0,f,ps]
        prob = ODEProblem(SingleBubble,u0,tspan,p)
        sol=solve(prob,Tsit5(),alg_hints=:stiff,saveat=0.01/f,reltol=1e-8,abstol=1e-8)
        RS[i]=maximum((sol[1,5000:6000])/R0)
        P[i]=ps
        for j=1:6
              nn=5500+(j-1)*100;
              bif[i,j]=(sol[1,nn]/R0);
         end
    end
    
    
    plotly()
    scatter(P/1e3,bif,shape=:circle,ms=0.5,label="")#,ma=0.6,mc=:black,mz=1,label="")
    
    使用多个辅助对象的输出:

    您能展示一下您是如何在代码中使用addprocs(n)的吗?在运行上述代码之前,我会在终端中执行addprocs(4)非常感谢!这就解决了问题。我有一台机器,可以处理64名工人,他们所有人的包裹装载过程都需要相当长的时间。有没有办法加快速度?在中更改拓扑addprocs@ChrisRackauckas我对朱莉娅很陌生。你能再描述一下吗?我知道我可以使用CU阵列来解决GPU上的ODE。如何在GPU上并行求解具有不同初始条件的ODE?“提前谢谢你!”侯赛因先生稍等片刻。我们将发布一篇博文,解释如何在大约2年内使用它months@ChrisRackauckas令人惊叹的!谢谢你提醒我!