2017-08-07 1 views
1

私は関数を持っていますので、main関数で呼びたいと思います。すべての引数はsharedArrayであり、変数はtypeです。プログラムを実行したいときにエラーが発生しました。JuliaでSharedArrayをどのように呼び出すことができますか?

@everywhere type dty{T <: Real} 
    ...... (some variable) 
end 

@everywhere function func2!(v::dty, 
          out::SharedArray, 
          out2::SharedArray) 
........ 
end 

function func1() 
... 
out = SharedArray{Float64,2}(n,m) 
out2 = SharedArray{Float64,2}(n,m) 
...... 
func2!(v , out, out2) 
end 

エラー:

MethodError: no method matching func2!(::dty{Float64}, ::Array{Float64,2}, ::SharedArray{Float64,2}, ::SharedArray{Float64,2}) 
Closest candidates are: 
    func2!(::dty, ::SharedArray, ::SharedArray) at In[3]:64 

答えて

2

あなただけ

@everywhere function func2!(v, 
          out, 
          out2) 

を定義することができ、それが動作します。これらの発送指定は、パフォーマンスのために何もしません。あなたは、「配列されているもの」にそれを制限したい場合は、あなたが再び

@everywhere function func2!(v, 
          out::AbstractArray, 
          out2::AbstractArray) 

を行うことができ、その後、これはパフォーマンスを傷つけることはありません。また、派遣を設定し、エラーを投げるためだけです。どのようなコードの中で起こったことは、エラーを投げたときoutがなかったときに、out::SharedArrayを持っていたあるSharedArray(それはSharedArrayなかった理由あなたの例では表示されませんが、エラーメッセージがoutMatrixだったと言っている)

+0

私はコードを並列化したいと考えていました。行列は配列2Dであり、typeof(out)を使用するとArrayであることがわかります。だから私はsharedArrayとして使用しました – ReD

+1

あなたがこれを好きなら、あなたがそこに置いた配列に関係なく、各バージョンが動作します。 –

関連する問題