Skip to content

Commit 1271e11

Browse files
authored
[CUSOLVER] Avoid the conversion to CSR format for reordering routines (#1786)
- index is now an optional argument for reordering routines; - we don't need to convert CSC matrices into CSR matrices anymore because reordering routines are based on the pattern of A + A'; - `zfd` now returns a column permutation for `SparseMatrixCSC`. This change makes sense because the CUSOLVER routine `csrzfd` computes a row permutation for sparse matrices in CSR format.
1 parent b688674 commit 1271e11

File tree

2 files changed

+22
-32
lines changed

2 files changed

+22
-32
lines changed

lib/cusolver/sparse.jl

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -231,60 +231,52 @@ for (fname, elty, relty) in ((:cusolverSpScsreigsHost, :ComplexF32, :Float32),
231231
end
232232

233233
#csrsymrcm
234-
function symrcm(A::SparseMatrixCSC, index::Char)
234+
function symrcm(A::SparseMatrixCSC, index::Char='O')
235235
n, m = size(A)
236236
(m m) && throw(DimensionMismatch("A must be square, but has dimensions ($n,$m)!"))
237237
descA = CuMatrixDescriptor('G', 'L', 'N', index)
238238
nnzA = nnz(A)
239-
Mat = similar(A)
240-
transpose!(Mat, A)
241-
colsA = convert(Vector{Cint}, Mat.rowval)
242-
rowsA = convert(Vector{Cint}, Mat.colptr)
239+
colsA = convert(Vector{Cint}, A.rowval)
240+
rowsA = convert(Vector{Cint}, A.colptr)
243241
p = zeros(Cint, n)
244242
cusolverSpXcsrsymrcmHost(sparse_handle(), n, nnzA, descA, rowsA, colsA, p)
245243
return p
246244
end
247245

248246
#csrsymmdq
249-
function symmdq(A::SparseMatrixCSC, index::Char)
247+
function symmdq(A::SparseMatrixCSC, index::Char='O')
250248
n, m = size(A)
251249
(m m) && throw(DimensionMismatch("A must be square, but has dimensions ($n,$m)!"))
252250
descA = CuMatrixDescriptor('G', 'L', 'N', index)
253251
nnzA = nnz(A)
254-
Mat = similar(A)
255-
transpose!(Mat, A)
256-
colsA = convert(Vector{Cint}, Mat.rowval)
257-
rowsA = convert(Vector{Cint}, Mat.colptr)
252+
colsA = convert(Vector{Cint}, A.rowval)
253+
rowsA = convert(Vector{Cint}, A.colptr)
258254
p = zeros(Cint, n)
259255
cusolverSpXcsrsymmdqHost(sparse_handle(), n, nnzA, descA, rowsA, colsA, p)
260256
return p
261257
end
262258

263259
#csrsymamd
264-
function symamd(A::SparseMatrixCSC, index::Char)
260+
function symamd(A::SparseMatrixCSC, index::Char='O')
265261
n, m = size(A)
266262
(m m) && throw(DimensionMismatch("A must be square, but has dimensions ($n,$m)!"))
267263
descA = CuMatrixDescriptor('G', 'L', 'N', index)
268264
nnzA = nnz(A)
269-
Mat = similar(A)
270-
transpose!(Mat, A)
271-
colsA = convert(Vector{Cint}, Mat.rowval)
272-
rowsA = convert(Vector{Cint}, Mat.colptr)
265+
colsA = convert(Vector{Cint}, A.rowval)
266+
rowsA = convert(Vector{Cint}, A.colptr)
273267
p = zeros(Cint, n)
274268
cusolverSpXcsrsymamdHost(sparse_handle(), n, nnzA, descA, rowsA, colsA, p)
275269
return p
276270
end
277271

278272
#csrmetisnd
279-
function metisnd(A::SparseMatrixCSC, index::Char)
273+
function metisnd(A::SparseMatrixCSC, index::Char='O')
280274
n, m = size(A)
281275
(m m) && throw(DimensionMismatch("A must be square, but has dimensions ($n,$m)!"))
282276
descA = CuMatrixDescriptor('G', 'L', 'N', index)
283277
nnzA = nnz(A)
284-
Mat = similar(A)
285-
transpose!(Mat, A)
286-
colsA = convert(Vector{Cint}, Mat.rowval)
287-
rowsA = convert(Vector{Cint}, Mat.colptr)
278+
colsA = convert(Vector{Cint}, A.rowval)
279+
rowsA = convert(Vector{Cint}, A.colptr)
288280
p = zeros(Cint, n)
289281
cusolverSpXcsrmetisndHost(sparse_handle(), n, nnzA, descA, rowsA, colsA, C_NULL, p)
290282
return p
@@ -296,16 +288,14 @@ for (fname, elty) in ((:cusolverSpScsrzfdHost, :Float32),
296288
(:cusolverSpCcsrzfdHost, :ComplexF32),
297289
(:cusolverSpZcsrzfdHost, :ComplexF64))
298290
@eval begin
299-
function zfd(A::SparseMatrixCSC{$elty}, index::Char)
291+
function zfd(A::SparseMatrixCSC{$elty}, index::Char='O')
300292
n, m = size(A)
301293
(m m) && throw(DimensionMismatch("A must be square, but has dimensions ($n,$m)!"))
302294
descA = CuMatrixDescriptor('G', 'L', 'N', index)
303295
nnzA = nnz(A)
304-
Mat = similar(A)
305-
transpose!(Mat, A)
306-
colsA = convert(Vector{Cint}, Mat.rowval)
307-
rowsA = convert(Vector{Cint}, Mat.colptr)
308-
valsA = Mat.nzval
296+
colsA = convert(Vector{Cint}, A.rowval)
297+
rowsA = convert(Vector{Cint}, A.colptr)
298+
valsA = A.nzval
309299
p = zeros(Cint, n)
310300
numnz = Ref{Cint}(0)
311301
$fname(sparse_handle(), n, nnzA, descA, valsA, rowsA, colsA, p, numnz)

test/cusolver/sparse.jl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,31 +13,31 @@ A = rand(n, n)
1313
A = SparseMatrixCSC(A)
1414

1515
@testset "symrcm" begin
16-
p = symrcm(A, 'O')
16+
p = symrcm(A)
1717
p .+= 1
1818
@test minimum(p) == 1
1919
@test maximum(p) == n
2020
@test isperm(p)
2121
end
2222

2323
@testset "symmdq" begin
24-
p = symmdq(A, 'O')
24+
p = symmdq(A)
2525
p .+= 1
2626
@test minimum(p) == 1
2727
@test maximum(p) == n
2828
@test isperm(p)
2929
end
3030

3131
@testset "symamd" begin
32-
p = symamd(A, 'O')
32+
p = symamd(A)
3333
p .+= 1
3434
@test minimum(p) == 1
3535
@test maximum(p) == n
3636
@test isperm(p)
3737
end
3838

3939
@testset "metisnd" begin
40-
p = metisnd(A, 'O')
40+
p = metisnd(A)
4141
p .+= 1
4242
@test minimum(p) == 1
4343
@test maximum(p) == n
@@ -51,12 +51,12 @@ end
5151
A[i,i] = 0
5252
end
5353
A = SparseMatrixCSC(A)
54-
p = zfd(A, 'O')
54+
p = zfd(A)
5555
p .+= 1
5656
@test minimum(p) == 1
5757
@test maximum(p) == n
5858
@test isperm(p)
59-
@test 0 diag(A[p,:])
59+
@test 0 diag(A[:,p])
6060
end
6161

6262
@testset "csrlsvlu!" begin

0 commit comments

Comments
 (0)