vlc
1
I would like to use the iterative solvers from IterativeSolvers.jl with DistributedArrays.jl, with no luck for now.
Here is a MWE, where I try to invert a diagonal positive definite matrix using the CG algorithm :
using LinearAlgebra, IterativeSolvers, DistributedArrays
n = 100
A = Diagonal(drand(n) .^ 2 .+ √eps())
b = drand(n)
cg(A, b)
The error message mentions some ambiguities in the methods definition, and proposes to implement the following method
copyto!(::DistributedArrays.DArray, ::Base.Broadcast.Broadcasted{T, Axes, F, Args} where {T<:Base.Broadcast.AbstractArrayStyle{0}, Axes, F, Args<:Tuple})
If anyone encountered this issue previously, any tips on how to do this would be greatly appreciated. Thanks!
1 Like
Note this doesn’t work with KrylovKit either:
using LinearAlgebra, KrylovKit, DistributedArrays
n = 100
b = drand(n)
linsolve(x -> b .* x, b, b)
complains about strides(DArray)
. I’d open an issue in the relevant packages.
vlc
3
@antoine-levitt Sure, I did just that here, thanks.
In fact the problem is not too bad:
[1] stride(A::DArray{Float64, 1, Vector{Float64}}, k::Int64)
@ Base ./abstractarray.jl:501
[2] axpby!(alpha::Float64, x::DArray{Float64, 1, Vector{Float64}}, beta::Float64, y::DArray{Float64, 1, Vector{Float64}})
@ LinearAlgebra.BLAS /buildworker/worker/package_linux64/build/usr/share/julia/stdlib/v1.6/LinearAlgebra/src/blas.jl:649
[3] _rmul!(b::KrylovKit.OrthonormalBasis{DArray{Float64, 1, Vector{Float64}}}, G::LinearAlgebra.Givens{Float64})
@ KrylovKit ~/.julia/packages/KrylovKit/OLgKs/src/dense/givens.jl:33
so the problem is that DArrays does not support axpby!. We can fix this:
import LinearAlgebra
LinearAlgebra.axpby!(alpha::Float64, x::DArray{Float64, 1, Vector{Float64}}, beta::Float64, y::DArray{Float64, 1, Vector{Float64}}) = axpby!(alpha, x.localpart, beta, y.localpart)
which works! This should go into a PR on DistributedArrays, but it looks like that package is not actively maintained…
2 Likes