Julia 朱莉娅:并行构建多个类型
我试图在Julia中使用并行性来构造几个大类型(特别是,通过sklearn-through-PyCall构建高斯混合模型) 如果我在系列中这样做,我会:Julia 朱莉娅:并行构建多个类型,julia,Julia,我试图在Julia中使用并行性来构造几个大类型(特别是,通过sklearn-through-PyCall构建高斯混合模型) 如果我在系列中这样做,我会: models = Array(GMM, N) for i = 1 : N params = ... models[i] = train_gmm(params) end 然而,我应该能够做到这一点是平行的。我不知道从哪里开始,因为ShareDarray和@parallel对我来说似乎不合适 我试图使用@spawn,但发现以下内容
models = Array(GMM, N)
for i = 1 : N
params = ...
models[i] = train_gmm(params)
end
然而,我应该能够做到这一点是平行的。我不知道从哪里开始,因为ShareDarray和@parallel对我来说似乎不合适
我试图使用@spawn,但发现以下内容:
function f1()
rand(10000000)
rand(10000000)
rand(10000000)
rand(10000000)
rand(10000000)
end
function f2()
a = @spawn rand(10000000)
b = @spawn rand(10000000)
c = @spawn rand(10000000)
d = @spawn rand(10000000)
e = @spawn rand(10000000)
a_r = fetch(a)
b_r = fetch(b)
c_r = fetch(c)
d_r = fetch(d)
e_r = fetch(e)
end
f1()
f2()
println(@elapsed(f1()))
println(@elapsed(f2()))
f1需要0.21秒,f2需要0.32秒!关于@spawn,我有什么遗漏吗
编辑
看起来像是在做:
function f1()
[sum(rand(100000000)),
sum(rand(100000000)),
sum(rand(100000000)),
sum(rand(100000000)),
sum(rand(100000000))]
end
function f2()
a = @spawn sum(rand(100000000))
b = @spawn sum(rand(100000000))
c = @spawn sum(rand(100000000))
d = @spawn sum(rand(100000000))
e = @spawn sum(rand(100000000))
[fetch(a), fetch(b), fetch(c), fetch(d), fetch(e)]
end
使f2()比f1()运行得更快,并且更符合我的要求。除非有人有更好的,正式的方法,否则我会同意
谢谢。我想你的编辑是正确的
IAINMAC:~ idunning$ julia -p 3
julia> @everywhere function foo()
sleep(2)
end
julia> @time [foo(), foo(), foo()]
elapsed time: 6.017959282 seconds (294088 bytes allocated)
3-element Array{Nothing,1}:
nothing
nothing
nothing
julia> function bar()
a = @spawn foo()
b = @spawn foo()
c = @spawn foo()
[fetch(a), fetch(b), fetch(c)]
end
bar (generic function with 1 method)
julia> @time bar()
elapsed time: 2.030760103 seconds (199720 bytes allocated)
3-element Array{Nothing,1}:
nothing
nothing
nothing
或者更优雅地使用pmap
:
julia> @everywhere function foo(a::Int)
sleep(a)
end
julia> @time pmap(foo,1:3)
elapsed time: 3.004821524 seconds (448540 bytes allocated)
3-element Array{Any,1}:
nothing
nothing
nothing
julia> @time map(foo,1:3)
elapsed time: 6.006557822 seconds (1368 bytes allocated)
3-element Array{Nothing,1}:
nothing
nothing
nothing
非常感谢。将
fetch
调用放在数组中是否会强制所有调用同时执行?fetch
是阻塞,所以我想它们是按顺序阻塞的,但我不确定(我想也没关系)。这就是为什么使用pmap更好的原因,因为它将启动前N个任务,并且一旦有任何返回,它将启动一个新的任务。