Skip to content

Commit 517ca49

Browse files
maleadtclaude
andcommitted
CUSPARSE: consolidate, split, and decouple tests.
- Merge conversions.jl into conversion.jl (they tested overlapping sparse↔sparse/dense format conversions under confusingly similar names). - Split the 461-line interfaces.jl into interfaces/{axpby,mul,ldiv, misc}.jl. The old file had file-level m/k/n/nB constants shared across five unrelated topics (axpby, mul!, ldiv!, misc linalg, masked getindex). - Move file-level m/n/k/p constants into the outer @testset in bmm.jl, linalg.jl, reduce.jl. bmm.jl additionally had a silent mid-file reassignment of those constants; each group now owns its own. - Add missing `using Adapt` to generic.jl (worked by accident when included from the top-level CUDA.jl test runner). - Switch runtests.jl to walkdir so every file is picked up. The old hand-maintained include() list only covered 9 of the 16 test files — bmm, broadcast, device, generic, linalg, reduce, sparse_matrices_csr, and one of the two conversion files were never exercised under Pkg.test(cuSPARSE). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent e778009 commit 517ca49

12 files changed

Lines changed: 852 additions & 836 deletions

File tree

lib/cusparse/test/bmm.jl

Lines changed: 32 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@ using CUDACore, cuSPARSE
33
using LinearAlgebra
44
using SparseArrays
55

6-
m = 5
7-
n = 15
8-
# error when n == 1 and batchsize > 1 as cusparseSpMM fallsback to cusparseSpMV, which doesn't do batched computations.
9-
# see https://docs.nvidia.com/cuda/cusparse/#cusparsespmm
10-
k = 25
11-
p = 0.5
12-
136
@testset "Sparse-Dense $elty bmm!" for elty in (Float64, Float32, ComplexF64, ComplexF32)
14-
α = rand(elty)
15-
β = rand(elty)
7+
m = 5
8+
n = 15
9+
# error when n == 1 and batchsize > 1 as cusparseSpMM fallsback to cusparseSpMV,
10+
# which doesn't do batched computations. see https://docs.nvidia.com/cuda/cusparse/#cusparsespmm
11+
k = 25
12+
p = 0.5
13+
14+
α = rand(elty)
15+
β = rand(elty)
1616

1717
@testset "Dimension checks" begin
1818
A1 = CuSparseMatrixCSR{elty}(sprand(elty, m, k, p))
@@ -23,14 +23,14 @@ p = 0.5
2323
B = CuArray(rand(elty, k, n, 2))
2424
C = CuArray(rand(elty, m, n, 3))
2525

26-
@test_throws ArgumentError("C must have same batch-dimension as max(size(A,3)=$(size(A,3)), size(B,3)=$(size(B,3))), got $(size(C,3)).") cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
27-
26+
@test_throws ArgumentError("C must have same batch-dimension as max(size(A,3)=$(size(A,3)), size(B,3)=$(size(B,3))), got $(size(C,3)).") cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
27+
2828
C = CuArray(rand(elty, m, 1, 2))
29-
@test_throws ArgumentError("bmm! does not work for n==1 and b>1 due to CUDA error.") cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
29+
@test_throws ArgumentError("bmm! does not work for n==1 and b>1 due to CUDA error.") cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
3030

3131
C = CuArray(rand(elty, m, n, 2))
3232
B = CuArray(rand(elty, k+1, n, 2))
33-
@test_throws DimensionMismatch("B has dimensions $(size(B)) but needs ($k,$n)") cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
33+
@test_throws DimensionMismatch("B has dimensions $(size(B)) but needs ($k,$n)") cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
3434
end
3535

3636
@testset "C = αAB + βC" begin
@@ -43,7 +43,7 @@ p = 0.5
4343
C = CuArray(rand(elty, m, n, 2))
4444
D = copy(C)
4545

46-
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
46+
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
4747

4848
D[:,:,1] = α * A1 * B[:,:,1] + β * D[:,:,1]
4949
D[:,:,2] = α * A2 * B[:,:,2] + β * D[:,:,2]
@@ -61,15 +61,14 @@ p = 0.5
6161
C = CuArray(rand(elty, m, n, 2))
6262
D = copy(C)
6363

64-
cuSPARSE.bmm!('C', 'N', α, A, B, β, C, 'O')
64+
cuSPARSE.bmm!('C', 'N', α, A, B, β, C, 'O')
6565

6666
D[:,:,1] = α * A1' * B[:,:,1] + β * D[:,:,1]
6767
D[:,:,2] = α * A2' * B[:,:,2] + β * D[:,:,2]
6868

6969
@test D C
7070
end
7171

72-
7372
@testset "C = αABᵀ + βC" begin
7473
A1 = CuSparseMatrixCSR{elty}(sprand(elty, m, k, p))
7574
A2 = copy(A1)
@@ -80,15 +79,14 @@ p = 0.5
8079
C = CuArray(rand(elty, m, n, 2))
8180
D = copy(C)
8281

83-
cuSPARSE.bmm!('N', 'C', α, A, B, β, C, 'O')
82+
cuSPARSE.bmm!('N', 'C', α, A, B, β, C, 'O')
8483

8584
D[:,:,1] = α * A1 * B[:,:,1]' + β * D[:,:,1]
8685
D[:,:,2] = α * A2 * B[:,:,2]' + β * D[:,:,2]
8786

