在Julia 0.4上检索SharedArray

时间:2016-10-14 15:37:49

标签: arrays parallel-processing julia

修改:我确实尝试使用fetch()

本周我似乎在Julia打破了一些东西。我在具有12个线程(6个doble thread cpu)的计算机上玩过SharedArray类型,我想要获得结果并打印并将其保存为矩阵文本文件而没有问题,或多或少遵循{{3上的说明}}。我有这个例程,我初始化了一些worker和一个Array,将它们作为参数传递给一个函数,并期望得到一个带有数值的SharedArray作为回报。它或多或少地像这样

addprocs(11)
BCero=rand(128,128)
ConjuntoX=Array[]

for j,k=1:128
  push!(ConjuntoX, [j,k])
end


function obtenerKernelParalell(LasB::Array, lasX::Array, jmax::Int)
result=SharedArray(Float64,(jmax,jmax))
@sync @parallel for j=1:jmax
    xj=lasX[j]
     for k=1:j
        xk=lasX[k]
     for l=1:jmax
            xl=lasX[l]
            result[j,k]+= LasB[(xk-xl+xconstante)...]*LasB[(xj-xl+xconstante)...]
    end

    end
end 

end

KSuaveParalel=obtenerKernelParalell(BceroSuave, ConjuntoX,128);

我第一次运行它后得到的是一个表现得像普通数组的数组。如果我输入KSuaveParalel[3,12],我获得了一个值。但现在我从REPL得到了下一件事:     KSuaveParalel

11-element Array{Any,1}:
RemoteRef{Channel{Any}}(2,1,122) 
RemoteRef{Channel{Any}}(3,1,123) 
RemoteRef{Channel{Any}}(4,1,124) 
RemoteRef{Channel{Any}}(5,1,125) 
RemoteRef{Channel{Any}}(6,1,126) 
RemoteRef{Channel{Any}}(7,1,127) 
RemoteRef{Channel{Any}}(8,1,128) 
RemoteRef{Channel{Any}}(9,1,129) 
RemoteRef{Channel{Any}}(10,1,130)
RemoteRef{Channel{Any}}(11,1,131)
RemoteRef{Channel{Any}}(12,1,132)

所以我得到了一系列参考资料......我不知道如何获得它的价值。使用fetch()似乎也不起作用。 这是怎么回事?

2 个答案:

答案 0 :(得分:2)

修改

您需要确保在函数中返回数组。 即return result

您需要在每个远程引用对象上调用fetch()以等待并获取将返回的值。

[fetch(x) for x in KSuaveParalel]

立即返回RemoteRef对象(即在计算实际完成之前)。请参阅此答案(Julia Parallel macro does not seem to work)和文档以获取更多信息。

http://docs.julialang.org/en/release-0.4/stdlib/parallel/#Base.fetch

答案 1 :(得分:0)

Okey,有点想办法,但不是最有效的方法:如果我将函数的结果从SharredArray转换为数组,我得到(显然)正确的结果:

 function obtenerKernelParalell(LasB::Array, lasX::Array, jmax::Int)
     result=SharedArray(Float64,(jmax,jmax))
      @sync @parallel for j=1:jmax
        xj=lasX[j]
             for k=1:j
               xk=lasX[k]
               for l=1:jmax
                  xl=lasX[l]
                  result[j,k]+= LasB[(xk-xl+xconstante)...]*LasB[(xjxl+xconstante)...]
               end

     end
end 
 result=Array(result)
 return result
end

这是因为转换会自动使用正确的设置fetch()吗?