From 38b932b0296464df4f47e49074dd3672d1d17803 Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Fri, 4 Apr 2025 22:08:50 +0530 Subject: [PATCH 1/2] Inline `generic_matmatmul!` branch in strided triangular matmul --- src/triangular.jl | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/triangular.jl b/src/triangular.jl index a7037e7e..6fcbc0fc 100644 --- a/src/triangular.jl +++ b/src/triangular.jl @@ -144,6 +144,8 @@ const LowerOrUnitLowerTriangular{T,S<:AbstractMatrix{T}} = Union{LowerTriangular const UpperOrLowerTriangular{T,S<:AbstractMatrix{T}} = Union{UpperOrUnitUpperTriangular{T,S}, LowerOrUnitLowerTriangular{T,S}} const UnitUpperOrUnitLowerTriangular{T,S<:AbstractMatrix{T}} = Union{UnitUpperTriangular{T,S}, UnitLowerTriangular{T,S}} +const UpperOrLowerTriangularStrided{T,S<:StridedMatrix{T}} = UpperOrLowerTriangular{T,S} + uppertriangular(M) = UpperTriangular(M) lowertriangular(M) = LowerTriangular(M) @@ -1116,11 +1118,20 @@ for (TA, TB) in ((:AbstractTriangular, :AbstractMatrix), if isone(alpha) && iszero(beta) return _trimul!(C, A, B) else - return generic_matmatmul!(C, 'N', 'N', A, B, alpha, beta) + return generic_matmatmulNN!(C, A, B, alpha, beta) end end end +generic_matmatmulNN!(C, A, B, alpha, beta) = generic_matmatmul!(C, 'N', 'N', A, B, alpha, beta) +# Optimization for strided matrices, where we know that _generic_matmatmul! will be taken +for (TA, TB) in ((:UpperOrLowerTriangularStrided, :StridedMatrix), + (:StridedMatrix, :UpperOrLowerTriangularStrided), + (:UpperOrLowerTriangularStrided, :UpperOrLowerTriangularStrided) + ) + @eval generic_matmatmulNN!(C, A::$TA, B::$TB, alpha, beta) = _generic_matmatmul!(C, A, B, alpha, beta) +end + ldiv!(C::AbstractVecOrMat, A::AbstractTriangular, B::AbstractVecOrMat) = _ldiv!(C, A, B) # generic fallback for AbstractTriangular, directs to 2-arg [l/r]div! _ldiv!(C::AbstractVecOrMat, A::AbstractTriangular, B::AbstractVecOrMat) = From 331d7e236f142a5df8de7d2808e61762dbed1e45 Mon Sep 17 00:00:00 2001 From: Jishnu Bhattacharya Date: Mon, 7 Apr 2025 19:22:39 +0530 Subject: [PATCH 2/2] Rename fn to generic_matmatmul_NN! --- src/triangular.jl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/triangular.jl b/src/triangular.jl index 6fcbc0fc..97b00901 100644 --- a/src/triangular.jl +++ b/src/triangular.jl @@ -1118,18 +1118,18 @@ for (TA, TB) in ((:AbstractTriangular, :AbstractMatrix), if isone(alpha) && iszero(beta) return _trimul!(C, A, B) else - return generic_matmatmulNN!(C, A, B, alpha, beta) + return generic_matmatmul_NN!(C, A, B, alpha, beta) end end end -generic_matmatmulNN!(C, A, B, alpha, beta) = generic_matmatmul!(C, 'N', 'N', A, B, alpha, beta) +generic_matmatmul_NN!(C, A, B, alpha, beta) = generic_matmatmul!(C, 'N', 'N', A, B, alpha, beta) # Optimization for strided matrices, where we know that _generic_matmatmul! will be taken for (TA, TB) in ((:UpperOrLowerTriangularStrided, :StridedMatrix), (:StridedMatrix, :UpperOrLowerTriangularStrided), (:UpperOrLowerTriangularStrided, :UpperOrLowerTriangularStrided) ) - @eval generic_matmatmulNN!(C, A::$TA, B::$TB, alpha, beta) = _generic_matmatmul!(C, A, B, alpha, beta) + @eval generic_matmatmul_NN!(C, A::$TA, B::$TB, alpha, beta) = _generic_matmatmul!(C, A, B, alpha, beta) end ldiv!(C::AbstractVecOrMat, A::AbstractTriangular, B::AbstractVecOrMat) = _ldiv!(C, A, B)