私はJuliaには比較的新しいですが、並列化しようとするといくつか問題があります。 私はpmap
と@parallel
のアプローチを試してみましたが、同じ問題が発生しました。 私のようなものを実行すると:機能compute_A
の入力はラップされたパラレルコードの方がラップされていないより遅い
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
:
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)
関数は、他のものよりもWAY SLOWERを実行します(6対600秒のように)。 私は間違っていると分かっていますが、間違っていることは分かりませんが、間違っているものがあるので、ここで助けてくれることを願っています。 Julia v0.6.0を使用しています。 お時間をいただきありがとうございます。
ありがとう@DanGetz!しかし、私はまだ並列コンピューティングとは少し混同しているので、ちょっと説明してください。したがって、基本的に並列で計算される関数内のすべての入力は、配列の場合は共有配列として、定数の場合は '@everywhere 'として定義する必要があります。助けてくれてありがとう! –