Summary
On CUDA 13, linalg::Gesvd_truncate on a GPU tensor makes cusolverDnDgesvdj return CUSOLVER_STATUS_EXECUTION_FAILED, which checkCudaErrors turns into a fatal abort. Because it aborts the whole gpu_test_main process, it also prevents any test registered after it from running.
CUDA error at src/backend/linalg_internal_gpu/cuGeSvd_internal.cu:244 code=6(CUSOLVER_STATUS_EXECUTION_FAILED)
"cusolverDnDgesvdj(cusolverH, jobz, econ, N, M, (data_type *)Mij, ldA, (data_type *)S->data(),
(data_type *)vTMem, ldu, (data_type *)UMem, ldvT, (data_type *)d_work, lwork, devinfo, gesvdj_params)"
Where
src/backend/linalg_internal_gpu/cuGeSvd_internal.cu:244 — the cusolverDnDgesvdj (Jacobi SVD) call in the Double GPU Gesvd path.
Failing test
GesvdTruncate.GpuFlagCombinations (tests/gpu/linalg_test/truncate_test.cpp). It runs Gesvd_truncate on a random 6×5 tensor for Double and ComplexDouble; the Double case aborts on the gesvdj call. Minimal shape of the repro:
Tensor T = Tensor({6, 5}, Type.Double).to(Device.cuda);
InitTensorUniform(T); // values in [-1000, 1000]
linalg::Gesvd_truncate(T, /*keepdim=*/3, 0., true, true); // -> CUSOLVER_STATUS_EXECUTION_FAILED
Environment
- CUDA 13.0 (
nvcc V13.0.88), cuSOLVER bundled with CUDA 13
- NVIDIA RTX 4070 Ti SUPER,
sm_89
-DUSE_CUDA=ON -DUSE_CUTENSOR=OFF -DUSE_CUQUANTUM=OFF, Debug + ASan
Notes / relationship to other issues
Suggested follow-up
Investigate the gesvdj_params / jobz / econ setup and devinfo handling for cusolverDnDgesvdj under CUDA 13; when EXECUTION_FAILED is returned, devinfo should be read to report which superdiagonal failed to converge rather than aborting. A guard to skip the GPU SVD/QR tests when the required cuSOLVER path is unavailable would also keep the rest of gpu_test_main runnable.
Summary
On CUDA 13,
linalg::Gesvd_truncateon a GPU tensor makescusolverDnDgesvdjreturnCUSOLVER_STATUS_EXECUTION_FAILED, whichcheckCudaErrorsturns into a fatal abort. Because it aborts the wholegpu_test_mainprocess, it also prevents any test registered after it from running.Where
src/backend/linalg_internal_gpu/cuGeSvd_internal.cu:244— thecusolverDnDgesvdj(Jacobi SVD) call in the Double GPU Gesvd path.Failing test
GesvdTruncate.GpuFlagCombinations(tests/gpu/linalg_test/truncate_test.cpp). It runsGesvd_truncateon a random 6×5 tensor forDoubleandComplexDouble; the Double case aborts on thegesvdjcall. Minimal shape of the repro:Tensor T = Tensor({6, 5}, Type.Double).to(Device.cuda); InitTensorUniform(T); // values in [-1000, 1000] linalg::Gesvd_truncate(T, /*keepdim=*/3, 0., true, true); // -> CUSOLVER_STATUS_EXECUTION_FAILEDEnvironment
nvccV13.0.88), cuSOLVER bundled with CUDA 13sm_89-DUSE_CUDA=ON -DUSE_CUTENSOR=OFF -DUSE_CUQUANTUM=OFF, Debug + ASanNotes / relationship to other issues
Distinct from GPU cuSvd crashes with is_UvT=false (no U/vT buffers) #831. GPU cuSvd crashes with is_UvT=false (no U/vT buffers) #831 is the other SVD path —
cuSvd_internal→cusolverDnXgesvdp, which passes null U/V buffers whenis_UvT=false→cudaErrorIllegalAddress. GPU cuSvd crashes with is_UvT=false (no U/vT buffers) #831 explicitly states theGesvd/gesvdjpath "works"; this report shows that under CUDA 13 thegesvdjpath also fails, here withEXECUTION_FAILED(a cuSOLVER convergence/parameter failure, not a null-pointer deref). Likely a CUDA-13 cuSOLVERgesvdjcompatibility problem (cf. the CUDA-13cuKronbreakage in GPU build broken: cuKron fails to compile (CUDA 13) after the #982 type_promote change #999).Surfaced while running the full
gpu_test_mainsuite (which has no CI runner). For completeness, the other failures seen in that run are already tracked: zero-extentcudaFree→ GPU zero-extent Storage: cudaFree(cudaErrorInvalidValue) on destruction #1089, rank-0BlockUniTensor::Trace→ GPU BlockUniTensor Trace test uses wrong locator on rank-0 result (tests/gpu/BlockUniTensor_test.cpp) #1090, slow large-shape elementwise → Slow GPU tests: element-wise *AllShapes all_types/mixed_types cases dominate ctest runtime #851.linalg_Test.GpuBkFUtQrfails only because GPU QR requires cuQuantum (expected in aUSE_CUQUANTUM=OFFbuild; the test should be guarded/skipped rather than fail).Suggested follow-up
Investigate the
gesvdj_params/jobz/econsetup anddevinfohandling forcusolverDnDgesvdjunder CUDA 13; whenEXECUTION_FAILEDis returned,devinfoshould be read to report which superdiagonal failed to converge rather than aborting. A guard to skip the GPU SVD/QR tests when the required cuSOLVER path is unavailable would also keep the rest ofgpu_test_mainrunnable.