【问题标题】:Julia @everywhere variablesJulia @everywhere 变量
【发布时间】:2014-03-19 20:54:13
【问题描述】:

我正在尝试使用 Julia 并行实现代码。我正在使用 @everywhere 宏来让所有进程从 RemoteRef 获取数据。

是否可以使用仅在 @everywhere 表达式中的第一个进程上定义的变量名,并以某种方式指定我希望它向所有进程发送该变量的值,而不是变量名?

例子:

r = RemoteRef()
put(r, data)
@everywhere data = fetch(r)

这会返回一个错误,因为r 没有在所有进程上定义。

我应该如何将数据移动到所有进程?

另外,我可以告诉 Julia 在表达式中放入值而不是变量名吗? 类似于name = "John"; println("Hello, $name") 将如何打印"Hello, John"

【问题讨论】:

  • 还有这个问题吗?我相信你可以做你想做的事,但是有很多问题,我不确定要解决哪个/如何解决。
  • 我想我已经找到了一个解决方案,将数据作为一个函数的参数,我可以@spawnat 各种进程,但这不是一个很好的解决方案。任何帮助将非常感激。我需要告诉你什么?
  • 很高兴您看到如何将数据作为@spawnat 的参数。如果可以在任何地方复制您的数据,还有其他选择……如果您使用的是 Linux,您也可以使用 SharedArray。需要将数据移动保持在最低限度以提高效率。也许如果你写了一些关于你的“大图”,并行化选项可能会更清楚一些。
  • 我正在尝试制作一个并行受限的 Boltzman 机器。每个进程拥有一部分训练示例。我想向每个进程发送权重矩阵,允许他们根据训练示例确定权重的更新,并将该更新发送回主进程。然后主进程计算新的权重矩阵并将其发送回所有其他进程,以便它们可以再次训练。
  • 我刚刚回答了一个相关问题here 我认为我发布的功能应该可以帮助您完成所需的工作。

标签: multithreading parallel-processing julia


【解决方案1】:

要查找 Spencer 在一个不错的小包中指出的函数(和宏),请查看 ParallelDataTransfer.jl。测试are good examples of usage(CI 显示这些测试在所有平台上都通过了 v0.5)。

对于你的问题,你可以使用sendto函数:

z = randn(10, 10); sendto(workers(), z=z)
@everywhere println(z)

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多