我对Julia相对较新,在尝试平行化时遇到一些问题。 我已经尝试了pmap
和@parallel
两种方法,并遇到同样的问题。 当我运行类似:包装并行代码的方式比非包装更慢
addprocs(7)
A0=zeros(a_size, b_size, c_size)
A=SharedArray{Float64}(a_size,b_size,c_size)
toler=1e-3
maxit=1000
while (metric1>toler) && (iter1<maxit)
`@inbounds` `@sync` `@parallel` for i in 1:c_size
A[:,:,i]=compute_A(fs,A0[:,:,i],i)
end
A_new=sdata(A)
metric1=maximum(abs.((A_new-A0)))
A0=copy(A_new)
iter1=iter1+1
println("$(iter1) $(metric1)")
end
其中函数compute_A
的输入为:
fs
是通过我A0
定义DataType
是一个数组i
被索引I循环(尺寸c_size)
这似乎是工作的罚款(即使不是共享的阵列和@parallel环路我使用pmap)
然而,当我使用的是收官之作功能的代码,如:
wrap(fs::DataType, toler::Float64, maxit::Int)
A0=zeros(a_size, b_size, c_size)
A=SharedArray{Float64}(a_size,b_size,c_size)
while (metric1>toler) && (iter1<maxit)
`@inbounds` `@sync` `@parallel` for i in 1:c_size
A[:,:,i]=compute_A(fs,A0[:,:,i],i)
end
A_new=sdata(A)
metric1=maximum(abs.((A_new-A0)))
A0=copy(A_new)
iter1=iter1+1
println("$(iter1) $(metric1)")
end
end
呼叫此wrap(fs, 1e-3, 1000)
函数运行的方式比另一个更慢(如6 vs 600秒)。 这似乎非常奇怪,我不明白我做错了什么,但肯定有一些我错过了,所以我希望我可以在这里得到一些帮助。 我正在使用Julia v0.6.0。 非常感谢您的时间和帮助。
谢谢@DanGetz!但只是一个澄清,因为我仍然有点困惑与并行计算。所以基本上所有在并行计算的函数中的输入都必须定义为共享数组,如果数组和'@everywhere'如果是常量?谢谢您的帮助! –