From b255933106293a3f2deedf77281eb55ef75ef76b Mon Sep 17 00:00:00 2001 From: N5N3 <2642243996@qq.com> Date: Sat, 20 Nov 2021 21:56:46 +0800 Subject: [PATCH 1/2] add `@inline` for `Diagonal`'s 2-arg `l/rdiv!` to enable auto vectorization --- stdlib/LinearAlgebra/src/diagonal.jl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/src/diagonal.jl b/stdlib/LinearAlgebra/src/diagonal.jl index 0025085b2e964..6273ab5df8b45 100644 --- a/stdlib/LinearAlgebra/src/diagonal.jl +++ b/stdlib/LinearAlgebra/src/diagonal.jl @@ -357,7 +357,7 @@ end /(A::AbstractVecOrMat, D::Diagonal) = _rdiv!(similar(A, promote_op(/, eltype(A), eltype(D)), size(A)), A, D) -rdiv!(A::AbstractVecOrMat, D::Diagonal) = _rdiv!(A, A, D) +rdiv!(A::AbstractVecOrMat, D::Diagonal) = @inline _rdiv!(A, A, D) # avoid copy when possible via internal 3-arg backend function _rdiv!(B::AbstractVecOrMat, A::AbstractVecOrMat, D::Diagonal) require_one_based_indexing(A) @@ -378,7 +378,7 @@ end \(D::Diagonal, B::AbstractVecOrMat) = ldiv!(similar(B, promote_op(\, eltype(D), eltype(B)), size(B)), D, B) -ldiv!(D::Diagonal, B::AbstractVecOrMat) = ldiv!(B, D, B) +ldiv!(D::Diagonal, B::AbstractVecOrMat) = @inline ldiv!(B, D, B) function ldiv!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat) require_one_based_indexing(A, B) d = length(D.diag) From aacdc08fba0f5eb5dee297d9427aeec6c4903148 Mon Sep 17 00:00:00 2001 From: N5N3 <2642243996@qq.com> Date: Sat, 20 Nov 2021 22:35:54 +0800 Subject: [PATCH 2/2] Update diagonal.jl replace broadcast with for loop. --- stdlib/LinearAlgebra/src/diagonal.jl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/stdlib/LinearAlgebra/src/diagonal.jl b/stdlib/LinearAlgebra/src/diagonal.jl index 6273ab5df8b45..09562615621a1 100644 --- a/stdlib/LinearAlgebra/src/diagonal.jl +++ b/stdlib/LinearAlgebra/src/diagonal.jl @@ -381,14 +381,18 @@ end ldiv!(D::Diagonal, B::AbstractVecOrMat) = @inline ldiv!(B, D, B) function ldiv!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat) require_one_based_indexing(A, B) - d = length(D.diag) + dd = D.diag + d = length(dd) m, n = size(A, 1), size(A, 2) m′, n′ = size(B, 1), size(B, 2) m == d || throw(DimensionMismatch("right hand side has $m rows but D is $d by $d")) (m, n) == (m′, n′) || throw(DimensionMismatch("expect output to be $m by $n, but got $m′ by $n′")) j = findfirst(iszero, D.diag) isnothing(j) || throw(SingularException(j)) - B .= D.diag .\ A + @inbounds for j = 1:n, i = 1:m + B[i, j] = dd[i] \ A[i, j] + end + B end # Optimizations for \, / between Diagonals