The SUNLinearSolver_cuSolverSp_batchQR
implementation of the SUNLinearSolver API is
designed to be used with the SUNMATRIX_CUSPARSE matrix, and the NVECTOR_CUDA vector.
The header file to include when using this module is
sunlinsol/sunlinsol_cusolversp_batchqr.h
. The installed library to link to
is libsundials_sunlinsolcusolversp.lib
where .lib
is typically
.so
for shared libraries and .a
for static libraries.
The SUNLinearSolver_cuSolverSp_batchQR module is experimental and subject to change.
The SUNLinearSolver_cuSolverSp_batchQR implementation provides an interface to the batched sparse QR factorization method provided by the NVIDIA cuSOLVER library ([cuSOLVER]). The module is designed for solving block diagonal linear systems of the form
where all block matrices \(\mathbf{A_j}\) share the same sparsisty pattern. The matrix must be the The SUNMATRIX_CUSPARSE Module.
The SUNLinearSolver_cuSolverSp_batchQR
module defines implementations of
all “direct” linear solver operations listed in The SUNLinearSolver API:
SUNLinSolGetType_cuSolverSp_batchQR
SUNLinSolInitialize_cuSolverSp_batchQR
– this sets the
first_factorize
flag to 1SUNLinSolSetup_cuSolverSp_batchQR
– this always copies the
relevant SUNMATRIX_SPARSE data to the GPU; if this is the first setup
it will perform symbolic analysis on the systemSUNLinSolSolve_cuSolverSp_batchQR
– this calls the
cusolverSpXcsrqrsvBatched
routine to perform factorizationSUNLinSolLastFlag_cuSolverSp_batchQR
SUNLinSolFree_cuSolverSp_batchQR
In addition, the module provides the following user-callable routines:
SUNLinSol_cuSolverSp_batchQR
(N_Vector y, SUNMatrix A, cusolverHandle_t cusol)¶The function SUNLinSol_cuSolverSp_batchQR
creates and allocates
memory for a SUNLinearSolver object.
This returns a SUNLinearSolver object. If either A
or
y
are incompatible then this routine will return NULL
.
This routine analyzes the input matrix and vector to determine the linear system size and to assess compatibility with the solver.
This routine will perform consistency checks to ensure that it is
called with consistent N_Vector
and SUNMatrix
implementations.
These are currently limited to the SUNMATRIX_CUSPARSE matrix type
and the NVECTOR_CUDA vector type. Since the SUNMATRIX_CUSPARSE matrix
type is only compatible with the NVECTOR_CUDA the restriction is also
in place for the linear solver. As additional compatible matrix and
vector implementations are added to SUNDIALS, these will be included
within this compatibility check.
SUNLinSol_cuSolverSp_batchQR_GetDescription
(SUNLinearSolver LS, char **desc)¶The function SUNLinSol_cuSolverSp_batchQR_GetDescription
accesses the string description of the object (empty by default).
SUNLinSol_cuSolverSp_batchQR_SetDescription
(SUNLinearSolver LS, const char *desc)¶The function SUNLinSol_cuSolverSp_batchQR_SetDescription
sets the string description of the object (empty by default).
SUNLinSol_cuSolverSp_batchQR_GetDeviceSpace
(SUNLinearSolver S, size_t* cuSolverInternal, size_t* cuSolverWorkspace)¶The function SUNLinSol_cuSolverSp_batchQR_GetDeviceSpace
returns the cuSOLVER batch QR method internal buffer size, in bytes,
in the argument cuSolverInternal
and the cuSOLVER
batch QR workspace buffer size, in bytes, in the agrument
cuSolverWorkspace
. The size of the internal buffer is
proportional to the number of matrix blocks while the size
of the workspace is almost independent of the number of blocks.
The SUNLinSol_cuSolverSp_batchQR module defines the content field of a
SUNLinearSolver
to be the following structure:
struct _SUNLinearSolverContent_cuSolverSp_batchQR {
int last_flag; /* last return flag */
booleantype first_factorize; /* is this the first factorization? */
size_t internal_size; /* size of cusolver buffer for Q and R */
size_t workspace_size; /* size of cusolver memory for factorization */
cusolverSpHandle_t cusolver_handle; /* cuSolverSp context */
csrqrInfo_t info; /* opaque cusolver data structure */
void* workspace; /* memory block used by cusolver */
const char* desc; /* description of this linear solver */
};