9. mcSPARSE 3 级函数参考

本章介绍稀疏线性代数函数,这些函数在稀疏矩阵和(通常很高的)稠密矩阵之间执行运算。

具有多个右侧值的稀疏三角线性系统的求解分两阶段实现。 首先,在分析阶段,通过调用适当的 csrsm2_analysis() 函数,分析稀疏三角矩阵以确定其元素之间的依赖关系。 该分析特定于给定矩阵的稀疏性模式和选定的 mcsparseOperation_t 类型。 来自分析阶段的信息存储在类型 csrsm2Info_t 的参数中,该参数之前已通过调用 mcsparseCreateCsrsm2Info() 进行初始化。

其次,在求解阶段,通过调用适当的 csrsm2_solve() 函数,使用存储在 csrsm2Info_t 参数中的信息求解给定的稀疏三角线性系统。 求解阶段可以使用不同的多个右侧值多次执行,而分析阶段只需要执行一次。 当一次需要逐个求解不同集合的多个右侧值时,稀疏三角线性系统的解法尤其有用,同时其系数矩阵保持不变。

最后,一旦所有求解完成,可以通过调用 mcsparseDestroyCsrsm2Info() 来释放由 csrsm2Info_t 参数指向的不透明数据结构。

9.1. mcsparse<t>bsrmm()

mcsparseStatus_t
mcsparseSbsrmm(mcsparseHandle_t         handle,
               mcsparseDirection_t      dirA,
               mcsparseOperation_t      transA,
               mcsparseOperation_t      transB,
               int                      mb,
               int                      n,
               int                      kb,
               int                      nnzb,
               const float*             alpha,
               const mcsparseMatDescr_t descrA,
               const float*             bsrValA,
               const int*               bsrRowPtrA,
               const int*               bsrColIndA,
               int                      blockDim,
               const float*             B,
               int                      ldb,
               const float*             beta,
               float*                   C,
               int                      ldc)

mcsparseStatus_t
mcsparseDbsrmm(mcsparseHandle_t         handle,
               mcsparseDirection_t      dirA,
               mcsparseOperation_t      transA,
               mcsparseOperation_t      transB,
               int                      mb,
               int                      n,
               int                      kb,
               int                      nnzb,
               const double*            alpha,
               const mcsparseMatDescr_t descrA,
               const double*            bsrValA,
               const int*               bsrRowPtrA,
               const int*               bsrColIndA,
               int                      blockDim,
               const double*            B,
               int                      ldb,
               const double*            beta,
               double*                  C,
               int                      ldc)

mcsparseStatus_t
mcsparseCbsrmm(mcsparseHandle_t         handle,
               mcsparseDirection_t      dirA,
               mcsparseOperation_t      transA,
               mcsparseOperation_t      transB,
               int                      mb,
               int                      n,
               int                      kb,
               int                      nnzb,
               const mcComplex*         alpha,
               const mcsparseMatDescr_t descrA,
               const mcComplex*         bsrValA,
               const int*               bsrRowPtrA,
               const int*               bsrColIndA,
               int                      blockDim,
               const mcComplex*         B,
               int                      ldb,
               const mcComplex*         beta,
               mcComplex*               C,
               int                      ldc)

mcsparseStatus_t
mcsparseZbsrmm(mcsparseHandle_t         handle,
               mcsparseDirection_t      dirA,
               mcsparseOperation_t      transA,
               mcsparseOperation_t      transB,
               int                      mb,
               int                      n,
               int                      kb,
               int                      nnzb,
               const mcDoubleComplex*   alpha,
               const mcsparseMatDescr_t descrA,
               const mcDoubleComplex*   bsrValA,
               const int*               bsrRowPtrA,
               const int*               bsrColIndA,
               int                      blockDim,
               const mcDoubleComplex*   B,
               int                      ldb,
               const mcDoubleComplex*   beta,
               mcDoubleComplex*         C,
               int                      ldc)

此函数具有以下限制:

  • 仅支持 MCSPARSE_MATRIX_TYPE_GENERAL 矩阵类型

  • 仅支持 blockDim > 1

transpose(B) 的目的是改善矩阵 B 的内存访问。 矩阵 B 按列主顺序排列的 A*transpose(B) 的计算模式等效于矩阵 B 按行主顺序排列的 A*B

