【问题标题】:passing shared array in julia using @everywhere使用 @everywhere 在 julia 中传递共享数组
【发布时间】:2016-10-06 10:48:20
【问题描述】:

我找到了这篇文章 - 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 一起工作?

【问题讨论】:

  • 你试过@everywhere test =...吗?
  • 您能否发布一个可重现的示例,说明您在使用 @spawn 时遇到了性能问题?我认为您使用@spawn 发布的示例末尾没有任何问题,我也无法重现它的性能问题。
  • 在玩更多的东西时,我开始相信,@aireties,性能问题与任何地方的使用无关。我想我在进行比较时混合了其他一些代码差异。所以我为这个不当的帖子道歉。不确定现在应该采取什么正确措施 - 删除帖子?
  • 我认为您不需要删除该帖子,只需稍微编辑一下即可。您报告的最初错误是我认为其他用户可能会遇到的错误,@tholy 的回答对此很有用。我只想删除帖子中对减速的引用,并留下有关错误消息的信息。实际上,我认为您最初提出的问题很好。

标签: parallel-processing julia


【解决方案1】:

虽然在 worker 上使用“命名变量”很诱人,但如果您通过引用访问它们,通常似乎效果更好。从示意图上看,您可能会这样做:

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

【讨论】:

  • 此外,使用@everywhere 启动处理器密集型作业通常不是最理想的。你不希望你的主控制器处理器做繁重的工作,这是 @everywhere 宏可以导致的,无需大量笨拙的代码来避免它。
  • 这似乎是更好的形式,@tholy。但是,它似乎对我不太有效。如果我这样做,mat[i] 是一个远程引用,并且在通过 spawnat 传递时仍然是一个。所以如果 foo 的第一个参数应该是一个数组(我试过了!),我实际上会在工作进程上产生一个错误。我可以通过用 fetch(mat[i]) 替换 mat[i] 来修复它。但这是否真的将 mat[i] 的值拉回进程 1,然后将其发送给进程 p?
  • 由于在我的手机上,我无法对此进行测试。在您的函数中,您应该能够将fetch 添加到您正在运行的函数中。
  • @LeonBalents 我不认为 spawn 与您描述的 fetch 结合应该这样做。 Spawn 意味着命令在工作人员上运行。我还没有尝试过明确地测试它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多