修改:我确实尝试使用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()
似乎也不起作用。
这是怎么回事?
答案 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)
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()
吗?