实际上,迭代求解器或特征值求解器中的任何操作都不会使用 A*transpose(B)。 但是,我们可以执行与 A*B 相同的 A*transpose(transpose(B))。 例如,假设 Amb*kbBk*nCm*n,下面的代码显示了 mcsparseDbsrmm() 的用法。

// A是mb*kb,B是k*n,C是m*n
      const int m = mb*blockSize;
      const int k = kb*blockSize;
      const int ldb_B = k; // B的前导维度
      const int ldc   = m; // C的前导维度
// 执行C:=alpha*A*B + beta*C
      mcsparseSetMatType(descrA, MCSPARSE_MATRIX_TYPE_GENERAL );
      mcsparseDbsrmm(mcsparse_handle,
 MCSPARSE_DIRECTION_COLUMN, MCSPARSE_OPERATION_NON_TRANSPOSE, MCSPARSE_OPERATION_NON_TRANSPOSE, mb, n, kb, nnzb, alpha, descrA, bsrValA, bsrRowPtrA, bsrColIndA, blockSize, B, ldb_B, beta, C, ldc);

我们的建议不是使用 A*B,而是首先通过调用 mcblas<t>geam()B 转置为 Bt,然后执行 A*transpose(Bt)

// 步骤1:Bt:= transpose(B)
      const int m = mb*blockSize;
      const int k = kb*blockSize;
      double *Bt;
      const int ldb_Bt = n; // Bt的前导维度
      mcMalloc((void**)&Bt, sizeof(double)*ldb_Bt*k);
      double one  = 1.0;
      double zero = 0.0;
      mcblasSetPointerMode(mcblas_handle, MCBLAS_POINTER_MODE_HOST);
      mcblasDgeam(mcblas_handle, MCBLAS_OP_T, MCBLAS_OP_T,
         n, k, &one, B, int ldb_B, &zero, B, int ldb_B, Bt, ldb_Bt);

// 步骤2:执行C:=alpha*A*transpose(Bt) + beta*C
      mcsparseDbsrmm(mcsparse_handle,
      MCSPARSE_DIRECTION_COLUMN, MCSPARSE_OPERATION_NON_TRANSPOSE,
      MCSPARSE_OPERATION_TRANSPOSE, mb, n, kb, nnzb, alpha, descrA,
      bsrValA, bsrRowPtrA, bsrColIndA, blockSize, Bt, ldb_Bt, beta, C, ldc);

bsrmm() 具有以下特性:

  • 例程不需要额外的存储空间

  • 例程支持异步执行

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    dir

    块的存储格式, MCSPARSE_DIRECTION_ROWMCSPARSE_DIRECTION_COLUMN

    transA

    操作 op(A)

    transB

    操作 op(B)

    mb

    稀疏矩阵 A 的块行数。

    n

    稠密矩阵 op(B)A 的列数。

    kb

    稀疏矩阵 A 的块列数。

    nnzb

    稀疏矩阵 A 的非零块的数量。

    alpha

    用于乘法的<type>标量。

    descrA

    矩阵 A 的描述符。 支持的矩阵类型为 MCSPARSE_MATRIX_TYPE_GENERAL 此外,支持的索引库为 MCSPARSE_INDEX_BASE_ZEROMCSPARSE_INDEX_BASE_ONE

    bsrValA

    包含矩阵 Annzb 个 非零块的<type>数组。

    bsrRowPtrA

    由整数组成的长度为 mb + 1 的数组, 其中包含每个块行的起始位置 和最后一个块行结束位置加一。

    bsrColIndA

    包含矩阵 Annzb 个 非零块的列索引的整数数组。

    blockDim

    稀疏矩阵 A 的块维度,大于零。

    B

    如果 op(B)=B,则为 (ldb,n) 维度的数组;否则为 (ldb,k) 维度的数组。

    ldb

    B 的主维度。

    beta

    用于乘法的<type>标量。 如果 beta 为零, 则 C 不必是有效输入。

    C

    维度为 (ldc, n) 的数组。

    ldc

    C 的主维度。

    输出

    C

    更新后的维度为 (ldc, n) 的<type>数组。

有关返回状态的描述,请参见 4.2 mcsparseStatus_t

9.2. mcsparse<t>csrsm2_bufferSizeExt()

