2017-09-26 8 views
0

私は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は私が
  • A0DataTypeを定義しているが、アレイ
  • 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を使用しています。 お時間をいただきありがとうございます。

答えて

0

A0はSharedArrayではなく、グローバルに定義されている場合はすべてのプロセッサで効果的に定義されているため、計算中に通信する必要はありません(A0はあなたの計算では定数であることに気がつきましたか?)

ラップされたバージョンでは、1つのプロセスでローカルに定義され、他のプロセスと絶えず通信されます。したがって、より長い実行時間。

データの局所性が最大である方が良いです。両方包み、開封されたバージョンで

A0 = SharedArray{Float64,3}(a_size,b_size,c_size, 
          init = S -> S[Base.localindexes(S)] .= 0) 

:あなたは使用してゼロのSharedArrayとしてA0を定義した場合。さらに、各プロセッサを1つのプロセッサに保持することが理想的です(nworkers()c_sizeに分割することによって)。

注:質問にコードを入力する前にどのような編集が行われているのかわかりませんが、A0が本当に一定のゼロテンソルである場合は、コードをリファクタリングする方が良いかもしれません。 A0は、いくつかの他のテンソルであれば、試してみてください。

A0 = SharedArray(otherTensor) 

関連参照も良く、プロセッサ間SharedArray 3Dテンソルを分割する方法の詳細SharedArray documentationで、スライスがはるかにパフォーマンスを向上させるためのプロセス内部に残るようにします。

+0

ありがとう@DanGetz!しかし、私はまだ並列コンピューティングとは少し混同しているので、ちょっと説明してください。したがって、基本的に並列で計算される関数内のすべての入力は、配列の場合は共有配列として、定数の場合は '@everywhere 'として定義する必要があります。助けてくれてありがとう! –

関連する問題