在 Julia 中并行创建稀疏矩阵

Create sparse matrix in parallel in Julia

我正在尝试在 Julia 中并行创建稀疏矩阵。受此启发 post this post 我正在尝试这样做:

using Distributed
addprocs(4)
@everywhere using DistributedArrays

rows = [Int[] for _ in procs()]
cols = [Int[] for _ in procs()]
vals = [Float64[] for _ in procs()]
distribute(rows)
distribute(cols)
distribute(vals)

@sync @distributed for i = 1:1000
    for j = 1:1000
        v = exp(-(i - j)^2)
        if v > 0.1
            push!(localpart(rows)[1], i)
            push!(localpart(cols)[1], j)
            push!(localpart(vals)[1], v)
        end
    end
end

ROWS = vcat(rows...)
COLS = vcat(cols...)
VALS = vcat(vals...)

K = sparse(ROWS, COLS, VALS)
# K = 0×0 SparseMatrixCSC{Float64, Int64} with 0 stored entries

这会输出一个空矩阵,并且不会被填充。但是我发现如果我调用 @fetchfrom 2 rows,它创建的行不是空的。所以看起来它只是没有结合所有东西。

我该如何解决这个问题?

distribute(rows)不修改rows进行分发;它 returns 一个新的分布式数组,其中填充了输入。你必须处理它的结果,比如

rows = distribute([Int[] for _ in procs()])