mcsparseStatus_t
mcsparseScsrsm2_bufferSizeExt(mcsparseHandle_t         handle,
                              int                      algo,
                              mcsparseOperation_t      transA,
                              mcsparseOperation_t      transB,
                              int                      m,
                              int                      nrhs,
                              int                      nnz,
                              const float*             alpha,
                              const mcsparseMatDescr_t descrA,
                              const float*             csrSortedValA,
                              const int*               csrSortedRowPtrA,
                              const int*               csrSortedColIndA,
                              const float*             B,
                              int                      ldb,
                              csrsm2Info_t             info,
                              mcsparseSolvePolicy_t    policy,
                              size_t*                  pBufferSize)

mcsparseStatus_t
mcsparseDcsrsm2_bufferSizeExt(mcsparseHandle_t         handle,
                              int                      algo,
                              mcsparseOperation_t      transA,
                              mcsparseOperation_t      transB,
                              int                      m,
                              int                      nrhs,
                              int                      nnz,
                              const double*            alpha,
                              const mcsparseMatDescr_t descrA,
                              const double*            csrSortedValA,
                              const int*               csrSortedRowPtrA,
                              const int*               csrSortedColIndA,
                              const double*            B,
                              int                      ldb,
                              csrsm2Info_t             info,
                              mcsparseSolvePolicy_t    policy,
                              size_t*                  pBufferSize)

mcsparseStatus_t
mcsparseCcsrsm2_bufferSizeExt(mcsparseHandle_t         handle,
                              int                      algo,
                              mcsparseOperation_t      transA,
                              mcsparseOperation_t      transB,
                              int                      m,
                              int                      nrhs,
                              int                      nnz,
                              const mcComplex*         alpha,
                              const mcsparseMatDescr_t descrA,
                              const mcComplex*         csrSortedValA,
                              const int*               csrSortedRowPtrA,
                              const int*               csrSortedColIndA,
                              const mcComplex*         B,
                              int                      ldb,
                              csrsm2Info_t             info,
                              mcsparseSolvePolicy_t    policy,
                              size_t*                  pBufferSize)

mcsparseStatus_t
mcsparseZcsrsm2_bufferSizeExt(mcsparseHandle_t         handle,
                              int                      algo,
                              mcsparseOperation_t      transA,
                              mcsparseOperation_t      transB,
                              int                      m,
                              int                      nrhs,
                              int                      nnz,
                              const mcDoubleComplex*   alpha,
                              const mcsparseMatDescr_t descrA,
                              const mcDoubleComplex*   csrSortedValA,
                              const int*               csrSortedRowPtrA,
                              const int*               csrSortedColIndA,
                              const mcDoubleComplex*   B,
                              int                      ldb,
                              csrsm2Info_t             info,
                              mcsparseSolvePolicy_t    policy,
                              size_t*                  pBufferSize)

此函数返回在稀疏三角线性系统 csrsm2 中使用的缓冲区的大小。

  • 例程不需要额外的存储空间

  • 例程支持异步执行

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    algo

    algo = 0是非阻塞版本。 algo = 1是阻塞版本。

    transA

    操作op(A)。

    transB

    操作op(B)。

    m

    矩阵 A 的行数。

    nrhs

    右侧矩阵 op(B) 的列数。

    nnz

    矩阵 A 的非零元素数。

    alpha

    用于乘法的<type>标量。

    descrA

    矩阵 A 的描述符。 支持的矩阵类型为 MCSPARSE_MATRIX_TYPE_GENERAL ,而支持的对角线类型为 MCSPARSE_DIAG_TYPE_UNITMCSPARSE_DIAG_TYPE_NON_UNIT

    csrValA

    类型为<type>的数组, 其中包含矩阵 Annz 个非零元素。

    csrRowPtrA

    由整数组成的长度为 m + 1 的数组, 其中包含每一行的起始位置 和最后一行结束位置加一。

    csrColIndA

    整数数组,长度为 nnz, 包含矩阵 A 非零元素的列索引。

    B

    <type>的右侧矩阵。 op(B) 的大小为 m-by-nrhs

    ldb

    BX 的 前导维度。

    info

    在分析阶段收集的信息的结构 (应该不经更改地传递到求解阶段)。

    policy

    支持的策略包括 MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL

    输出

    info

    基于不同算法的内部状态记录。

    pBufferSize

    csrsm2_analysiscsrsm2_solve 使用的 字节数。

