【问题标题】:Julia - Modules and ParallelismJulia - 模块和并行
【发布时间】:2016-11-28 13:18:03
【问题描述】:

我无法理解如何将工作进程与模块一起使用。我将尝试简单地解释我的困难。

我的主进程(进程 1)上有一个模块,module A

在工作进程上,我有module B,它应该处理大量复杂的计算(并行工作人员通常是这种情况)。

问题在于,似乎需要在工人身上定义module A...

问题在于module Amodule B 大得多,它包含数千行代码,但module B 只使用了大约15 个短函数。

是否有任何解决方法,所以我可以让我的主要工作人员可以访问module A,但工作人员可以访问module B,但能够从module A 中的方法调用工作人员,并让他们运行在他们的@ 中定义的函数987654330@?例如,module B 中可能有一个名为 calculate_stuff() 的方法。

我希望实现的结构类似于:

module A # main worker process using this module 
    function call_worker_and_calculate()
        remotecall_fetch(calculate_stuff, 2)
    end 

    export call_worker_and_calculate
end

module B # worker process 2 is using this module  
    function calculate_stuff()
        # some stuff 
    end 

    export calculate_stuff 
end 

这个特定的例子会返回错误信息:

julia> A.call_worker_and_calculate()
ERROR: On worker 2:
UndefVarError: A not defined

【问题讨论】:

  • 您可以将 A 中的函数更改为接受要作为参数执行的函数,例如 call_worker_and_calculate(f) = remotecall_fetch(f, 2) 并像 A.call_worker_and_calculate(B.calculate_stuff) 一样调用 ist。在任何情况下,B 必须在路径中或使用@everywhere 在每个工作人员上定义。

标签: parallel-processing julia


【解决方案1】:

错误消息很奇怪(我无法用您的代码重现它,您使用的是什么版本?)。所以我不确定这是否能回答你的问题。

如果您想在另一个模块A 中使用来自模块B 的名称,则必须在A 中使用importusing 模块B

为此,B 必须位于 Julia 变量 LOAD_PATH 中包含的路径中,或者在 @everywhere 定义的所有工作人员上定义A 之前,例如,

@everywhere module B  # defined on all workers
    function calculate_stuff()
        # do stuff 
    end 

    export calculate_stuff 
end

module A # only defined on the main worker process
    using B  # introduces calculate_stuff into A's scope because it is exported in B
    function call_worker_and_calculate()
        remotecall_fetch(calculate_stuff, 2)    
    end 

    export call_worker_and_calculate
end

然后A.call_worker_and_calculate() 工作,A 也没有在其他工作人员上定义:

julia> remotecall_fetch(whos,2)
    From worker 2:                               B   4537 bytes  Module
    From worker 2:                            Base  34048 KB     Module
    From worker 2:                            Core  12482 KB     Module
    From worker 2:                            Main  40807 KB     Module

【讨论】:

  • 非常感谢!我昨天放弃并扔掉了我的测试代码,所以我不能 100% 确定我哪里出错了,但我想我没有正确地将模块 B 带入 A 的范围内,即我没有做 using B部分在A。你只是帮我把一个 3000 行的模块加载到 7 个内核上,同时在主模块中添加了 15 个无用的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
相关资源
最近更新 更多