Skip to content

Commit 0671a7b

Browse files
authored
Simplify small Bidiagonal-AbstractVecOrMat multiplication (#1278)
Writing the base case out as an explicit loop helps with TTFX ```julia julia> using LinearAlgebra julia> T = Bidiagonal(ones(4), ones(3), :U); AT = Matrix(T); x = UpperTriangular(AT); julia> @time T * x; 0.195728 seconds (522.75 k allocations: 25.519 MiB, 8.07% gc time, 99.96% compilation time) # master 0.126475 seconds (404.02 k allocations: 19.361 MiB, 99.96% compilation time) # this PR ```
1 parent a8fd121 commit 0671a7b

File tree

1 file changed

+4
-5
lines changed

1 file changed

+4
-5
lines changed

src/bidiag.jl

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -953,11 +953,10 @@ function _mul!(C::AbstractVecOrMat, A::BiTriSym, B::AbstractVecOrMat, _add::MulA
953953
nB = size(B,2)
954954
(iszero(nA) || iszero(nB)) && return C
955955
iszero(_add.alpha) && return _rmul_or_fill!(C, _add.beta)
956-
if nA <= 3
957-
# naive multiplication
958-
for I in CartesianIndices(C)
959-
col = Base.tail(Tuple(I))
960-
_modify!(_add, sum(A[I[1], k] * B[k, col...] for k in axes(A,2)), C, I)
956+
if nA == 1
957+
A11 = @inbounds A[1,1]
958+
for i in axes(B, 2)
959+
@inbounds _modify!(_add, A11 * B[1,i], C, (1,i))
961960
end
962961
return C
963962
end

0 commit comments

Comments
 (0)