Eigen-Contrib  5.0.1
 
Loading...
Searching...
No Matches
CuDssSupport.h
1// This file is part of Eigen, a lightweight C++ template library
2// for linear algebra.
3//
4// Copyright (C) 2026 Rasmus Munk Larsen <rmlarsen@gmail.com>
5//
6// This Source Code Form is subject to the terms of the Mozilla
7// Public License v. 2.0. If a copy of the MPL was not distributed
8// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9// SPDX-License-Identifier: MPL-2.0
10
11// cuDSS-specific support types. cuDSS is NVIDIA's sparse direct solver library
12// (Cholesky, LDL^T, LU); it requires CUDA 12.0+ and ships separately from the
13// CUDA Toolkit.
14
15#ifndef EIGEN_GPU_CUDSS_SUPPORT_H
16#define EIGEN_GPU_CUDSS_SUPPORT_H
17
18// IWYU pragma: private
19#include "./InternalHeaderCheck.h"
20
21#include "./GpuSupport.h"
22#include <cudss.h>
23
29#if defined(CUDSS_VERSION) && CUDSS_VERSION >= 800
30#define EIGEN_HAS_CUDSS_SOLVER_CONFIG 1
31#else
32#define EIGEN_HAS_CUDSS_SOLVER_CONFIG 0
33#endif
34
35namespace Eigen {
36namespace gpu {
37namespace internal {
38#define EIGEN_CUDSS_CHECK(x) \
39 do { \
40 const cudssStatus_t _s = (x); \
41 if (_s != CUDSS_STATUS_SUCCESS) \
42 ::Eigen::gpu::internal::gpu_check_failed_code("cuDSS", static_cast<int>(_s), #x, __FILE__, __LINE__); \
43 } while (0)
44
45// cuDSS 0.8 changed cudssMatrixCreateDn/Csr from cudaDataType_t to the
46// value-compatible cudssDataType_t (CUDSS_R_32F == CUDA_R_32F, ...). Map the
47// module's cudaDataType_t traits through this alias so both API generations
48// compile.
49#if defined(CUDSS_VERSION) && CUDSS_VERSION >= 800
50using cudss_value_type_t = cudssDataType_t;
51#else
52using cudss_value_type_t = cudaDataType_t;
53#endif
54
55constexpr cudss_value_type_t to_cudss_data_type(cudaDataType_t t) { return static_cast<cudss_value_type_t>(t); }
56
57template <typename Scalar>
58struct cudss_spd_type;
59
60template <>
61struct cudss_spd_type<float> {
62 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_SPD;
63};
64template <>
65struct cudss_spd_type<double> {
66 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_SPD;
67};
68template <>
69struct cudss_spd_type<std::complex<float>> {
70 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_HPD;
71};
72template <>
73struct cudss_spd_type<std::complex<double>> {
74 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_HPD;
75};
76
77// Real → SYMMETRIC (A = A^T), complex → HERMITIAN (A = A^H). cuDSS also accepts
78// CUDSS_MTYPE_SYMMETRIC for complex (A = A^T, no conjugation), but SparseLDLT
79// implements Eigen's SimplicialLDLT semantics, which are Hermitian for complex.
80// Complex symmetric would need a separate trait and solver mode.
81template <typename Scalar>
82struct cudss_hermitian_type;
83
84template <>
85struct cudss_hermitian_type<float> {
86 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_SYMMETRIC;
87};
88template <>
89struct cudss_hermitian_type<double> {
90 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_SYMMETRIC;
91};
92template <>
93struct cudss_hermitian_type<std::complex<float>> {
94 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_HERMITIAN;
95};
96template <>
97struct cudss_hermitian_type<std::complex<double>> {
98 static constexpr cudssMatrixType_t value = CUDSS_MTYPE_HERMITIAN;
99};
100
101template <typename StorageIndex>
102struct cudss_index_type;
103
104template <>
105struct cudss_index_type<int> {
106 static constexpr cudaDataType_t value = CUDA_R_32I;
107};
108template <>
109struct cudss_index_type<int64_t> {
110 static constexpr cudaDataType_t value = CUDA_R_64I;
111};
112
113// A symmetric matrix stored as CSC (ColMajor) reaches cuDSS as CSR of A^T. The
114// data is identical since A = A^T, but the triangle view must be swapped.
115template <int UpLo, int StorageOrder>
116struct cudss_view_type;
117
118template <>
119struct cudss_view_type<Lower, ColMajor> {
120 static constexpr cudssMatrixViewType_t value = CUDSS_MVIEW_UPPER;
121};
122template <>
123struct cudss_view_type<Upper, ColMajor> {
124 static constexpr cudssMatrixViewType_t value = CUDSS_MVIEW_LOWER;
125};
126
127template <>
128struct cudss_view_type<Lower, RowMajor> {
129 static constexpr cudssMatrixViewType_t value = CUDSS_MVIEW_LOWER;
130};
131template <>
132struct cudss_view_type<Upper, RowMajor> {
133 static constexpr cudssMatrixViewType_t value = CUDSS_MVIEW_UPPER;
134};
135} // namespace internal
136} // namespace gpu
137} // namespace Eigen
138
139#endif // EIGEN_GPU_CUDSS_SUPPORT_H
Namespace containing all symbols from the Eigen library.