2017-08-07 80 views
1

我有一個函數,我想在主函數中調用它。所有的參數是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::SharedArray,當再摔一個錯誤,當out不是SharedArray(你的例子並不說明爲什麼這不是一個SharedArray,但錯誤信息是說outMatrix

+0

在我想要平行化代碼之前,這是一個矩陣。但是矩陣是2D數組,當我使用typeof(out)時,我發現它可以是Array。所以我用它作爲sharedArray – ReD

+1

正確,但如果你這樣做,那麼每個版本都可以工作,不管你放在那裏的是什麼數組。 –

相關問題