如何创建并推送到共享或分布式数组数组?

2024-04-12

我编写了 Julia 代码,其中初始化一个空数组,如下所示:

a = []

稍后在代码中,我简单地推送到该数组,如下所示:

推![a,b]

其中 b = [c, d, e, ...] 是另一个数组,每个 b 可以具有不同的长度。

这在非并行化代码中工作得很好。但是,我想在并行代码中做同样的事情,其中​​ a = [] 是不同处理器可以推送到的共享或分布式数组。

SharedArray 或 DArray 都不适合我。有什么建议吗?


首先,你应该总是需要声明你在数组中持有什么[] means Any[]这几乎从来都不是一个好主意。

让我们考虑这个带有占位符的向量:

julia> a=[Int[] for _ in 1:8]
8-element Vector{Vector{Int64}}:
 []
 []
 []
 []
 []
 []
 []
 []

This Vector包含 8 条对其他内容的引用Vectors.

现在让我们分发它:

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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建并推送到共享或分布式数组数组? 的相关文章

随机推荐