8887
@test D C
8988
end
9089

91-
9290
@testset "C = αAᵀBᵀ + βC" begin
9391
A1 = CuSparseMatrixCSR{elty}(sprand(elty, k, m, p))
9492
A2 = copy(A1)
@@ -99,7 +97,7 @@ p = 0.5
9997
C = CuArray(rand(elty, m, n, 2))
10098
D = copy(C)
10199

102-
cuSPARSE.bmm!('C', 'C', α, A, B, β, C, 'O')
100+
cuSPARSE.bmm!('C', 'C', α, A, B, β, C, 'O')
103101

104102
D[:,:,1] = α * A1' * B[:,:,1]' + β * D[:,:,1]
105103
D[:,:,2] = α * A2' * B[:,:,2]' + β * D[:,:,2]
@@ -125,7 +123,7 @@ p = 0.5
125123
C = CuArray(rand(elty, m, n, 2, 3))
126124
D = copy(C)
127125

128-
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
126+
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
129127

130128
for c in CartesianIndices((2,3))
131129
CUDACore.@allowscalar D[:,:,c] = α * A[:,:,c.I...] * B[:,:,c] + β*D[:,:,c]
@@ -135,17 +133,17 @@ p = 0.5
135133
end
136134
end
137135

138-
m = 1
139-
n = 2
140-
# error when n == 1 and batchsize > 1 as cusparseSpMM fallsback to cusparseSpMV, which doesn't do batched computations.
141-
# see https://docs.nvidia.com/cuda/cusparse/#cusparsespmm
142-
k = 1
143-
p = 1.
144-
145136
@testset "Sparse-Dense $elty bmm! for small matrices" for elty in (Float64, Float32, ComplexF64, ComplexF32)
146137
# check if #2296 returns
147-
α = rand(elty)
148-
β = rand(elty)
138+
m = 1
139+
n = 2
140+
# error when n == 1 and batchsize > 1 as cusparseSpMM fallsback to cusparseSpMV,
141+
# which doesn't do batched computations. see https://docs.nvidia.com/cuda/cusparse/#cusparsespmm
142+
k = 1
143+
p = 1.0
144+
145+
α = rand(elty)
146+
β = rand(elty)
149147

150148
@testset "C = αAB + βC" begin
151149
A1 = CuSparseMatrixCSR{elty}(sprand(elty, m, k, p))
@@ -157,7 +155,7 @@ p = 1.
157155
C = CuArray(rand(elty, m, n, 2))
158156
D = copy(C)
159157

160-
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
158+
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
161159

162160
D[:,:,1] = α * A1 * B[:,:,1] + β * D[:,:,1]
163161
D[:,:,2] = α * A2 * B[:,:,2] + β * D[:,:,2]
@@ -175,15 +173,14 @@ p = 1.
175173
C = CuArray(rand(elty, m, n, 2))
176174
D = copy(C)
177175

178-
cuSPARSE.bmm!('C', 'N', α, A, B, β, C, 'O')
176+
cuSPARSE.bmm!('C', 'N', α, A, B, β, C, 'O')
179177

180178
D[:,:,1] = α * A1' * B[:,:,1] + β * D[:,:,1]
181179
D[:,:,2] = α * A2' * B[:,:,2] + β * D[:,:,2]
182180

183181
@test D C
184182
end
185183

186-
187184
@testset "C = αABᵀ + βC" begin
188185
A1 = CuSparseMatrixCSR{elty}(sprand(elty, m, k, p))
189186
A2 = copy(A1)
@@ -194,15 +191,14 @@ p = 1.
194191
C = CuArray(rand(elty, m, n, 2))
195192
D = copy(C)
196193

197-
cuSPARSE.bmm!('N', 'C', α, A, B, β, C, 'O')
194+
cuSPARSE.bmm!('N', 'C', α, A, B, β, C, 'O')
198195

199196
D[:,:,1] = α * A1 * B[:,:,1]' + β * D[:,:,1]
200197
D[:,:,2] = α * A2 * B[:,:,2]' + β * D[:,:,2]
201198

202199
@test D C
203200
end
204201

205-
206202
@testset "C = αAᵀBᵀ + βC" begin
207203
A1 = CuSparseMatrixCSR{elty}(sprand(elty, k, m, p))
208204
A2 = copy(A1)
@@ -213,7 +209,7 @@ p = 1.
213209
C = CuArray(rand(elty, m, n, 2))
214210
D = copy(C)
215211

216-
cuSPARSE.bmm!('C', 'C', α, A, B, β, C, 'O')
212+
cuSPARSE.bmm!('C', 'C', α, A, B, β, C, 'O')
217213

218214
D[:,:,1] = α * A1' * B[:,:,1]' + β * D[:,:,1]
219215
D[:,:,2] = α * A2' * B[:,:,2]' + β * D[:,:,2]
@@ -239,7 +235,7 @@ p = 1.
239235
C = CuArray(rand(elty, m, n, 2, 3))
240236
D = copy(C)
241237

242-
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
238+
cuSPARSE.bmm!('N', 'N', α, A, B, β, C, 'O')
243239

244240
for c in CartesianIndices((2,3))
245241
CUDACore.@allowscalar D[:,:,c] = α * A[:,:,c.I...] * B[:,:,c] + β*D[:,:,c]

0 commit comments

Comments
 (0)