Skip to content

Commit 48cd033

Browse files
committed
Integrate small bidiag multiplication into general loops
1 parent 8765523 commit 48cd033

File tree

1 file changed

+26
-15
lines changed

1 file changed

+26
-15
lines changed

src/bidiag.jl

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -642,35 +642,46 @@ function _bibimul!(C, A, B, _add::MulAddMul)
642642
end
643643
function _bibimul_nonzeroalpha!(C, A, B, _add)
644644
n = size(A,1)
645-
if n <= 3
645+
if n == 1
646646
# naive multiplication
647-
for I in CartesianIndices(C)
648-
C[I] += _add(sum(A[I[1], k] * B[k, I[2]] for k in axes(A,2)))
649-
end
647+
@inbounds C[1,1] += _add(A[1,1] * B[1,1])
650648
return C
651649
end
652650
@inbounds begin
653651
# first column of C
654652
C[1,1] += _add(A[1,1]*B[1,1] + A[1, 2]*B[2,1])
655653
C[2,1] += _add(A[2,1]*B[1,1] + A[2,2]*B[2,1])
656-
C[3,1] += _add(A[3,2]*B[2,1])
654+
if n >= 3
655+
C[3,1] += _add(A[3,2]*B[2,1])
656+
end
657657
# second column of C
658658
C[1,2] += _add(A[1,1]*B[1,2] + A[1,2]*B[2,2])
659-
C[2,2] += _add(A[2,1]*B[1,2] + A[2,2]*B[2,2] + A[2,3]*B[3,2])
660-
C[3,2] += _add(A[3,2]*B[2,2] + A[3,3]*B[3,2])
661-
C[4,2] += _add(A[4,3]*B[3,2])
659+
C22 = A[2,1]*B[1,2] + A[2,2]*B[2,2]
660+
if n >= 3
661+
C[2,2] += _add(C22 + A[2,3]*B[3,2])
662+
C[3,2] += _add(A[3,2]*B[2,2] + A[3,3]*B[3,2])
663+
if n >= 4
664+
C[4,2] += _add(A[4,3]*B[3,2])
665+
end
666+
else
667+
C[2,2] += _add(C22)
668+
end
662669
end # inbounds
663670
# middle columns
664671
__bibimul!(C, A, B, _add)
665672
@inbounds begin
666-
C[n-3,n-1] += _add(A[n-3,n-2]*B[n-2,n-1])
667-
C[n-2,n-1] += _add(A[n-2,n-2]*B[n-2,n-1] + A[n-2,n-1]*B[n-1,n-1])
668-
C[n-1,n-1] += _add(A[n-1,n-2]*B[n-2,n-1] + A[n-1,n-1]*B[n-1,n-1] + A[n-1,n]*B[n,n-1])
669-
C[n, n-1] += _add(A[n,n-1]*B[n-1,n-1] + A[n,n]*B[n,n-1])
673+
if n >= 4
674+
C[n-3,n-1] += _add(A[n-3,n-2]*B[n-2,n-1])
675+
C[n-2,n-1] += _add(A[n-2,n-2]*B[n-2,n-1] + A[n-2,n-1]*B[n-1,n-1])
676+
C[n-1,n-1] += _add(A[n-1,n-2]*B[n-2,n-1] + A[n-1,n-1]*B[n-1,n-1] + A[n-1,n]*B[n,n-1])
677+
C[n, n-1] += _add(A[n,n-1]*B[n-1,n-1] + A[n,n]*B[n,n-1])
678+
end
670679
# last column of C
671-
C[n-2, n] += _add(A[n-2,n-1]*B[n-1,n])
672-
C[n-1, n] += _add(A[n-1,n-1]*B[n-1,n ] + A[n-1,n]*B[n,n ])
673-
C[n, n] += _add(A[n,n-1]*B[n-1,n ] + A[n,n]*B[n,n ])
680+
if n >= 3
681+
C[n-2, n] += _add(A[n-2,n-1]*B[n-1,n])
682+
C[n-1, n] += _add(A[n-1,n-1]*B[n-1,n ] + A[n-1,n]*B[n,n ])
683+
C[n, n] += _add(A[n,n-1]*B[n-1,n ] + A[n,n]*B[n,n ])
684+
end
674685
end # inbounds
675686
C
676687
end

0 commit comments

Comments
 (0)