我试图在另一个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")
行时,我得到上面描述的错误
我做错了什么?
谢谢
答案 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的开发人员知道它,如果这是问题,那么。