我应该如何引用完全托管在Julia远程机器上的SharedArray?

时间:2015-11-05 17:54:57

标签: parallel-processing julia

编辑:考虑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上(一个单独的机器上的进程)。名称S1上定义,但在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}之间传输}?

1 个答案:

答案 0 :(得分:1)

你可以让它发挥作用,但有些事情现在比你想要的更尴尬。有关讨论和一些可能的解决方案,请参阅https://github.com/JuliaLang/julia/issues/13802