From e507961b12b9fbf606a3c87082409b42e284376a Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Fri, 4 Apr 2025 19:44:20 +0530 Subject: [PATCH 1/3] Generic path in ldiv! for Diagonal --- src/diagonal.jl | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/diagonal.jl b/src/diagonal.jl index 7311f6e1..fa1d5804 100644 --- a/src/diagonal.jl +++ b/src/diagonal.jl @@ -601,10 +601,10 @@ function _rdiv!(B::AbstractVecOrMat, A::AbstractVecOrMat, D::Diagonal) if (k = length(dd)) != n throw(DimensionMismatch(lazy"left hand side has $n columns but D is $k by $k")) end - @inbounds for j in 1:n + @inbounds for j in axes(A,2) ddj = dd[j] iszero(ddj) && throw(SingularException(j)) - for i in 1:m + @simd for i in axes(A,1) B[i, j] = A[i, j] / ddj end end @@ -629,8 +629,20 @@ function ldiv!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat) (m, n) == (m′, n′) || throw(DimensionMismatch(lazy"expect output to be $m by $n, but got $m′ by $n′")) j = findfirst(iszero, D.diag) isnothing(j) || throw(SingularException(j)) - @inbounds for j = 1:n, i = 1:m - B[i, j] = dd[i] \ A[i, j] + _ldiv_Diagonal_loop!(B, D, A) + B +end +function _ldiv_Diagonal_loop!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOrMat) + dd = D.diag + @. B = dd \ A + B +end +function _ldiv_Diagonal_loop!(B::StridedVecOrMat, D::Diagonal, A::StridedVecOrMat) + dd = D.diag + @inbounds for j in axes(A,2) + @simd for i in axes(A,1) + B[i, j] = dd[i] \ A[i, j] + end end B end From d760b6a35566057a9dd62859a8fe38404415fb0d Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Fri, 4 Apr 2025 20:56:58 +0530 Subject: [PATCH 2/3] Revert rdiv! --- src/diagonal.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/diagonal.jl b/src/diagonal.jl index fa1d5804..850e2a53 100644 --- a/src/diagonal.jl +++ b/src/diagonal.jl @@ -604,7 +604,7 @@ function _rdiv!(B::AbstractVecOrMat, A::AbstractVecOrMat, D::Diagonal) @inbounds for j in axes(A,2) ddj = dd[j] iszero(ddj) && throw(SingularException(j)) - @simd for i in axes(A,1) + for i in axes(A,1) B[i, j] = A[i, j] / ddj end end From 548cc056ebfc3d8f9f6201d1223a3b7dcca619be Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Fri, 4 Apr 2025 21:04:20 +0530 Subject: [PATCH 3/3] Remove simd annotation in ldiv! --- src/diagonal.jl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/diagonal.jl b/src/diagonal.jl index 850e2a53..c919f360 100644 --- a/src/diagonal.jl +++ b/src/diagonal.jl @@ -639,10 +639,8 @@ function _ldiv_Diagonal_loop!(B::AbstractVecOrMat, D::Diagonal, A::AbstractVecOr end function _ldiv_Diagonal_loop!(B::StridedVecOrMat, D::Diagonal, A::StridedVecOrMat) dd = D.diag - @inbounds for j in axes(A,2) - @simd for i in axes(A,1) - B[i, j] = dd[i] \ A[i, j] - end + @inbounds for j in axes(A,2), i in axes(A,1) + B[i, j] = dd[i] \ A[i, j] end B end