From f9617b6e127757925fb7f7734994893a5e350d66 Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Thu, 22 May 2025 22:32:48 +0800 Subject: [PATCH 1/3] Fix spdiagm with specified pairs --- .DS_Store | Bin 0 -> 8196 bytes lib/cusparse/array.jl | 57 ++++++++++++++++++++++---- test/libraries/cusparse/interfaces.jl | 18 +++++++- 3 files changed, 66 insertions(+), 9 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..4bf0b57ce46689c003024002295d7523a631fdf7 GIT binary patch literal 8196 zcmeHMziSjh6n>Lk$YLx+3r|qkN()5@NHj%cbJ>Wd3LGd{h~5tq$sK#-4A=y=miz;D z7M2!QSw|4T&es1xLD0(D_hx2i-`wtsjd+kZu=9@n-rMinZ__}L4O&b1ppBq z6wfT-R5J*tqcRrknQIso)&mTo4}0(op2MJ$EhoeQaX=gp2gCt!U>+R6Z#Ipn;k$28 znZ*Hd;6yq=>qCqO#l*(kM7?z2q+0-tA)eL)e`6n@YhoJ{8*>wNDPGfb56YG*+hQnF zj(AMz7!wq4pbeW-u)C@hb|mo-_H8?;m&fW zmyO1zWb1xY-Y84c?l9{j9zFcjUOW2nalJXW|JS+WUCzHvGD6h3L%R!}wu?7@ag6JE z-@n;@WL*-)b-e5Wwn~YH4MHwPiC&el{9C0df+wb32~Pt zgC0ygC1>x@(&sR);nCHN;<+%q^q~&-c+Y9x2zPZ}z!Mn37~hn^3_o0^zauL-T*q3l zS?H+AEA{*-&(mf62(&K$t$@QLRAUjYVdK2h;Lwt}iu!z0yeM9Eh;O0)9^6`aP$Hb~ z%ii7Mo^2g}?p4&|yPXhUh<*=XAD(*88#>=P#yMZUb)2r2v)17rFMKB606Ax$^1|wc z65*WFspGVDoUw{}e8I8dn;>J)yUWEi(|j7?d{@5RD}A+S`5ddL#~1x1zEJN|PG;7V z=*=sRan92pwhB&H%kQ!d_js4KiC2a=Fb@s{MnsF&?ak)>|9Oxq8pHu{;2$}l!nBjN z@#40(uFz1g9pmvB4;qx0o2W~0((O1#-Hu~)|1iYgF{V;YVq v) +SparseArrays.spdiagm(m::Integer, n::Integer, v::CuVector) = _cuda_spdiagm((Int(m), Int(n)), 0 => v) + +function _cuda_spdiagm(size, kv::Pair{<:Integer, <:CuVector}...) + I, J, V, mmax, nmax = _cuda_spdiagm_internal(kv...) + mnmax = max(mmax, nmax) + m, n = something(size, (mnmax,mnmax)) + (m ≥ mmax && n ≥ nmax) || throw(DimensionMismatch("invalid size=$size")) + return sparse(CuVector(I), CuVector(J), V, m, n) +end + +function _cuda_spdiagm_internal(kv::Pair{<:Integer,<:CuVector{T}}...) where {T} + ncoeffs = 0 + for p in kv + ncoeffs += SparseArrays._nnz(p.second) + end + I = Vector{T}(undef, ncoeffs) + J = Vector{T}(undef, ncoeffs) + V = CuArray{promote_type(map(x -> eltype(x.second), kv)...)}(undef, ncoeffs) + i = 0 + m = 0 + n = 0 + for p in kv + k = p.first + v = p.second + if k < 0 + row = -k + col = 0 + elseif k > 0 + row = 0 + col = k + else + row = 0 + col = 0 + end + numel = SparseArrays._nnz(v) + r = 1+i:numel+i + I_r, J_r = SparseArrays._indices(v, row, col) + copyto!(view(I, r), I_r) + copyto!(view(J, r), J_r) + copyto!(view(V, r), v) + veclen = length(v) + m = max(m, row + veclen) + n = max(n, col + veclen) + i += numel + end + return I, J, V, m, n end LinearAlgebra.issymmetric(M::Union{CuSparseMatrixCSC,CuSparseMatrixCSR}) = size(M, 1) == size(M, 2) ? norm(M - transpose(M), Inf) == 0 : false diff --git a/test/libraries/cusparse/interfaces.jl b/test/libraries/cusparse/interfaces.jl index 53443eeaa4..25a1d701b4 100644 --- a/test/libraries/cusparse/interfaces.jl +++ b/test/libraries/cusparse/interfaces.jl @@ -581,7 +581,23 @@ end cuda_vec = CuVector(ref_vec) ref_spdiagm = spdiagm(ref_vec) # SparseArrays - cuda_spdiagm = spdiagm(cuda_vec) # CuSparseMatrixCSC + cuda_spdiagm = spdiagm(cuda_vec) + + ref_cuda_sparse = CuSparseMatrixCSC(ref_spdiagm) + + @test ref_cuda_sparse.rowVal == cuda_spdiagm.rowVal + + @test ref_cuda_sparse.nzVal == cuda_spdiagm.nzVal + + @test ref_cuda_sparse.colPtr == cuda_spdiagm.colPtr + end + + @testset "spdiagm(2 => CuVector{$elty})" for elty in [Float32, Float64, ComplexF32, ComplexF64] + ref_vec = collect(elty, 100:121) + cuda_vec = CuVector(ref_vec) + + ref_spdiagm = spdiagm(2 => ref_vec) # SparseArrays + cuda_spdiagm = spdiagm(2 => cuda_vec) ref_cuda_sparse = CuSparseMatrixCSC(ref_spdiagm) From 2523b114b6788a75b49a52b5f50595033e94eb18 Mon Sep 17 00:00:00 2001 From: Qingyu Qu <52615090+ErikQQY@users.noreply.github.com> Date: Fri, 23 May 2025 03:07:16 +0800 Subject: [PATCH 2/3] Should subtype keys --- lib/cusparse/array.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cusparse/array.jl b/lib/cusparse/array.jl index 74f7ec2ce0..4c11e0b5d6 100644 --- a/lib/cusparse/array.jl +++ b/lib/cusparse/array.jl @@ -349,7 +349,7 @@ function _cuda_spdiagm(size, kv::Pair{<:Integer, <:CuVector}...) return sparse(CuVector(I), CuVector(J), V, m, n) end -function _cuda_spdiagm_internal(kv::Pair{<:Integer,<:CuVector{T}}...) where {T} +function _cuda_spdiagm_internal(kv::Pair{T,<:CuVector}...) where {T<:Integer} ncoeffs = 0 for p in kv ncoeffs += SparseArrays._nnz(p.second) From f3322ad74f17d643dc207cd8852ccc1de8d090ae Mon Sep 17 00:00:00 2001 From: Qingyu Qu <2283984853@qq.com> Date: Fri, 23 May 2025 13:55:26 +0800 Subject: [PATCH 3/3] Remove DS_store --- .DS_Store | Bin 8196 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 4bf0b57ce46689c003024002295d7523a631fdf7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHMziSjh6n>Lk$YLx+3r|qkN()5@NHj%cbJ>Wd3LGd{h~5tq$sK#-4A=y=miz;D z7M2!QSw|4T&es1xLD0(D_hx2i-`wtsjd+kZu=9@n-rMinZ__}L4O&b1ppBq z6wfT-R5J*tqcRrknQIso)&mTo4}0(op2MJ$EhoeQaX=gp2gCt!U>+R6Z#Ipn;k$28 znZ*Hd;6yq=>qCqO#l*(kM7?z2q+0-tA)eL)e`6n@YhoJ{8*>wNDPGfb56YG*+hQnF zj(AMz7!wq4pbeW-u)C@hb|mo-_H8?;m&fW zmyO1zWb1xY-Y84c?l9{j9zFcjUOW2nalJXW|JS+WUCzHvGD6h3L%R!}wu?7@ag6JE z-@n;@WL*-)b-e5Wwn~YH4MHwPiC&el{9C0df+wb32~Pt zgC0ygC1>x@(&sR);nCHN;<+%q^q~&-c+Y9x2zPZ}z!Mn37~hn^3_o0^zauL-T*q3l zS?H+AEA{*-&(mf62(&K$t$@QLRAUjYVdK2h;Lwt}iu!z0yeM9Eh;O0)9^6`aP$Hb~ z%ii7Mo^2g}?p4&|yPXhUh<*=XAD(*88#>=P#yMZUb)2r2v)17rFMKB606Ax$^1|wc z65*WFspGVDoUw{}e8I8dn;>J)yUWEi(|j7?d{@5RD}A+S`5ddL#~1x1zEJN|PG;7V z=*=sRan92pwhB&H%kQ!d_js4KiC2a=Fb@s{MnsF&?ak)>|9Oxq8pHu{;2$}l!nBjN z@#40(uFz1g9pmvB4;qx0o2W~0((O1#-Hu~)|1iYgF{V;YVq