之前一直使用的matlab,涉及到线程的地方使用parfor,加入开了4个线程,基本可以使程序块运行时间减少4倍。为什么在julia里面调用threads后速度提升并不是很明显啊。举个例子就是求解微分方程,我求解1000组不使用多线程需要60s,但是使用4个线程所需要的时间是40s,而在matlab里面基本就是时间少4倍。请问这个是什么原因啊。
使用的版本是1.4.2
求求你了,上代码吧
using Base.Threads
using DifferentialEquations
using PyCall
@pyimport numpy
#to calculate the odefun with initial conditions
#define laser
omg=0.057
T=2*π/omg
tf=7*T
function GetLaser(omg,I,elli,t)
#linear
E0=sqrt(I/(3.51e16))
T=2*π/omg
#agapi form
#Ex=-E0/omg*(exp(-t^2/421.3428^2)*cos(omg*t)*omg-2*t/421.3428^2*exp(-t^2/421.3428^2)*sin(omg*t))
#f(t) Trapezoidal envelope
Ex=E0*(1.0*(t>=0.0 && t<5*T)+(-t/(2.0*T)+7/2)*(t>=5*T && t<=7*T))*cos(omg*t)
Ey=0.0
Ez=0.0
return [Ex Ey Ez]
end
#define odefun
#p=[omg I elli soft]
function odeHe!(du,u,p,t)
#e1 with n
ne1=(u[1]^2+u[3]^2+u[5]^2+p[4])^(-3/2)
#e2 with n
ne2=(u[7]^2+u[9]^2+u[11]^2+p[4])^(-3/2)
#e1 with e2
e1e2=((u[1]-u[7])^2+(u[3]-u[9])^2+(u[5]-u[11])^2)^(-3/2)
#laser
E=GetLaser(p[1],p[2],p[3],t)
Ex=E[1]
Ey=E[2]
Ez=E[3]
#the direction of k:z direction
Bx=-Ey/137.0
By=Ex/137.0
Bz=0.0
du[1]=u[2]
du[2]=-2.0*u[1]*ne1+(u[1]-u[7])*e1e2-Ex+(u[6]*By-u[4]*Bz)
du[3]=u[4]
du[4]=-2.0*u[3]*ne1+(u[3]-u[9])*e1e2-Ey+(u[2]*Bz-u[6]*Bx)
du[5]=u[6]
du[6]=-2.0*u[5]*ne1+(u[5]-u[11])*e1e2-Ez+(u[4]*Bx-u[2]*By)
du[7]=u[8]
du[8]=-2.0*u[7]*ne2+(u[7]-u[1])*e1e2-Ex+(u[12]*By-u[10]*Bz)
du[9]=u[10]
du[10]=-2.0*u[9]*ne2+(u[9]-u[3])*e1e2-Ey+(u[8]*Bz-u[12]*Bx)
du[11]=u[12]
du[12]=-2.0*u[11]*ne2+(u[11]-u[5])*e1e2-Ez+(u[10]*Bx-u[8]*By)
end
#load initial conditions
iniconditions=numpy.loadtxt("ini.txt")
init=numpy.loadtxt("init.txt")
num=length(iniconditions[:,1])
final=zeros(Float64,num,12)
numthreads=nthreads()
println("num of threads = $numthreads")
@time @threads for i in 1:100
#define p of ode
p=[0.057,2.0e15,0,0.1]
u0=iniconditions[i,:]
tspan=(init[i],tf)
tra=ODEProblem(odeHe!,u0,tspan,p)
sol=solve(tra,Vern7(),reltol=1e-9, abstol=1e-9)
final[i,:]=sol.u[end]
end
就是这样的一个解微分方程的程序,实际使用threads的速度发现不是很高快。使用一个线程大概100组需要7s使用4个线程后100组需要5s,速度提升并不明显
把你的问题详细描述下把,比如把你的微分方程也写出来。你的代码我既读不懂,也运行不起来。
另外,@threads
并不是两个线程就比一个线程快一倍(虽然常常是),我以前也用过 @threads
,大概一个线程要跑十个小时,两个线程5小时,4个线程3小时。
您好,按照您之前的使用经验我大概知道我问题在哪了。我没有去看程序运行后各个线程的运行时间,我遇到的问题恰是各个线程工作量不一样的体现。我直观认为开n个线程速度就应该提升n倍左右,这个理解是我错了,主要之前用matlab的parfor一直觉得是这样的。另外,我想咨询下有没有办法提高线程的效率啊,我想各个线程的工作量尽可能相等以提升效率,目前之前使用@threads各个线程的工作时间差距有些大。或者有没有办法手动分配线程id。谢谢!
你可以试试看 ThreadPools.jl
感谢您的建议,我去试试看
JULIA_NUM_THREADS 是4吗,cpu有几个核
这个用nthreads()看过了 是在自己组里服务器算的 开了60个线程
可以参考下
好的,我去看看
这个包的document在哪查看啊 我在官网没搜到