有关返回状态的描述,请参见 4.2 mcsparseStatus_t

9.3. mcsparse<t>csrsm2_analysis()

mcsparseStatus_t
mcsparseScsrsm2_analysis(mcsparseHandle_t         handle,
                           int                      algo,
                           mcsparseOperation_t      transA,
                           mcsparseOperation_t      transB,
                           int                      m,
                           int                      nrhs,
                           int                      nnz,
                           const float*             alpha,
                           const mcsparseMatDescr_t descrA,
                           const float*             csrSortedValA,
                           const int*               csrSortedRowPtrA,
                           const int*               csrSortedColIndA,
                           const float*             B,
                           int                      ldb,
                           csrsm2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseDcsrsm2_analysis(mcsparseHandle_t         handle,
                           int                      algo,
                           mcsparseOperation_t      transA,
                           mcsparseOperation_t      transB,
                           int                      m,
                           int                      nrhs,
                           int                      nnz,
                           const double*            alpha,
                           const mcsparseMatDescr_t descrA,
                           const double*            csrSortedValA,
                           const int*               csrSortedRowPtrA,
                           const int*               csrSortedColIndA,
                           const double*            B,
                           int                      ldb,
                           csrsm2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseCcsrsm2_analysis(mcsparseHandle_t         handle,
                           int                      algo,
                           mcsparseOperation_t      transA,
                           mcsparseOperation_t      transB,
                           int                      m,
                           int                      nrhs,
                           int                      nnz,
                           const mcComplex*         alpha,
                           const mcsparseMatDescr_t descrA,
                           const mcComplex*         csrSortedValA,
                           const int*               csrSortedRowPtrA,
                           const int*               csrSortedColIndA,
                           const mcComplex*         B,
                           int                      ldb,
                           csrsm2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseZcsrsm2_analysis(mcsparseHandle_t         handle,
                           int                      algo,
                           mcsparseOperation_t      transA,
                           mcsparseOperation_t      transB,
                           int                      m,
                           int                      nrhs,
                           int                      nnz,
                           const mcDoubleComplex*   alpha,
                           const mcsparseMatDescr_t descrA,
                           const mcDoubleComplex*   csrSortedValA,
                           const int*               csrSortedRowPtrA,
                           const int*               csrSortedColIndA,
                           const mcDoubleComplex*   B,
                           int                      ldb,
                           csrsm2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

此函数执行稀疏三角线性系统 csrsm2 的分析阶段。

预期此函数在给定的矩阵和特定操作类型下只执行一次。

此函数需要由 csrsm2_bufferSize() 返回的缓冲区大小。 pBuffer 的地址必须是128字节的倍数。 如果不满足这些条件,将返回 MCSPARSE_STATUS_INVALID_VALUE

函数 csrsm2_analysis() 报告一个结构零,并计算存储在不透明结构info中的级别信息。 级别信息可以提高三角求解器的更多并行效率。 然而, csrsm2_solve() 可以在没有级别信息的情况下执行。 要禁用级别信息,用户需要将三角求解器的策略指定为 MCSPARSE_SOLVE_POLICY_NO_LEVEL

无论策略是 MCSPARSE_SOLVE_POLICY_NO_LEVEL 还是其他,函数 csrsm2_analysis() 总是报告第一个结构零。 如果指定了 MCSPARSE_DIAG_TYPE_UNIT,并且对于某些 jA(j,j) 缺失,则不会报告结构零。 用户需要调用 mcsparseXcsrsm2_zeroPivot() 来获取结构零的位置。

如果 csrsm2_analysis() 报告一个结构零,用户可自行决定是否调用csrsm2_solve()。

在这种情况下,用户仍然可以调用 csrsm2_solve(),此函数将在与结构零相同的位置返回一个数值零。 结果 X 是没有意义的。

  • 此函数需要内部分配的临时额外存储空间。

  • 如果流式有序内存分配器可用,则该例程支持异步执行

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    algo

    algo = 0是非阻塞版本。 algo = 1是阻塞版本。

    transA

    操作op(A)。

    transB

    操作op(B)。

    m

    矩阵 A 的行数。

    nrhs

    右侧矩阵 op(B) 的列数。

    nnz

    矩阵 A 的非零元素数。

    alpha

    用于乘法的<type>标量。

    descrA

    矩阵 A 的描述符。 支持的矩阵类型为 MCSPARSE_MATRIX_TYPE_GENERAL ,而支持的对角线类型为 MCSPARSE_DIAG_TYPE_UNITMCSPARSE_DIAG_TYPE_NON_UNIT

    csrValA

    类型为<type>的数组, 其中包含矩阵 Annz 个非零元素。

    csrRowPtrA

    由整数组成的长度为 m + 1 的数组, 其中包含每一行的起始位置 和最后一行结束位置加一。

    csrColIndA

    整数数组,长度为 nnz, 包含矩阵 A 非零元素的列索引。

    B

    <type>的右侧矩阵。 op(B) 的大小为 m-by-nrhs

    ldb

    BX 的 前导维度。

    info

    在分析阶段收集的信息的结构 (应该不经更改地传递到求解阶段)。

    policy

    支持的策略包括 MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL

    pBuffer

    用户分配的缓冲区, 大小由 csrsm2_bufferSize() 返回。

    输出

    info

    info是一个在分析阶段收集信息的结构体,(在求解阶段不 改变并传递给函数使用)。

有关返回状态的描述,请参见 4.2 mcsparseStatus_t

9.4. mcsparse<t>csrsm2_solve()

mcsparseStatus_t
mcsparseScsrsm2_solve(mcsparseHandle_t         handle,
                        int                      algo,
                        mcsparseOperation_t      transA,
                        mcsparseOperation_t      transB,
                        int                      m,
                        int                      nrhs,
                        int                      nnz,
                        const float*             alpha,
                        const mcsparseMatDescr_t descrA,
                        const float*             csrSortedValA,
                        const int*               csrSortedRowPtrA,
                        const int*               csrSortedColIndA,
                        float*                   B,
                        int                      ldb,
                        csrsm2Info_t             info,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseDcsrsm2_solve(mcsparseHandle_t         handle,
                        int                      algo,
                        mcsparseOperation_t      transA,
                        mcsparseOperation_t      transB,
                        int                      m,
                        int                      nrhs,
                        int                      nnz,
                        const double*            alpha,
                        const mcsparseMatDescr_t descrA,
                        const double*            csrSortedValA,
                        const int*               csrSortedRowPtrA,
                        const int*               csrSortedColIndA,
                        double*                  B,
                        int                      ldb,
                        csrsm2Info_t             info,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseCcsrsm2_solve(mcsparseHandle_t         handle,
                        int                      algo,
                        mcsparseOperation_t      transA,
                        mcsparseOperation_t      transB,
                        int                      m,
                        int                      nrhs,
                        int                      nnz,
                        const mcComplex*         alpha,
                        const mcsparseMatDescr_t descrA,
                        const mcComplex*         csrSortedValA,
                        const int*               csrSortedRowPtrA,
                        const int*               csrSortedColIndA,
                        mcComplex*               B,
                        int                      ldb,
                        csrsm2Info_t             info,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseZcsrsm2_solve(mcsparseHandle_t         handle,
                        int                      algo,
                        mcsparseOperation_t      transA,
                        mcsparseOperation_t      transB,
                        int                      m,
                        int                      nrhs,
                        int                      nnz,
                        const mcDoubleComplex*   alpha,
                        const mcsparseMatDescr_t descrA,
                        const mcDoubleComplex*   csrSortedValA,
                        const int*               csrSortedRowPtrA,
                        const int*               csrSortedColIndA,
                        mcDoubleComplex*         B,
                        int                      ldb,
                        csrsm2Info_t             info,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

此函数执行稀疏三角线性系统 csrsm2 的求解阶段。 参数 transB 作用于矩阵 B 和矩阵 X,只能取值为 MCSPARSE_OPERATION_NON_TRANSPOSEMCSPARSE_OPERATION_TRANSPOSE。 该操作是原地操作,即矩阵 B 被矩阵 X 覆盖。

如果 transBMCSPARSE_OPERATION_NON_TRANSPOSE,则 ldb 必须不小于 m。 否则,如果 transBMCSPARSE_OPERATION_TRANSPOSE,则 ldb 必须不小于 nrhs

此函数需要使用 csrsm2_bufferSize() 返回缓冲区大小。 参数 pBuffer 的地址必须是128字节的倍数,否则将返回 MCSPARSE_STATUS_INVALID_VALUE

尽管可以在不使用级别信息的情况下调用 csrsm2_solve(),但用户仍然需要注意一致性。 如果在调用 csrsm2_analysis() 时使用了 MCSPARSE_SOLVE_POLICY_USE_LEVEL 策略,那么 csrsm2_solve() 可以在有或没有级别信息的情况下运行。 相反,如果使用策略 MCSPARSE_SOLVE_POLICY_NO_LEVEL 调用了 csrsm2_analysis(),则 csrsm2_solve() 只能接受 MCSPARSE_SOLVE_POLICY_NO_LEVEL ; 否则,将返回 MCSPARSE_STATUS_INVALID_VALUE

级别信息可能不会提高性能,但会花费额外的时间进行分析。 例如,一个三对角矩阵没有并行性。 在这种情况下, MCSPARSE_SOLVE_POLICY_NO_LEVEL 的性能优于 MCSPARSE_SOLVE_POLICY_USE_LEVEL。 如果用户有一个迭代求解器,最佳方法是使用 MCSPARSE_SOLVE_POLICY_USE_LEVEL 进行一次 csrsm2_analysis()。 然后,在第一次运行时使用 MCSPARSE_SOLVE_POLICY_NO_LEVEL 进行 csrsm2_solve(),在第二次运行时使用 MCSPARSE_SOLVE_POLICY_USE_LEVEL,选择速度更快的方式执行剩余的迭代。 函数 csrsm2_solve() 报告第一个数值零的位置,包括结构零。 如果 status 为0,则没有找到数值零的位置。 此外,如果指定了 MCSPARSE_DIAG_TYPE_UNIT,即使某些 jA(j,j) 为零,也不报告数值零的位置。 用户需要调用 mcsparseXcsrsm2_zeroPivot() 来获取数值零的位置。

csrsm2 提供了两种由参数 algo 指定的算法。 algo=0 是非块版本, algo=1 是块版本。非块版本受内存带宽限制。 块版本将矩阵划分为小的块,并应用稠密运算。 尽管块版本的计算量比非块版本大,但如果非块版本已经达到最大带宽,块版本可能会更快。

如果 pBuffer != NULL ,此函数具有以下特性。

  • 该例程不需要额外的存储空间。

  • 该例程支持异步执行。

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    algo

    algo = 0是非阻塞版本。 algo = 1是阻塞版本。

    transA

    操作op(A)。

    transB

    操作op(B)。

    m

    矩阵 A 的行数。

    nrhs

    右侧矩阵 op(B) 的列数。

    nnz

    矩阵 A 的非零元素数。

    alpha

    用于乘法的<type>标量。

    descrA

    矩阵 A 的描述符。 支持的矩阵类型为 MCSPARSE_MATRIX_TYPE_GENERAL ,而支持的对角线类型为 MCSPARSE_DIAG_TYPE_UNITMCSPARSE_DIAG_TYPE_NON_UNIT

    csrValA

    类型为<type>的数组, 其中包含矩阵 Annz 个非零元素。

    csrRowPtrA

    由整数组成的长度为 m + 1 的数组, 其中包含每一行的起始位置 和最后一行结束位置加一。

    csrColIndA

    整数数组,长度为 nnz, 包含矩阵 A 非零元素的列索引。

    B

    <type>的右侧矩阵。 op(B) 的大小为 m-by-nrhs

    ldb

    BX 的 主维度。

    info

    在分析阶段收集的信息的结构 (应该不经更改地传递到求解阶段)。

    policy

    支持的策略包括 MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL

    pBuffer

    用户分配的缓冲区, 大小由 csrsm2_bufferSize() 返回。

    输出

    X

    <type>解矩阵,其中 op(X) 的大小为 m-by-nrhs

有关返回状态的描述,请参见 4.2 mcsparseStatus_t

9.5. mcsparseXcsrsm2_zeroPivot()

mcsparseStatus_t
mcsparseXcsrsm2_zeroPivot(mcsparseHandle_t handle,
                           csrsm2Info_t     info,
                           int*             position)

如果返回的错误代码为 MCSPARSE_STATUS_ZERO_PIVOT,则 position=j 表示 A(j,j) 具有结构零元素或数值零元素。否则, position=-1

position 可以是基于0或基于1的索引,与矩阵的索引方式相同。

函数 mcsparseXcsrsm2_zeroPivot() 是一个阻塞调用。 它调用 mcDeviceSynchronize() 来确保所有之前的核操作已完成。

position 可以存在于主机内存或设备内存中。 用户可以使用 mcsparseSetPointerMode() 来设置适当的模式。

  • 该例程不需要额外的存储空间。

  • 如果流式有序内存分配器可用,该例程支持异步执行。

    输入

    handle

    处理 mcSPARSE 库上下文的句柄

    info

    如果用户已经调用了 csrsm2_analysis()csrsm2_solve()info 包含结构零或 数值零

    输出

    position

    如果没有结构或数值零,则 position 为 -1; 否则,如果 A(j,j) 缺失或者 U(j,j) 为零, 则 position=j

有关返回状态的描述,请参见 4.2 mcsparseStatus_t

9.6. mcsparse<t>gemmi()

mcsparseStatus_t
mcsparseSgemmi(mcsparseHandle_t handle,
               int              m,
               int              n,
               int              k,
               int              nnz,
               const float*     alpha,
               const float*     A,
               int              lda,
               const float*     cscValB,
               const int*       cscColPtrB,
               const int*       cscRowIndB,
               const float*     beta,
               float*           C,
               int              ldc)

mcsparseStatus_t
mcsparseDgemmi(mcsparseHandle_t handle,
               int              m,
               int              n,
               int              k,
               int              nnz,
               const double*    alpha,
               const double*    A,
               int              lda,
               const double*    cscValB,
               const int*       cscColPtrB,
               const int*       cscRowIndB,
               const double*    beta,
               double*          C,
               int              ldc)

mcsparseStatus_t
mcsparseCgemmi(mcsparseHandle_t handle,
               int              m,
               int              n,
               int              k,
               int              nnz,
               const mcComplex* alpha,
               const mcComplex* A,
               int              lda,
               const mcComplex* cscValB,
               const int*       cscColPtrB,
               const int*       cscRowIndB,
               const mcComplex* beta,
               mcComplex*       C,
               int              ldc)

mcsparseStatus_t
mcsparseZgemmi(mcsparseHandle_t       handle,
               int                    m,
               int                    n,
               int                    k,
               int                    nnz,
               const mcDoubleComplex* alpha,
               const mcDoubleComplex* A,
               int                    lda,
               const mcDoubleComplex* cscValB,
               const int*             cscColPtrB,
               const int*             cscRowIndB,
               const mcDoubleComplex* beta,
               mcDoubleComplex*       C,
               int                    ldc)

函数 mcsparse<t>gemmi() 执行以下矩阵乘法运算:

C=alpha*A*B+beta*c

其中, AC 是稠密矩阵, B 是一个基于CSC存储格式的稀疏矩阵,由三个数组 cscValBcscColPtrBcscRowIndB 定义。 alphabeta 是标量值;注意: B 的索引是基于0的。

  • 该例程不需要额外的存储空间。

  • 该例程支持异步执行。

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    m

    矩阵A的行数。

    n

    矩阵 BC 的列数。

    k

    矩阵 A 的列数。

    nnz

    矩阵 B 的非零元素个数。

    alpha

    用于乘法的<type>标量

    A

    维度为 (lda, k) 的数组。

    lda

    矩阵 A 的主维度,至少为 m

    cscValB

    维度为 nnz 的<type>数组, 存储矩阵 B 的非零元素值。

    cscColPtrB

    长度为 k+1 的整数数组, 包含每一行的起始位置和 最后一行末尾位置加一。

    cscRowIndB

    维度为 nnz 的整数数组, 存储矩阵 B 的非零元素列索引。

    beta

    用于乘法的<type>标量 如果beta为0, 则C不需要是有效的输入。

    C

    维度为 (ldc, n) 的数组。

    ldc

    矩阵 C 的主维度,至少为 m

    输出

    C

    更新后的维度为 (ldc, n) 的<type>数组。

有关返回状态的描述,请参见 4.2 mcsparseStatus_t