1

我创建了一个 DArray:

d = dzeros(3)

现在我想使用 pmap 并行运行一个函数。我希望该函数访问 d 的任何部分在当前处理器上是本地的。就像是

function foo()
    global d
    a = localpart(d)
    a[1] = 1
end

但是,我得到

exception on 2: exception on 4: ERROR: d not defined
 in mcmc_sub! at /home/benjamin/.julia/v0.3/Mamba/src/model/mcmc.jl:67
 in anonymous at multi.jl:847
 in run_work_thunk at multi.jl:613
 in anonymous at task.jl:847

在每个过程中。

d 应该在每个处理器上定义。例如这样的代码有效:

julia> d = dzeros(3)
3-element DArray{Float64,1,Array{Float64,1}}:
 0.0
 0.0
 0.0

julia> @spawnat(2, (a = localpart(d); a[1]=1;))
RemoteRef(2,1,65)

julia> d
3-element DArray{Float64,1,Array{Float64,1}}:
 1.0
 0.0
 0.0
4

1 回答 1

1

我不完全确定没有复制发生,但我的理解是你可以d作为参数传递(它是对整个事物的引用,传递它不会移动数据)。

简单的例子:

function foo(d, u)
    r, = myindexes(d)
    return u * 100000 + sum(d[r])
end

function main()
    d = distribute(1:100)
    show(pmap(x-> foo(d, x), 1:10))
end

# julia -p 2 -L test.jl -e "main()"

我不确定您是否可以通过这种方式分配给分布式数组,您可能想要创建一个新的(逐个);这就是元胞自动机示例中所做的。

于 2014-07-14T03:45:54.343 回答