rocsparse_sbsrsm_solve Interface Reference

rocsparse_sbsrsm_solve Interface Reference#

HIPFORT API Reference: hipfort_rocsparse::rocsparse_sbsrsm_solve Interface Reference
hipfort_rocsparse::rocsparse_sbsrsm_solve Interface Reference

Sparse triangular system solve using the BSR storage format. More...

Public Member Functions

integer(kind(rocsparse_status_success)) function rocsparse_sbsrsm_solve_ (handle, dir, trans_a, trans_x, mb, nrhs, nnzb, alpha, descr, bsr_val, bsr_row_ptr, bsr_col_ind, block_dim, myinfo, b, ldb, x, ldx, policy, temp_buffer)
 
integer(kind(rocsparse_status_success)) function rocsparse_sbsrsm_solve_rank_0 (handle, dir, trans_a, trans_x, mb, nrhs, nnzb, alpha, descr, bsr_val, bsr_row_ptr, bsr_col_ind, block_dim, myinfo, b, ldb, x, ldx, policy, temp_buffer)
 
integer(kind(rocsparse_status_success)) function rocsparse_sbsrsm_solve_rank_1 (handle, dir, trans_a, trans_x, mb, nrhs, nnzb, alpha, descr, bsr_val, bsr_row_ptr, bsr_col_ind, block_dim, myinfo, b, ldb, x, ldx, policy, temp_buffer)
 
integer(kind(rocsparse_status_success)) function rocsparse_sbsrsm_solve_full_rank (handle, dir, trans_a, trans_x, mb, nrhs, nnzb, alpha, descr, bsr_val, bsr_row_ptr, bsr_col_ind, block_dim, myinfo, b, ldb, x, ldx, policy, temp_buffer)
 

Detailed Description

Sparse triangular system solve using the BSR storage format.

rocsparse_bsrsm_solve solves a sparse triangular linear system of a sparse \(m \times m\) matrix, defined in BSR storage format, a column-oriented dense solution matrix \(X\), and the column-oriented dense right-hand side matrix \(B\) that is multiplied by \(\alpha\), such that

\[ op(A) \cdot op(X) = \alpha \cdot op(B), \]

with

