我對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'如果是常量?謝謝您的幫助! –