我发现了这篇帖子 - Shared array usage in Julia,显然很接近,但我仍然不明白在我的案例中该怎么做。
我正在尝试将共享数组传递给我定义的函数,并使用@everywhere调用该函数。以下,没有共享数组,工作:
@everywhere mat = rand(3,3)
@everywhere foo1(x::Array) = det(x)
然后这个
@everywhere println(foo1(mat))
从每个工人正确地产生不同的结果。现在让我包含一个共享数组:
test = SharedArray(Float64,10)
@everywhere foo2(x::Array,y::SharedArray) = det(x) + sum(y)
然后这个
@everywhere println(foo2(mat,test))
对工人失败了。
ERROR: On worker 2:
UndefVarError: test not defined
等。我可以得到我想要的东西:
for w in procs()
@spawnat w println(foo2(eval(:mat),test))
end
这有效 - 但它是最佳的吗?有没有办法让它与@everywhere一起使用?
答案 0 :(得分:3)
虽然使用"命名变量"很诱人。对于工人来说,如果通过引用访问它们,通常看起来效果会更好。原则上,您可能会这样做:
mat = [@spawnat p rand(3,3) for p in workers()] # process 1 holds references to objects on workers
@sync for (i, p) in enumerate(workers())
@spawnat p foo(mat[i], sharedarray)
end