在Julia中包含文件:@everywhere include

时间:2018-03-20 03:51:13

标签: import parallel-processing julia

我试图在另一个Julia文件中包含一个带有函数的文件。我可以用

做到
include("ImpurityChainLibrary.jl")

但是,当我这样做时

@everywhere include("ImpurityChainLibrary.jl")

我收到错误(缩短):

ERROR: On worker 3: SystemError: opening file /Users/alex/Documents/Julia/Graphene_Adsorbant_Lattice/ImpurityChainLibrary.jl: No such file or directory ...

我正在运行

Julia Version 0.6.2
Commit d386e40c17 (2017-12-13 18:08 UTC)
Platform Info:
  OS: macOS (x86_64-apple-darwin14.5.0)
  CPU: Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
  WORD_SIZE: 64
  BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
  LAPACK: libopenblas64_
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, skylake)

我使用Atom。

按照下面给出的最小例子,我运行了代码并且它有效。然后,我在与dummy.jl相同的文件夹中创建了第二个文件,并将其放在一行@everywhere include("dummy.jl") 中。

然后我在Atom中启动Julia。我检查nprocs()并获得1.当我执行addprocs(3)时,函数调用通过,nprocs()显示4.当我尝试运行@everywhere include("dummy.jl")行时,我得到上面描述的错误

我做错了什么?

谢谢

2 个答案:

答案 0 :(得分:2)

我认为这个问题被解雇得太快了。可以在Atom环境之外重现该行为。 (我在OSX上使用Julia 0.6.3)

假设您有一个存储库结构:

repo/
   src/
       -MyMod.jl
       -script.jl

包含“MyMod.jl”:

module MyMod
    export f
    f(x) = 5 * x
end

和“script.jl”包含:

@everywhere include("MyMod.jl")
using MyMod

for p in workers()
    @show remotecall_fetch(f, p, p)
end

repo/src/开始,您可以成功运行julia -p 4 script.jl,但是从repo/开始,您无法运行具有多个进程的Julia(即调用julia -p 4 src/script.jl),因为工作进程尝试加载不存在的repo/MyMod.jl

这似乎是因为include解释了与主进程不同的相对路径,而不是工作进程。在主“相对”上似乎是相对于脚本/文件,在工作者上它相对于当前工作目录。

作为我一直在使用的解决方法(**编辑以处理预编译):

function include_everywhere(filepath)
    include(filepath) # Load on Node 1 first, triggering any precompile
    if nprocs() > 1
        fullpath = joinpath(@__DIR__, filepath)
        @sync for p in workers()
            @async remotecall_wait(include, p, fullpath)
        end
    end
end

include_everywhere("MyMod.jl")
using MyMod

我希望这会有所帮助。

答案 1 :(得分:1)

免责声明。因为评论字段太短了,所以我编写了答案:

请在versioninfo()中打印您的Julia版本。例如,我正在运行

julia> versioninfo()
Julia Version 0.6.2
Commit d386e40c17 (2017-12-13 18:08 UTC)
Platform Info:
  OS: Linux (x86_64-pc-linux-gnu)
  CPU: Intel(R) Core(TM) i7-3720QM CPU @ 2.60GHz
  WORD_SIZE: 64
  BLAS: libopenblas (SANDYBRIDGE)
  LAPACK: liblapack
  LIBM: libopenlibm
  LLVM: libLLVM-3.9.1 (ORCJIT, ivybridge)

然后,请务必提供MCVE。根据您在问题中提供的信息,我们 可能无法重现您的错误。原因很简单。在我的机器上检查下面的最小工作示例:

~> mkdir dummy
~> cd dummy/
~/dummy> echo "f(x) = 5x" > dummy.jl
~/dummy> julia --procs 4 --eval '@everywhere include("dummy.jl"); @everywhere @show myid(), f(myid())'
(myid(), f(myid())) = (1, 5)
        From worker 4:  (myid(), f(myid())) = (4, 20)
        From worker 3:  (myid(), f(myid())) = (3, 15)
        From worker 5:  (myid(), f(myid())) = (5, 25)
        From worker 2:  (myid(), f(myid())) = (2, 10)

最有可能的是,在调用@everywhere之前,您有一些代码可以更改目录。确保可以在其他计算机上轻松复制错误。

编辑。我添加了基于OP修改过的问题的最小工作示例:

shell> ls
anotherfile.jl  dummy.jl

shell> cat dummy.jl
f(x) = 5x

shell> cat anotherfile.jl
@everywhere include("dummy.jl")

julia> addprocs(3)
3-element Array{Int64,1}:
 2
 3
 4

julia> nprocs()
4

julia> include("anotherfile.jl")

julia> @everywhere @show myid(), f(myid())
(myid(), f(myid())) = (1, 5)
    From worker 2:  (myid(), f(myid())) = (2, 10)
    From worker 3:  (myid(), f(myid())) = (3, 15)
    From worker 4:  (myid(), f(myid())) = (4, 20)

可以看出,您尝试过的设置即。,添加anotherfile并在其中添加@everywhere include("dummy.jl")行,也可以按预期工作。然后,您应该尝试打开an issue让Atom的开发人员知道它,如果这是问题,那么。