使用@everywhere在julia中传递共享数组

时间:2016-06-06 18:02:43

标签: parallel-processing julia

我发现了这篇帖子 - 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一起使用?

1 个答案:

答案 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