@@ -5,6 +5,14 @@ import LinearAlgebra: mul!
5
5
using SparseArrays
6
6
import SparseArrays: AdjOrTransStridedOrTriangularMatrix, getcolptr
7
7
8
+ # * ThreadedSparseMatrixCSC
9
+
10
+ """
11
+ ThreadedSparseMatrixCSC(A)
12
+
13
+ Thin container around `A::SparseMatrixCSC` that will enable certain
14
+ threaded multiplications of `A` with dense matrices.
15
+ """
8
16
struct ThreadedSparseMatrixCSC{Tv,Ti,At} <: AbstractSparseMatrix{Tv,Ti}
9
17
A:: At
10
18
ThreadedSparseMatrixCSC (A:: At ) where {Tv,Ti,At<: AbstractSparseMatrix{Tv,Ti} } =
@@ -87,6 +95,42 @@ function mul!(C::StridedVecOrMat, X::AdjOrTransStridedOrTriangularMatrix, A::Thr
87
95
C
88
96
end
89
97
90
- export ThreadedSparseMatrixCSC
98
+ # * ThreadedColumnizedSparseMatrix
99
+
100
+ """
101
+ ThreadedColumnizedSparseMatrix(columns, m, n)
102
+
103
+ Sparse matrix of size `m×n` where the `columns` are stored separately,
104
+ enabling threaded multiplication. Seems faster than
105
+ [`ThreadedSparseMatrixCSC`](@ref) for some use cases.
106
+ """
107
+ struct ThreadedColumnizedSparseMatrix{Tv,Ti,Columns} <: AbstractSparseMatrix{Tv,Ti}
108
+ columns:: Columns
109
+ m:: Int
110
+ n:: Int
111
+ ThreadedColumnizedSparseMatrix (:: Type{Tv} , :: Type{Ti} , columns:: Columns , m, n) where {Tv,Ti,Columns} =
112
+ new {Tv,Ti,Columns} (columns, m, n)
113
+ end
114
+
115
+ function ThreadedColumnizedSparseMatrix (A:: AbstractSparseMatrix{Tv,Ti} ) where {Tv,Ti}
116
+ m,n = size (A)
117
+ Column = typeof (A[:,1 ])
118
+ columns = Column[A[:,j] for j = 1 : n]
119
+ ThreadedColumnizedSparseMatrix (Tv, Ti, columns, m, n)
120
+ end
121
+
122
+ Base. size (A:: ThreadedColumnizedSparseMatrix ) = (A. m,A. n)
123
+ Base. size (A:: ThreadedColumnizedSparseMatrix ,i) = size (A)[i]
124
+ Base. getindex (A:: ThreadedColumnizedSparseMatrix , i, j) = A. columns[j][i]
125
+
126
+ function LinearAlgebra. mul! (A:: AbstractMatrix , B:: AbstractMatrix , C:: ThreadedColumnizedSparseMatrix ,
127
+ α:: Number = true , β:: Number = false )
128
+ Threads. @threads for j = 1 : C. n
129
+ LinearAlgebra. mul! (view (A, :, j), B, C. columns[j], α, β)
130
+ end
131
+ A
132
+ end
133
+
134
+ export ThreadedSparseMatrixCSC, ThreadedColumnizedSparseMatrix
91
135
92
136
end # module
0 commit comments