2017-08-07 1 views
1

J'ai une fonction et je veux l'appeler dans la fonction principale. tous les arguments sont sharedArray et nous avons une variable qui est type. quand je veux lancer le programme, j'ai une erreur.Comment pouvons-nous appeler SharedArray dans Julia?

@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 

Erreur:

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 

Répondre

2

Vous pouvez simplement définir

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

et il va travailler. Ces désignations d'expédition ne font rien pour la performance. Si vous voulez limiter à « des choses qui sont des tableaux », vous pouvez le faire

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

Encore une fois, cela ne fait pas mal et la performance est seulement pour la mise en dépêches et en jetant des erreurs. Ce qui est arrivé dans votre code est que vous aviez out::SharedArray, quand il a jeté une erreur quand out était pas un SharedArray (votre exemple ne montre pas pourquoi il n'a pas été un SharedArray, mais le message d'erreur dit out était un Matrix)

+0

out était une matrice avant que je voulais parallèle au code. mais la matrice est le tableau 2D et quand j'utilise typeof (out), je trouve qu'il peut être Array. donc je l'ai utilisé comme sharedArray – ReD

+1

Droit, mais si vous le faites comme ça, alors chaque version fonctionnera, peu importe le tableau que vous mettez là-dedans. –