在IJulia笔记本

时间:2017-05-23 03:08:55

标签: python numpy parallel-processing julia ijulia-notebook

我想在IJulia笔记本中运行一个使用python库numpy的简单代码。我用PyCall调用numpy:

  

使用PyCall

     

@pyimport numpy as np

这很好用。然后我想把它分成几个处理器。我添加处理器:

  

addprocs(4)

然后,我为函数f运行N / proc迭代,其中proc是我的处理器数。我在计算机上的四个处理器之间均匀分配负载:

n=round(Int,N/proc);

proc_sum = @parallel (+) for i=1:proc

        f(n)

end

return proc_sum / proc

没有numpy,这很好用。但是,当我尝试将numpy代码拆分到不同的处理器时,我收到错误

  

错误(未处理的任务失败):在工人3上:

     

UndefVarError:np未定义

有没有办法在其他处理器上进行numpy工作?请注意,我有朱莉娅0.5.2,我有冠层。我知道之前有过与PyCall和Canopy有关的问题,但我更希望将Canopy保留在我的机器上。

2 个答案:

答案 0 :(得分:2)

为了进一步扩展已经说过的内容,您需要的所有内容都应该加载到所有进程中。 E. g。 :

addprocs(4) @everywhere using PyCall @everywhere @pyimport numpy as np

您编写的内容是错误的,因为所有进程都尝试使用@pyimport,但只有主进程加载了PyCall。如果您需要许多软件包来进行计算,可能更容易在一个脚本中完成所有加载,即load_modules.jl然后只需运行

addprocs(4) @everywhere include("load_modules.jl")

编辑:似乎using@everywhere不是很强大(修正在Julia 0.6上,请参阅here)。似乎更好的是:

addprocs(4) import PyCall @everywhere using PyCall @everywhere @pyimport numpy as np

答案 1 :(得分:0)

我正在扩展Lyndon的评论,以提供更全面的答案。

根据the documentation,流程是独立的,因此依赖于他们自己的独立工作空间。因此,需要首先将流程所需的任何功能,模块或变量提供给该流程。

如果要为所有现有流程提供某些功能,可以使用<article onclick> <h2 id="Foo">My awesome blog post title</h2> <p>This is the excerpt...</p> <a aria-labelledby="Foo" href>Read More</a> </article> 宏;显然,要为所有现有流程提供可用的东西,需要首先创建这些流程。

所以:

@everywhere
相关问题