[Bug] Sparse-dense matmul returns zero for F-contiguous dense input (float64)
I've found a silent failure in Cupy's sparse-dense multiplication. When multiplying a large F-contiguous dense matrix with a CSR matrix in float64, the result is exactly zero, even though both inputs are non-zero.
Environment
- Cupy: 14.0.1 (cupy-cuda12x)
- CUDA: 12.x
- GPU: RTX 4090
- OS: Linux
Reproduction
This script reproduces the bug. It uses a dense matrix of shape (1380300, 377) and a 377x377 CSR matrix.
import cupy as cp
import cupyx.scipy.sparse as cpx_sparse
import numpy as np
import scipy.sparse as sp
def reproduce():
n_grid = 1380300
n_ao = 377
sparsity = 0.05
# Sparse CSR (float64)
dm = sp.random(n_ao, n_ao, density=sparsity, format='csr', dtype=np.float64)
dm_gpu = cpx_sparse.csr_matrix(dm)
# Dense F-contiguous (float64)
ao_gpu = cp.random.rand(n_grid, n_ao, dtype=np.float64)
ao_gpu_F = cp.asfortranarray(ao_gpu)
print(f"DM sum: {cp.sum(cp.abs(dm_gpu.data)):.6e}")
print(f"AO sum: {cp.sum(cp.abs(ao_gpu_F)):.6e}")
# This returns exactly 0.0
res = ao_gpu_F @ dm_gpu
print(f"Result sum: {cp.sum(cp.abs(res)):.6e}")
assert cp.sum(cp.abs(res)) > 0, \"Error: matmul returned zero\"
if __name__ == \"__main__\":
reproduce()
Observations
[Bug] Sparse-dense matmul returns zero for F-contiguous dense input (float64)
I've found a silent failure in Cupy's sparse-dense multiplication. When multiplying a large F-contiguous dense matrix with a CSR matrix in float64, the result is exactly zero, even though both inputs are non-zero.
Environment
Reproduction
This script reproduces the bug. It uses a dense matrix of shape (1380300, 377) and a 377x377 CSR matrix.
Observations
Result sum: 0.000000e+00