From 28049881612da9e75ff1d02e8b10e1d35121b548 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Feb 2026 08:01:56 -0500 Subject: [PATCH 1/6] Fix for sparse-to-sparse matrix broadcast --- src/host/sparse.jl | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/host/sparse.jl b/src/host/sparse.jl index c5608b9d..349e1f18 100644 --- a/src/host/sparse.jl +++ b/src/host/sparse.jl @@ -670,7 +670,6 @@ end if leading_dim ≤ leading_dim_size iter = @inbounds iter_type(T, Ti)(leading_dim, args...) - output_ptrs = output isa GPUSparseDeviceMatrixCSR ? output.rowPtr : output.colPtr output_ivals = output isa GPUSparseDeviceMatrixCSR ? output.colVal : output.rowVal # fetch the row offset, and write it to the output @@ -691,7 +690,6 @@ end ptr = @inbounds ptrs[i] _getindex(arg, I, ptr) end - @inbounds output_ivals[output_ptr] = sub_leading_dim @inbounds output.nzVal[output_ptr] = f(vals...) output_ptr += one(Ti) @@ -903,7 +901,13 @@ function Broadcast.copy(bc::Broadcasted{<:Union{GPUSparseVecStyle,GPUSparseMatSt if output isa AbstractGPUSparseArray args = (bc.f, output, offsets, bc.args...) kernel = sparse_to_sparse_broadcast_kernel(get_backend(bc.args[first(sparse_args)])) - ndrange = output.nnz + ndrange = if sparse_typ <: AbstractGPUSparseVector + output.nnz + elseif sparse_typ <: AbstractGPUSparseMatrixCSC + size(output, 2) + else + size(output, 1) + end else args = sparse_typ <: AbstractGPUSparseVector ? (sparse_typ, bc.f, output, offsets, bc.args...) : (sparse_typ, bc.f, output, bc.args...) From d277f6612a7dc94a46cd29a5c1a47e7f4516b94e Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Feb 2026 08:07:39 -0500 Subject: [PATCH 2/6] Add test --- test/testsuite/sparse.jl | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index a31abe6d..b83d74d8 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -283,6 +283,13 @@ function broadcasting_matrix(AT, eltypes) dz = dx .* dy .* dw @test dz isa AT{ET} @test z == SparseMatrixCSC(dz) + + # create a matrix with nnz < leading_dim + x = spdiagm(m + 2, rand(ET, m - 2)) + dx = AT(x) + y = ET(0.1) * x + dy = ET(0.1) * dx + @test y == SparseMatrixCSC(dy) end end end From 325497dbafa54f0d4f855ea8ad3a512b2ec191f0 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Feb 2026 08:30:33 -0500 Subject: [PATCH 3/6] Fix test --- test/testsuite/sparse.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index b83d74d8..c2de2d09 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -285,7 +285,7 @@ function broadcasting_matrix(AT, eltypes) @test z == SparseMatrixCSC(dz) # create a matrix with nnz < leading_dim - x = spdiagm(m + 2, rand(ET, m - 2)) + x = spdiagm(m, n, (m + 2)=>rand(ET, m - 2)) dx = AT(x) y = ET(0.1) * x dy = ET(0.1) * dx From cdb41930796dbb64b37df6682aff26d4f55decde Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Feb 2026 08:52:00 -0500 Subject: [PATCH 4/6] Fix again --- test/testsuite/sparse.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index c2de2d09..cd026ea6 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -285,7 +285,7 @@ function broadcasting_matrix(AT, eltypes) @test z == SparseMatrixCSC(dz) # create a matrix with nnz < leading_dim - x = spdiagm(m, n, (m + 2)=>rand(ET, m - 2)) + x = spdiagm(m, m, (m + 2)=>rand(ET, m - 2)) dx = AT(x) y = ET(0.1) * x dy = ET(0.1) * dx From 631d1c33bc309e9cfc952327df1bda9289950627 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Feb 2026 09:08:26 -0500 Subject: [PATCH 5/6] stupid fix --- test/testsuite/sparse.jl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index cd026ea6..a8668eb0 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -285,7 +285,13 @@ function broadcasting_matrix(AT, eltypes) @test z == SparseMatrixCSC(dz) # create a matrix with nnz < leading_dim - x = spdiagm(m, m, (m + 2)=>rand(ET, m - 2)) + x = spdiagm(m, m, 2=>rand(ET, m - 2)) + dx = AT(x) + y = ET(0.1) * x + dy = ET(0.1) * dx + @test y == SparseMatrixCSC(dy) + + x = spdiagm(m, m, -2=>rand(ET, m - 2)) dx = AT(x) y = ET(0.1) * x dy = ET(0.1) * dx From 6e2f7fd0eba5a343db8716fb0102eb1907c8eef4 Mon Sep 17 00:00:00 2001 From: Katharine Hyatt Date: Tue, 17 Feb 2026 09:28:17 -0500 Subject: [PATCH 6/6] Let int types work too --- test/testsuite/sparse.jl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/testsuite/sparse.jl b/test/testsuite/sparse.jl index a8668eb0..3e0d92fe 100644 --- a/test/testsuite/sparse.jl +++ b/test/testsuite/sparse.jl @@ -287,14 +287,14 @@ function broadcasting_matrix(AT, eltypes) # create a matrix with nnz < leading_dim x = spdiagm(m, m, 2=>rand(ET, m - 2)) dx = AT(x) - y = ET(0.1) * x - dy = ET(0.1) * dx + y = ET(3) * x + dy = ET(3) * dx @test y == SparseMatrixCSC(dy) x = spdiagm(m, m, -2=>rand(ET, m - 2)) dx = AT(x) - y = ET(0.1) * x - dy = ET(0.1) * dx + y = ET(3) * x + dy = ET(3) * dx @test y == SparseMatrixCSC(dy) end end