编辑:考虑Julia文档中的示例:
$ ./julia -p 2
julia> r = remotecall(2, rand, 2, 2)
RemoteRef(2,1,5)
julia> fetch(r)
2x2 Float64 Array:
0.60401 0.501111
0.174572 0.157411
julia> s = @spawnat 2 1 .+ fetch(r)
RemoteRef(2,1,7)
在最后一行fetch(r)
是否触发数据传输(从进程到自身)还是比它更聪明?即进程2是否使用引用是本地引用的事实,并且在fetch
上调用r
时不启动网络传输? (编辑2:我认为答案是从同一进程中获取变量不会触发传输。)
问题的第二部分:说我在S
上创建了一个SharedArray 1
,其内存完全在2
上(一个单独的机器上的进程)。名称S
在1
上定义,但在2
上未定义,尽管内存已存在。
julia> topo #my network topology separating processes on different machines
Dict{Any,Any} with 3 entries:
36 => [25,26,27,28,29,30,31,32,33,34,35,36]
48 => [37,38,39,40,41,42,43,44,45,46,47,48]
24 => [1,22,23,24]
julia> sas = Dict()
Dict{Any,Any} with 0 entries
julia> for k in keys(topo)
sas[k] = SharedArray(Int, (3,4), init = S -> S[localindexes(S)] = myid(), pids=topo[k])
end
julia> @fetchfrom 36 sum(sas[36])
366
#the memory is definitely on a remote machine
julia> @fetchfrom 1 sum(sas[36])
ERROR: UndefRefError: access to undefined reference
但sas
的字典SharedArrays
不在远程计算机上,因此必须在@fetchfrom
语句中转移。
julia> @everywhere sas
ERROR: On worker 22:
UndefVarError: sas not defined [...]
所以我试图了解是否存在任何变量,例如36
,指向那里可用的内存,而不是在sas
{{1}之间传输}?
答案 0 :(得分:1)
你可以让它发挥作用,但有些事情现在比你想要的更尴尬。有关讨论和一些可能的解决方案,请参阅https://github.com/JuliaLang/julia/issues/13802。