正如标题所述:@parallel和之间究竟有什么区别pmap?我并不是说明显的一个是循环的宏而另一个是关于函数的,我的意思是他们的实现究竟是如何不同的,我应该如何使用这些知识在它们之间进行选择?
我问的原因是我写的很多应用程序都可以使用任何一个构造:我可以编写一个循环并用它来计算@parallel,或者将循环中的内容包装到函数中并调用pmap它.我一直在遵循使用@parallel快速评估的内容和pmap每个任务需要更长时间的调用的建议(如文档中所述),但我觉得如果我能更好地理解它正在做什么我会能够做出更好的选择.
例如:@parallel在评估之前是否将工作分开?我注意到如果我运行一个并行循环,其中每个内部调用需要一个随机的时间,@parallel可能需要很长时间,因为最后我只有很少的进程仍在工作.pmap在相同的微型测试中似乎没有这个:是否pmap根据需要重新分配工作?
像这样的其他问题都源于我对pmap不同之处的无知@parallel.
我有一个数组a=rand(100),我想得到除索引值之外的所有值notidx=[2;50].是否有一种干净的方式来获得a其他价值观?我正在寻找一个复制和视图的好方法.
目前我做的阵列[1;3:49;51:100]通过symdiff(1:100,notidx),但a[symdiff(1:length(a),notidx)]并view(a,a[symdiff(1:length(a),notidx)])是不是很干净(或理解别人)这样做的方法.
正如标题所述,不同形式的并行性的开销是多少,至少在Julia的当前实现中是什么(v0.5,以防将来实施剧烈变化)?我正在寻找一些"实用的措施",一些一般的启发式或棒球场,以便在它有用时保留在我的脑海里.例如,很明显多处理不会在循环中获得收益,如:
addprocs(4)
@parallel (+) for i=1:4
rand()
end
Run Code Online (Sandbox Code Playgroud)
并没有给你带来性能提升,因为每个进程只占用一个随机数,但是有没有一般的启发式方法可以知道它什么时候值得?另外,线程启发式怎么样?它肯定比多处理开销更低,但是例如,有4个线程,对于N,多线程是一个好主意:
A = rand(4)
Base.@threads (+) for i = 1:N
A[i%4+1]
end
Run Code Online (Sandbox Code Playgroud)
(我知道现在没有线程缩减,但是让我们表现得像,或者用更好的例子进行编辑).当然,我可以对每个例子进行基准测试,但要记住一些好的规则会有很长的路要走.
用更具体的术语来说:什么是一些好的经验法则?
同样,我不是在寻找硬性规则,只是指导开发的一般指导方针.
我正在寻找Julia中边界检查规则的一些说明.这意味着如果我放在@inboundsfor循环的开头,
@inbounds for ... end
Run Code Online (Sandbox Code Playgroud)
然后只有"一层"的内部传播,所以如果内部有一个for循环,那么@inbounds不会关闭那里的边界检查吗?如果我使用@propagate_inbounds它,它将进入嵌套的for循环?
说@inbounds永远胜利是否正确@boundscheck?如果函数不是内联,但唯一的例外是,刚刚过去的"一层"的规则的情况下,因此@propagate_inbounds将关闭边界的非内联函数调用,即使检查?
我是Github组织的一部分,但是该组织中有一些项目我没有工作,其测试总是失败.有没有办法让它成为所以我不必看到它们?它使我的侧边栏变得混乱,我似乎无法找到隐藏这些项目的方法,至少在没有禁用它们的情况下(这是非常严厉的,不适用于这种情况,我甚至不能这样做因为我不' t拥有一些回购的管理员权限).
我基本上想要做以下事情:
typealias CVODE_BDF CVODE_BDF{:Newton,:Dense}
Run Code Online (Sandbox Code Playgroud)
也就是说,允许用户传递给我的函数CVODE_BDF,如果他们没有设置任何类型参数,则将其解释为CVODE_BDF{:Newton,:Dense}.我知道typealias实际上并没有用,但有没有办法模拟这个?就像在函数中一样,读取T.parameters[1]并以某种方式看到它是空的?
有没有办法检查一个类型是可变的还是不可变的?这个检查是否可以在编译时完成(即将分支if ismutable(T)编译为仅使用代码路径进行可变性或不变性)?
我想让以下广播表达工作:
J = rand(4,4)
fx1 = rand(2,2)
fx2 = rand(2,2)
@. J[:,1] = fx1 + fx2
Run Code Online (Sandbox Code Playgroud)
我真的想要某种:
@. J[:,1] = vec(fx1 + fx2)
Run Code Online (Sandbox Code Playgroud)
这vec说它应该重塑为4x1,但我不想让这个分配.怎么能一般地处理这个问题(即没有对fx进行索引)?
Julia的新手,试图测试ODE求解器的速度.我在教程中使用了Lorenz方程
using DifferentialEquations
using Plots
function lorenz(t,u,du)
du[1] = 10.0*(u[2]-u[1])
du[2] = u[1]*(28.0-u[3]) - u[2]
du[3] = u[1]*u[2] - (8/3)*u[3]
end
u0 = [1.0;1.0;1.0]
tspan = (0.0,100.0)
prob = ODEProblem(lorenz,u0,tspan)
sol = solve(prob,reltol=1e-8,abstol=1e-8,saveat=collect(0:0.01:100))
Run Code Online (Sandbox Code Playgroud)
加载软件包的开始时间约为25秒,代码在Jupyter笔记本电脑的Windows 10四核笔记本电脑上运行了7秒.我知道Julia需要先预编译包,这就是加载时间这么长的原因吗?我发现25秒难以忍受.此外,当我使用不同的初始值再次运行求解器时,运行时间(~1s)要少得多,为什么会这样?这是典型的速度吗?