Skip to content

Commit 523337d

Browse files
authored
Better error messages and tests for CUSPARSE.sm2 (#2797)
1 parent f0f7f2f commit 523337d

File tree

2 files changed

+78
-35
lines changed

2 files changed

+78
-35
lines changed

lib/cusparse/level3.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ for (bname,aname,sname,elty) in ((:cusparseSbsrsm2_bufferSize, :cusparseSbsrsm2_
4141
mX,nX = size(X)
4242
nrhs = transxy == 'N' ? nX : mX
4343
if transxy == 'N' && (mX != m)
44-
throw(DimensionMismatch(""))
44+
throw(DimensionMismatch("first dimensions of A ($m) and X ($mX) must match when transxy is 'N'"))
4545
end
4646
if transxy != 'N' && (nX != m)
47-
throw(DimensionMismatch(""))
47+
throw(DimensionMismatch("first dimension of A ($m) must match second dimension of X ($nX) when transxy is not 'N'"))
4848
end
4949
ldx = max(1,stride(X,2))
5050
info = bsrsm2Info_t[0]
@@ -106,10 +106,10 @@ for (bname,aname,sname,elty) in ((:cusparseScsrsm2_bufferSizeExt, :cusparseScsrs
106106
mX,nX = size(X)
107107
nrhs = transxy == 'N' ? nX : mX
108108
if transxy == 'N' && (mX != m)
109-
throw(DimensionMismatch(""))
109+
throw(DimensionMismatch("first dimensions of A ($m) and X ($mX) must match when transxy is 'N'"))
110110
end
111111
if transxy != 'N' && (nX != m)
112-
throw(DimensionMismatch(""))
112+
throw(DimensionMismatch("first dimension of A ($m) must match second dimension of X ($nX) when transxy is not 'N'"))
113113
end
114114
ldx = max(1,stride(X,2))
115115
info = csrsm2Info_t[0]
@@ -182,10 +182,10 @@ for (bname,aname,sname,elty) in ((:cusparseScsrsm2_bufferSizeExt, :cusparseScsrs
182182
mX,nX = size(X)
183183
nrhs = transxy == 'N' ? nX : mX
184184
if transxy == 'N' && (mX != m)
185-
throw(DimensionMismatch(""))
185+
throw(DimensionMismatch("first dimensions of A ($m) and X ($mX) must match when transxy is 'N'"))
186186
end
187187
if transxy != 'N' && (nX != m)
188-
throw(DimensionMismatch(""))
188+
throw(DimensionMismatch("first dimension of A ($m) must match second dimension of X ($nX) when transxy is not 'N'"))
189189
end
190190
ldx = max(1,stride(X,2))
191191
info = csrsm2Info_t[0]

test/libraries/cusparse/interfaces.jl

Lines changed: 72 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -340,21 +340,23 @@ using LinearAlgebra, SparseArrays
340340
end
341341

342342
@testset "CuSparseMatrixCSR($f) $elty" for f in [transpose, adjoint], elty in [Float32, ComplexF32]
343-
S = f(sprand(elty, 10, 10, 0.1))
343+
m = 10
344+
S = f(sprand(elty, m, m, 0.1))
344345
@test SparseMatrixCSC(CuSparseMatrixCSR(S)) S
345346

346-
S = sprand(elty, 10, 10, 0.1)
347+
S = sprand(elty, m, m, 0.1)
347348
T = f(CuSparseMatrixCSR(S))
348349
@test SparseMatrixCSC(CuSparseMatrixCSC(T)) f(S)
349350

350-
S = sprand(elty, 10, 10, 0.1)
351+
S = sprand(elty, m, m, 0.1)
351352
T = f(CuSparseMatrixCSC(S))
352353
@test SparseMatrixCSC(CuSparseMatrixCSR(T)) f(S)
353354
end
354355

355356
@testset "UniformScaling basic operations" begin
356357
for elty in (Float32, Float64, ComplexF32, ComplexF64)
357-
A = sprand(elty, 100, 100, 0.1)
358+
m = 100
359+
A = sprand(elty, m, m, 0.1)
358360
U1 = 2*I
359361
for SparseMatrixType in (CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO)
360362
B = SparseMatrixType(A)
@@ -367,9 +369,10 @@ using LinearAlgebra, SparseArrays
367369

368370
@testset "Diagonal basic operations" begin
369371
for elty in (Float32, Float64, ComplexF32, ComplexF64)
370-
A = sprand(elty, 100, 100, 0.1)
371-
U2 = 2*I(100)
372-
U3 = Diagonal(rand(elty, 100))
372+
m = 100
373+
A = sprand(elty, m, m, 0.1)
374+
U2 = 2*I(m)
375+
U3 = Diagonal(rand(elty, m))
373376
for SparseMatrixType in (CuSparseMatrixCSC, CuSparseMatrixCSR, CuSparseMatrixCOO)
374377
B = SparseMatrixType(A)
375378
for op in (+, -, *)
@@ -395,11 +398,12 @@ using LinearAlgebra, SparseArrays
395398
for triangle in [LowerTriangular, UnitLowerTriangular, UpperTriangular, UnitUpperTriangular]
396399
@testset "ldiv!($triangle(CuSparseMatrixBSR), CuVector) -- $elty" for elty in [Float32,Float64,ComplexF32,ComplexF64]
397400
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
398-
A = rand(elty, 10, 10)
401+
m = 10
402+
A = rand(elty, m, m)
399403
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
400404
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
401405
A = sparse(A)
402-
y = rand(elty, 10)
406+
y = rand(elty, m)
403407
dA = CuSparseMatrixBSR(A, 1)
404408
dy = CuArray(y)
405409
ldiv!(triangle(opa(A)), y)
@@ -410,11 +414,12 @@ using LinearAlgebra, SparseArrays
410414

411415
@testset "$triangle(CuSparseMatrixBSR) \\ CuVector -- $elty" for elty in [Float32,Float64,ComplexF32,ComplexF64]
412416
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
413-
A = rand(elty, 10, 10)
417+
m = 10
418+
A = rand(elty, m, m)
414419
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
415420
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
416421
A = sparse(A)
417-
y = rand(elty, 10)
422+
y = rand(elty, m)
418423
dA = CuSparseMatrixBSR(A, 1)
419424
dy = CuArray(y)
420425
x = triangle(opa(A)) \ y
@@ -427,16 +432,23 @@ using LinearAlgebra, SparseArrays
427432
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
428433
@testset "opb = $opb" for opb in [identity, transpose, adjoint]
429434
elty <: Complex && opb == adjoint && continue
430-
A = rand(elty, 10, 10)
435+
m = 10
436+
n = 2
437+
A = rand(elty, m, m)
431438
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
432439
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
433440
A = sparse(A)
434-
B = opb == identity ? rand(elty, 10, 2) : rand(elty, 2, 10)
441+
B = opb == identity ? rand(elty, m, n) : rand(elty, n, m)
435442
dA = CuSparseMatrixBSR(A, 1)
436443
dB = CuArray(B)
437444
ldiv!(triangle(opa(A)), opb(B))
438445
ldiv!(triangle(opa(dA)), opb(dB))
439446
@test B collect(dB)
447+
if CUSPARSE.version() < v"12.0"
448+
B_bad = opb == identity ? rand(elty, m+1, n) : rand(elty, n, m+1)
449+
error_str = opb == identity ? "first dimensions of A ($m) and X ($(m+1)) must match when transxy is 'N'" : "first dimension of A ($m) must match second dimension of X ($(m+1)) when transxy is not 'N'"
450+
@test_throws DimensionMismatch(error_str) ldiv!(triangle(opa(dA)), opb(CuArray(B_bad)))
451+
end
440452
end
441453
end
442454
end
@@ -445,16 +457,23 @@ using LinearAlgebra, SparseArrays
445457
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
446458
@testset "opb = $opb" for opb in [identity, transpose, adjoint]
447459
elty <: Complex && opb == adjoint && continue
448-
A = rand(elty, 10, 10)
460+
m = 10
461+
n = 2
462+
A = rand(elty, m, m)
449463
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
450464
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
451465
A = sparse(A)
452-
B = opb == identity ? rand(elty, 10, 2) : rand(elty, 2, 10)
466+
B = opb == identity ? rand(elty, m, n) : rand(elty, n, m)
453467
dA = CuSparseMatrixBSR(A, 1)
454468
dB = CuArray(B)
455469
C = triangle(opa(A)) \ opb(B)
456470
dC = triangle(opa(dA)) \ opb(dB)
457471
@test C collect(dC)
472+
if CUSPARSE.version() < v"12.0"
473+
B_bad = opb == identity ? rand(elty, m+1, n) : rand(elty, n, m+1)
474+
error_str = opb == identity ? "first dimensions of A ($m) and X ($(m+1)) must match when transxy is 'N'" : "first dimension of A ($m) must match second dimension of X ($(m+1)) when transxy is not 'N'"
475+
@test_throws DimensionMismatch(error_str) ldiv!(triangle(opa(dA)), opb(CuArray(B_bad)))
476+
end
458477
end
459478
end
460479
end
@@ -466,11 +485,12 @@ using LinearAlgebra, SparseArrays
466485
@testset "ldiv!($triangle($SparseMatrixType), CuVector) -- $elty" for elty in [Float64,ComplexF64]
467486
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
468487
SparseMatrixType == CuSparseMatrixCSC && elty <: Complex && opa == adjoint && continue
469-
A = A = rand(elty, 10, 10)
488+
m = 10
489+
A = A = rand(elty, m, m)
470490
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
471491
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
472492
A = sparse(A)
473-
y = rand(elty, 10)
493+
y = rand(elty, m)
474494
dA = SparseMatrixType(A)
475495
dy = CuArray(y)
476496
ldiv!(triangle(opa(A)), y)
@@ -482,12 +502,13 @@ using LinearAlgebra, SparseArrays
482502
@testset "ldiv!(CuVector, $triangle($SparseMatrixType), CuVector) -- $elty" for elty in [Float64,ComplexF64]
483503
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
484504
SparseMatrixType == CuSparseMatrixCSC && elty <: Complex && opa == adjoint && continue
485-
A = A = rand(elty, 10, 10)
505+
m = 10
506+
A = A = rand(elty, m, m)
486507
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
487508
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
488509
A = sparse(A)
489-
y = rand(elty, 10)
490-
x = rand(elty, 10)
510+
y = rand(elty, m)
511+
x = rand(elty, m)
491512
dA = SparseMatrixType(A)
492513
dy = CuArray(y)
493514
dx = CuArray(x)
@@ -500,11 +521,12 @@ using LinearAlgebra, SparseArrays
500521
@testset "$triangle($SparseMatrixType) \\ CuVector -- $elty" for elty in [Float64,ComplexF64]
501522
@testset "opa = $opa" for opa in [identity, transpose, adjoint]
502523
SparseMatrixType == CuSparseMatrixCSC && elty <: Complex && opa == adjoint && continue
503-
A = rand(elty, 10, 10)
524+
m = 10
525+
A = rand(elty, m, m)
504526
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
505527
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
506528
A = sparse(A)
507-
y = rand(elty, 10)
529+
y = rand(elty, m)
508530
dA = SparseMatrixType(A)
509531
dy = CuArray(y)
510532
x = triangle(opa(A)) \ y
@@ -518,16 +540,23 @@ using LinearAlgebra, SparseArrays
518540
@testset "opb = $opb" for opb in [identity, transpose, adjoint]
519541
SparseMatrixType == CuSparseMatrixCSC && elty <: Complex && opa == adjoint && continue
520542
elty <: Complex && opb == adjoint && continue
521-
A = rand(elty, 10, 10)
543+
m = 10
544+
n = 2
545+
A = rand(elty, m, m)
522546
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
523547
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
524548
A = sparse(A)
525-
B = opb == identity ? rand(elty, 10, 2) : rand(elty, 2, 10)
549+
B = opb == identity ? rand(elty, m, n) : rand(elty, n, m)
526550
dA = SparseMatrixType(A)
527551
dB = CuArray(B)
528552
ldiv!(triangle(opa(A)), opb(B))
529553
ldiv!(triangle(opa(dA)), opb(dB))
530554
@test B collect(dB)
555+
if CUSPARSE.version() < v"12.0"
556+
B_bad = opb == identity ? rand(elty, m+1, n) : rand(elty, n, m+1)
557+
error_str = opb == identity ? "first dimensions of A ($m) and X ($(m+1)) must match when transxy is 'N'" : "first dimension of A ($m) must match second dimension of X ($(m+1)) when transxy is not 'N'"
558+
@test_throws DimensionMismatch(error_str) ldiv!(triangle(opa(dA)), opb(CuArray(B_bad)))
559+
end
531560
end
532561
end
533562
end
@@ -537,18 +566,25 @@ using LinearAlgebra, SparseArrays
537566
@testset "opb = $opb" for opb in [identity, transpose, adjoint]
538567
SparseMatrixType == CuSparseMatrixCSC && elty <: Complex && opa == adjoint && continue
539568
elty <: Complex && opb == adjoint && continue
540-
A = rand(elty, 10, 10)
569+
m = 10
570+
n = 2
571+
A = rand(elty, m, m)
541572
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
542573
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
543574
A = sparse(A)
544-
B = opb == identity ? rand(elty, 10, 2) : rand(elty, 2, 10)
545-
C = rand(elty, 10, 2)
575+
B = opb == identity ? rand(elty, m, n) : rand(elty, n, m)
576+
C = rand(elty, m, n)
546577
dA = SparseMatrixType(A)
547578
dB = CuArray(B)
548579
dC = CuArray(C)
549580
ldiv!(C, triangle(opa(A)), opb(B))
550581
ldiv!(dC, triangle(opa(dA)), opb(dB))
551582
@test C collect(dC)
583+
if CUSPARSE.version() < v"12.0"
584+
B_bad = opb == identity ? rand(elty, m+1, n) : rand(elty, n, m+1)
585+
error_str = opb == identity ? "first dimensions of A ($m) and X ($(m+1)) must match when transxy is 'N'" : "first dimension of A ($m) must match second dimension of X ($(m+1)) when transxy is not 'N'"
586+
@test_throws DimensionMismatch(error_str) ldiv!(triangle(opa(dA)), opb(CuArray(B_bad)))
587+
end
552588
end
553589
end
554590
end
@@ -558,16 +594,23 @@ using LinearAlgebra, SparseArrays
558594
@testset "opb = $opb" for opb in [identity, transpose, adjoint]
559595
SparseMatrixType == CuSparseMatrixCSC && elty <: Complex && opa == adjoint && continue
560596
elty <: Complex && opb == adjoint && continue
561-
A = rand(elty, 10, 10)
597+
m = 10
598+
n = 2
599+
A = rand(elty, m, m)
562600
A = triangle in (UnitLowerTriangular, LowerTriangular) ? tril(A) : triu(A)
563601
A = triangle in (UnitLowerTriangular, UnitUpperTriangular) ? A - Diagonal(A) + I : A
564602
A = sparse(A)
565-
B = opb == identity ? rand(elty, 10, 2) : rand(elty, 2, 10)
603+
B = opb == identity ? rand(elty, m, n) : rand(elty, n, m)
566604
dA = SparseMatrixType(A)
567605
dB = CuArray(B)
568606
C = triangle(opa(A)) \ opb(B)
569607
dC = triangle(opa(dA)) \ opb(dB)
570608
@test C collect(dC)
609+
if CUSPARSE.version() < v"12.0"
610+
B_bad = opb == identity ? rand(elty, m+1, n) : rand(elty, n, m+1)
611+
error_str = opb == identity ? "first dimensions of A ($m) and X ($(m+1)) must match when transxy is 'N'" : "first dimension of A ($m) must match second dimension of X ($(m+1)) when transxy is not 'N'"
612+
@test_throws DimensionMismatch(error_str) ldiv!(triangle(opa(dA)), opb(CuArray(B_bad)))
613+
end
571614
end
572615
end
573616
end

0 commit comments

Comments
 (0)