\[ op(A) = \left\{ \begin{array}{ll} A, & \text{if trans_A == rocsparse_operation_none} \\% A^T, & \text{if trans_A == rocsparse_operation_transpose} \\% A^H, & \text{if trans_A == rocsparse_operation_conjugate_transpose} \end{array} \right. \]

,

\[ op(B) = \left\{ \begin{array}{ll} B, & \text{if trans_X == rocsparse_operation_none} \\% B^T, & \text{if trans_X == rocsparse_operation_transpose} \\% B^H, & \text{if trans_X == rocsparse_operation_conjugate_transpose} \end{array} \right. \]

and

\[ op(X) = \left\{ \begin{array}{ll} X, & \text{if trans_X == rocsparse_operation_none} \\% X^T, & \text{if trans_X == rocsparse_operation_transpose} \\% X^H, & \text{if trans_X == rocsparse_operation_conjugate_transpose} \end{array} \right. \]

and where \(m = block\_dim \times mb\).

Note that, as indicated above, the operation type of both \(op(B)\) and \(op(X)\) is specified by the trans_X parameter and that the operation type of B and X must match. For example, if \(op(B)=B\), then \(op(X)=X\). Likewise, if \(op(B)=B^T\), then \(op(X)=X^T\).

Given that the sparse matrix A is a square matrix, its size is \(m \times m\) regardless of whether A is transposed or not. The size of the column-oriented dense matrices B and X have a size that depends on the value of trans_X :

\[ op(B) = \left\{ \begin{array}{ll} ldb \times nrhs, \text{ } ldb ≥ m, & \text{if trans_X == rocsparse_operation_none} \\% ldb \times m, \text{ } ldb ≥ nrhs, & \text{if trans_X == rocsparse_operation_transpose} \\% ldb \times m, \text{ } ldb ≥ nrhs, & \text{if trans_X == rocsparse_operation_conjugate_transpose} \end{array} \right. \]

and

\[ op(X) = \left\{ \begin{array}{ll} ldb \times nrhs, \text{ } ldb ≥ m, & \text{if trans_X == rocsparse_operation_none} \\% ldb \times m, \text{ } ldb ≥ nrhs, & \text{if trans_X == rocsparse_operation_transpose} \\% ldb \times m, \text{ } ldb ≥ nrhs, & \text{if trans_X == rocsparse_operation_conjugate_transpose} \end{array} \right. \]

rocsparse_bsrsm_solve requires a user-allocated temporary buffer. Its size is returned by rocsparse_Xbsrsm_buffer_size(). The size of the required buffer is larger when trans_A equals rocsparse_operation_transpose or rocsparse_operation_conjugate_transpose and when trans_X is rocsparse_operation_none. The subsequent solve will also be faster when \(A\) is non-transposed and \(B\) is transposed (or conjugate transposed). For example, instead of solving:

\[ \left[ \begin{array}{c | c} \begin{array}{c c} a_{00} & a_{01} \\% a_{10} & a_{11} \end{array} & \begin{array}{c c} 0 & 0 \\% 0 & 0 \end{array} \\% \hline \begin{array}{c c} a_{20} & a_{21} \\% a_{30} & a_{31} \end{array} & \begin{array}{c c} a_{22} & a_{23} \\% a_{32} & a_{33} \end{array} \\% \end{array} \right] \cdot \begin{bmatrix} x_{00} & x_{01} \\% x_{10} & x_{11} \\% x_{20} & x_{21} \\% x_{30} & x_{31} \\% \end{bmatrix} = \begin{bmatrix} b_{00} & b_{01} \\% b_{10} & b_{11} \\% b_{20} & b_{21} \\% b_{30} & b_{31} \\% \end{bmatrix} \]

Consider solving:

\[ \left[ \begin{array}{c | c} \begin{array}{c c} a_{00} & a_{01} \\% a_{10} & a_{11} \end{array} & \begin{array}{c c} 0 & 0 \\% 0 & 0 \end{array} \\% \hline \begin{array}{c c} a_{20} & a_{21} \\% a_{30} & a_{31} \end{array} & \begin{array}{c c} a_{22} & a_{23} \\% a_{32} & a_{33} \end{array} \\% \end{array} \right] \cdot \begin{bmatrix} x_{00} & x_{10} & x_{20} & x_{30} \\% x_{01} & x_{11} & x_{21} & x_{31} \end{bmatrix}^{T} = \begin{bmatrix} b_{00} & b_{10} & b_{20} & b_{30} \\% b_{01} & b_{11} & b_{21} & b_{31} \end{bmatrix}^{T} \]

After the temporary storage buffer has been allocated, analysis metadata is required. It can be obtained by rocsparse_Xbsrsm_analysis().

Solving a triangular system involves inverting the diagonal blocks. This means that if the sparse matrix is missing the diagonal block (referred to as a structural zero) or the diagonal block is not invertible (referred to as a numerical zero) then a solution is not possible. rocsparse_bsrsm_solve tracks the location of the first zero pivot (either numerical or structural zero). The zero pivot status can be checked by calling rocsparse_bsrsm_zero_pivot (). If rocsparse_bsrsm_zero_pivot () returns rocsparse_status_success, then no zero pivot was found and therefore the matrix does not have a structural or numerical zero.

The user can specify that the sparse matrix should be interpreted as having identity blocks on the diagonal by setting the diagonal type on the descriptor descr to rocsparse_diag_type_unit using rocsparse_set_mat_diag_type. If rocsparse_diag_type == rocsparse_diag_type_unit, no zero pivot will be reported, even if the diagonal block \(A_{j,j}\) for some \(j\) is not invertible.

The sparse CSR matrix passed to rocsparse_bsrsm_solve does not actually have to be a triangular matrix. Instead, the triangular upper or lower part of the sparse matrix is solved based on rocsparse_fill_mode set on the descriptor descr. If the fill mode is set to rocsparse_fill_mode_lower, then the lower triangular matrix is solved. If the fill mode is set to rocsparse_fill_mode_upper, then the upper triangular matrix is solved.

Note
The sparse BSR matrix has to be sorted.
Operation type of B and X must match, , if \(op(B)=B\) then \(op(X)=X\).
This function is non-blocking and executed asynchronously with respect to the host. It can return before the actual computation has finished.
Currently, only trans_A != rocsparse_operation_conjugate_transpose and trans_X != rocsparse_operation_conjugate_transpose is supported.
This routine supports execution in a hipGraph context.
Parameters
[in]handle- handle to the rocSPARSE library context queue.
[in]dir- matrix storage of BSR blocks.
[in]trans_A- matrix A operation type.
[in]trans_X- matrix X operation type.
[in]mb- number of block rows of the sparse BSR matrix A.
[in]nrhs- number of columns of the column-oriented dense matrix op(X).
[in]nnzb- number of non-zero blocks of the sparse BSR matrix A.
[in]alpha- scalar \(\alpha\).
[in]descr- descriptor of the sparse BSR matrix A.
[in]bsr_val- array of nnzb blocks of the sparse BSR matrix.
[in]bsr_row_ptr- array of mb+1 elements that point to the start of every block row of the sparse BSR matrix.
[in]bsr_col_ind- array of nnzb containing the block column indices of the sparse BSR matrix.
[in]block_dim- block dimension of the sparse BSR matrix.
[in]myInfo- structure that holds the information collected during the analysis step.
[in]B- column-oriented dense matrix B with leading dimension ldb.
[in]ldb- leading dimension of rhs matrix B.
[out]X- column-oriented dense solution matrix X with leading dimension ldx.
[in]ldx- leading dimension of solution matrix X.
[in]policy- rocsparse_solve_policy_auto.
[in]temp_buffer- temporary storage buffer allocated by the user.
Return values
rocsparse_status_successthe operation completed successfully.
rocsparse_status_invalid_handlethe library context was not initialized.
rocsparse_status_invalid_sizemb, nrhs, nnzb, or block_dim is invalid.
rocsparse_status_invalid_pointeralpha, descr, bsr_val, bsr_row_ptr, bsr_col_ind, B, X info, or temp_buffer pointer is invalid.
rocsparse_status_internal_erroran internal error occurred.
rocsparse_status_not_implementedtrans_A == rocsparse_operation_conjugate_transpose, trans_X == rocsparse_operation_conjugate_transpose, or rocsparse_matrix_type != rocsparse_matrix_type_general.
Example
Consider the lower triangular \(m \times m\) matrix \(L\), stored in BSR storage format with non-unit diagonal. The following example solves \(L \cdot X = B\).

Member Function/Subroutine Documentation

◆ rocsparse_sbsrsm_solve_()

integer(kind(rocsparse_status_success)) function hipfort_rocsparse::rocsparse_sbsrsm_solve::rocsparse_sbsrsm_solve_ ( type(c_ptr), value  handle,
integer(kind(rocsparse_direction_row)), value  dir,
integer(kind(rocsparse_operation_none)), value  trans_a,
integer(kind(rocsparse_operation_none)), value  trans_x,
integer(c_int), value  mb,
integer(c_int), value  nrhs,
integer(c_int), value  nnzb,
real(c_float)  alpha,
type(c_ptr), value  descr,
type(c_ptr), value  bsr_val,
type(c_ptr), value  bsr_row_ptr,
type(c_ptr), value  bsr_col_ind,
integer(c_int), value  block_dim,
type(c_ptr), value  myinfo,
type(c_ptr), value  b,
integer(c_int), value  ldb,
type(c_ptr), value  x,
integer(c_int), value  ldx,
integer(kind(rocsparse_solve_policy_auto)), value  policy,
type(c_ptr), value  temp_buffer 
)

◆ rocsparse_sbsrsm_solve_full_rank()

integer(kind(rocsparse_status_success)) function hipfort_rocsparse::rocsparse_sbsrsm_solve::rocsparse_sbsrsm_solve_full_rank ( type(c_ptr)  handle,
integer(kind(rocsparse_direction_row))  dir,
integer(kind(rocsparse_operation_none))  trans_a,
integer(kind(rocsparse_operation_none))  trans_x,
integer(c_int)  mb,
integer(c_int)  nrhs,
integer(c_int)  nnzb,
real(c_float)  alpha,
type(c_ptr)  descr,
real(c_float), dimension(:), target  bsr_val,
integer(c_int), dimension(:), target  bsr_row_ptr,
integer(c_int), dimension(:), target  bsr_col_ind,
integer(c_int)  block_dim,
type(c_ptr)  myinfo,
real(c_float), dimension(:,:), target  b,
integer(c_int)  ldb,
real(c_float), dimension(:,:), target  x,
integer(c_int)  ldx,
integer(kind(rocsparse_solve_policy_auto))  policy,
type(c_ptr)  temp_buffer 
)

◆ rocsparse_sbsrsm_solve_rank_0()

integer(kind(rocsparse_status_success)) function hipfort_rocsparse::rocsparse_sbsrsm_solve::rocsparse_sbsrsm_solve_rank_0 ( type(c_ptr)  handle,
integer(kind(rocsparse_direction_row))  dir,
integer(kind(rocsparse_operation_none))  trans_a,
integer(kind(rocsparse_operation_none))  trans_x,
integer(c_int)  mb,
integer(c_int)  nrhs,
integer(c_int)  nnzb,
real(c_float)  alpha,
type(c_ptr)  descr,
real(c_float), target  bsr_val,
integer(c_int), target  bsr_row_ptr,
integer(c_int), target  bsr_col_ind,
integer(c_int)  block_dim,
type(c_ptr)  myinfo,
real(c_float), target  b,
integer(c_int)  ldb,
real(c_float), target  x,
integer(c_int)  ldx,
integer(kind(rocsparse_solve_policy_auto))  policy,
type(c_ptr)  temp_buffer 
)

◆ rocsparse_sbsrsm_solve_rank_1()

integer(kind(rocsparse_status_success)) function hipfort_rocsparse::rocsparse_sbsrsm_solve::rocsparse_sbsrsm_solve_rank_1 ( type(c_ptr)  handle,
integer(kind(rocsparse_direction_row))  dir,
integer(kind(rocsparse_operation_none))  trans_a,
integer(kind(rocsparse_operation_none))  trans_x,
integer(c_int)  mb,
integer(c_int)  nrhs,
integer(c_int)  nnzb,
real(c_float)  alpha,
type(c_ptr)  descr,
real(c_float), dimension(:), target  bsr_val,
integer(c_int), dimension(:), target  bsr_row_ptr,
integer(c_int), dimension(:), target  bsr_col_ind,
integer(c_int)  block_dim,
type(c_ptr)  myinfo,
real(c_float), dimension(:), target  b,
integer(c_int)  ldb,
real(c_float), dimension(:), target  x,
integer(c_int)  ldx,
integer(kind(rocsparse_solve_policy_auto))  policy,
type(c_ptr)  temp_buffer 
)

The documentation for this interface was generated from the following file: