在 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()])
我正在尝试在 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()])