我已经编写了Julia代码,在其中我初始化了一个空数组,如下所示:
A= []
在后面的代码中,我简单地推送到这个数组,如下所示:
推
式中b= c,d,e,...是另一个数组,并且每个b可以有不同的长度。
这在非并行化的代码中工作得很好。但是,我想在并行化代码中做同样的事情,其中a= []是不同处理器可以推送到的共享或分布式数组。
SharedArray和DArray都不适合我。有什么建议吗?
发布于 2021-02-20 07:08:59
首先,您应该始终需要声明数组中包含的内容,[]
表示Any[]
,这几乎不是一个好主意。
让我们考虑这个带有占位符的向量:
julia> a=[Int[] for _ in 1:8]
8-element Vector{Vector{Int64}}:
[]
[]
[]
[]
[]
[]
[]
[]
此Vector
包含对其他Vector
的8个引用。
现在让我们分发它:
julia> using Distributed; addprocs(4);
julia> @everywhere using DistributedArrays
julia> b = distribute(a)
8-element DArray{Vector{Int64}, 1, Vector{Vector{Int64}}}:
[]
[]
[]
[]
[]
[]
[]
[]
这个新的b
现在可以通过每个工作进程都持有它的localpart
的所有工作进程来使用。让我们改变它吧!
julia> fetch(@spawnat 2 append!(localpart(b)[1], [1,2,3,4]));
julia> fetch(@spawnat 3 append!(localpart(b)[2], [10,20]));
julia> fetch(@spawnat 3 push!(localpart(b)[2], 30))
3-element Vector{Int64}:
10
20
30
我们可以看到一切都像预期的那样工作(我们已经使用了fetch
来确保我们的代码在远程工作者上执行)。
让我们知道检查主进程的b
状态
julia> b
8-element DArray{Vector{Int64}, 1, Vector{Vector{Int64}}}:
[1, 2, 3, 4]
[]
[]
[10, 20, 30]
[]
[]
[]
[]
您可以看到,我们已经成功地使用远程工作者对b
进行了突变。
https://stackoverflow.com/questions/66276664
复制相似问题