8. mcSPARSE 2 级函数参考

这一章介绍了在稀疏矩阵和稠密向量之间执行相关操作的稀疏线性代数函数。

在求解稀疏三角线性系统的问题时,通常会分为两个阶段。 首先,在分析阶段,通过调用适当的 csrsv2_analysis() 函数来分析稀疏三角矩阵,以确定其元素之间的依赖关系。 该分析过程针对给定矩阵的稀疏模式和特定的 mcsparseOperation_t 函数类型。 分析阶段的信息会存储在提前使用 mcsparseCreateCsrsv2Info() 函数初始化的 csrsv2Info_t 类型的参数中。

其次,在求解阶段,通过调用适当的 csrsv2Info_t 函数,使用存储在 csrsv2Info_t 参数中的信息来求解给定的稀疏三角线性系统。 可以每次使用不同的右侧表达式来多次执行求解阶段的操作,但是分析阶段只能执行一次。 当需要逐个求解一组系数矩阵保持不变但是拥有不同右侧表达式的稀疏三角线性系统时,这钟方法是非常有用的。

最后,一旦所有求解操作完成, csrsv2Info_t 参数指向的不透明数据结构将通过调用 mcsparseDestroyCsrsv2Info() 函数释放。

8.1. mcsparse<t>bsrmv()

mcsparseStatus_t
mcsparseSbsrmv(mcsparseHandle_t         handle,
               mcsparseDirection_t      dir,
               mcsparseOperation_t      trans,
               int                      mb,
               int                      nb,
               int                      nnzb,
               const float*             alpha,
               const mcsparseMatDescr_t descr,
               const float*             bsrVal,
               const int*               bsrRowPtr,
               const int*               bsrColInd,
               int                      blockDim,
               const float*             x,
               const float*             beta,
               float*                   y)

mcsparseStatus_t
mcsparseDbsrmv(mcsparseHandle_t         handle,
               mcsparseDirection_t      dir,
               mcsparseOperation_t      trans,
               int                      mb,
               int                      nb,
               int                      nnzb,
               const double*            alpha,
               const mcsparseMatDescr_t descr,
               const double*            bsrVal,
               const int*               bsrRowPtr,
               const int*               bsrColInd,
               int                      blockDim,
               const double*            x,
               const double*            beta,
               double*                  y)

mcsparseStatus_t
mcsparseCbsrmv(mcsparseHandle_t         handle,
               mcsparseDirection_t      dir,
               mcsparseOperation_t      trans,
               int                      mb,
               int                      nb,
               int                      nnzb,
               const mcComplex*         alpha,
               const mcsparseMatDescr_t descr,
               const mcComplex*         bsrVal,
               const int*               bsrRowPtr,
               const int*               bsrColInd,
               int                      blockDim,
               const mcComplex*         x,
               const mcComplex*         beta,
               mcComplex*               y)

mcsparseStatus_t
mcsparseZbsrmv(mcsparseHandle_t         handle,
               mcsparseDirection_t      dir,
               mcsparseOperation_t      trans,
               int                      mb,
               int                      nb,
               int                      nnzb,
               const mcDoubleComplex*   alpha,
               const mcsparseMatDescr_t descr,
               const mcDoubleComplex*   bsrVal,
               const int*               bsrRowPtr,
               const int*               bsrColInd,
               int                      blockDim,
               const mcDoubleComplex*   x,
               const mcDoubleComplex*   beta,
               mcDoubleComplex*         y)

此函数执行矩阵-向量操作。

bsrmv() 具有以下特性:

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

  • 该例程支持异步执行。

bsrmv() 的几个注意事项:

  • 仅支持 blockDim > 1

  • 仅支持 MCSPARSE_OPERATION_NON_TRANSPOSE

  • 仅支持 MCSPARSE_MATRIX_TYPE_GENERAL

例如,假设用户有一个CSR格式的矩阵,并希望尝试使用 bsrmv() 函数。下面的代码说明了如何在单精度计算中使用 csr2bsr() 转换和 bsrmv() 乘法。

// 假设A是一个用CSR格式表示的m x n的稀疏矩阵。
// hx是一个大小为n的主机向量,hy是一个大小为m的主机向量。
// m和n不是blockDim的倍数。
// 步骤1:将CSR转换为列优先的BSR格式
int base, nnz;
int nnzb;
mcsparseDirection_t dirA = MCSPARSE_DIRECTION_COLUMN;
int mb = (m + blockDim-1)/blockDim;
int nb = (n + blockDim-1)/blockDim;
mcMalloc((void**)&bsrRowPtrC, sizeof(int) *(mb+1));
mcsparseXcsr2bsrNnz(handle, dirA, m, n,
         descrA, csrRowPtrA, csrColIndA, blockDim,
         descrC, bsrRowPtrC, &nnzb);
mcMalloc((void**)&bsrColIndC, sizeof(int)*nnzb);
mcMalloc((void**)&bsrValC, sizeof(float)*(blockDim*blockDim)*nnzb);
mcsparseScsr2bsr(handle, dirA, m, n,
         descrA, csrValA, csrRowPtrA, csrColIndA, blockDim,
         descrC, bsrValC, bsrRowPtrC, bsrColIndC);
// 第二步,为bsrmv分配足够大的向量x和向量y
mcMalloc((void**)&x, sizeof(float)*(nb*blockDim));
mcMalloc((void**)&y, sizeof(float)*(mb*blockDim));
mcMemcpy(x, hx, sizeof(float)*n, mcMemcpyHostToDevice);
mcMemcpy(y, hy, sizeof(float)*m, mcMemcpyHostToDevice);
// 第三步:执行 bsrmv
mcsparseSbsrmv(handle, dirA, transA, mb, nb, nnzb, &alpha,
   descrC, bsrValC, bsrRowPtrC, bsrColIndC, blockDim, x, &beta, y);

输入

handle

处理mcSPARSE库上下文的句柄。

dir

块的存储格式,可以是 MCSPARSE_DIRECTION_ROWMCSPARSE_DIRECTION_COLUMN

trans

仅支持 MCSPARSE_OPERATION_NON_TRANSPOSE

mb

矩阵的块行数

nb

矩阵的块列数。

nnzb

矩阵的非零块数。

alpha

用于乘法运算的<type> 标量。

descr

矩阵的描述符。支持的矩阵类型有 MCSPARSE_MATRIX_TYPE_GENERAL 此外,支持的索引基准有 MCSPARSE_INDEX_BASE_ZEROMCSPARSE_INDEX_BASE_ONE

bsrVal

存储矩阵非零块的 <type> 数组。

bsrRowPtr

包含每个块行的起始位置和最后一个块行 结束位置后移一位的整数数组,数组长度 为 mb

bsrColInd

存储了矩阵非零块的列索引的整数数组

blockDim

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

x

指向<type> 元素的向量。

beta

<type> 标量用于乘法运算。如果 beta 为零, y 可以不是有效的 输入。

y

指向<type> 元素的向量。

输出

y

更新后的<type>向量。

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

8.2. mcsparse<t>bsrxmv()

mcsparseStatus_t
mcsparseSbsrxmv(mcsparseHandle_t         handle,
                  mcsparseDirection_t      dir,
                  mcsparseOperation_t      trans,
                  int                      sizeOfMask,
                  int                      mb,
                  int                      nb,
                  int                      nnzb,
                  const float*             alpha,
                  const mcsparseMatDescr_t descr,
                  const float*             bsrVal,
                  const int*               bsrMaskPtr,
                  const int*               bsrRowPtr,
                  const int*               bsrEndPtr,
                  const int*               bsrColInd,
                  int                      blockDim,
                  const float*             x,
                  const float*             beta,
                  float*                   y)

mcsparseStatus_t
mcsparseDbsrxmv(mcsparseHandle_t         handle,
                  mcsparseDirection_t      dir,
                  mcsparseOperation_t      trans,
                  int                      sizeOfMask,
                  int                      mb,
                  int                      nb,
                  int                      nnzb,
                  const double*            alpha,
                  const mcsparseMatDescr_t descr,
                  const double*            bsrVal,
                  const int*               bsrMaskPtr,
                  const int*               bsrRowPtr,
                  const int*               bsrEndPtr,
                  const int*               bsrColInd,
                  int                      blockDim,
                  const double*            x,
                  const double*            beta,
                  double*                  y)

mcsparseStatus_t
mcsparseCbsrxmv(mcsparseHandle_t         handle,
                  mcsparseDirection_t      dir,
                  mcsparseOperation_t      trans,
                  int                      sizeOfMask,
                  int                      mb,
                  int                      nb,
                  int                      nnzb,
                  const mcComplex*         alpha,
                  const mcsparseMatDescr_t descr,
                  const mcComplex*         bsrVal,
                  const int*               bsrMaskPtr,
                  const int*               bsrRowPtr,
                  const int*               bsrEndPtr,
                  const int*               bsrColInd,
                  int                      blockDim,
                  const mcComplex*         x,
                  const mcComplex*         beta,
                  mcComplex*               y)

mcsparseStatus_t
mcsparseZbsrxmv(mcsparseHandle_t         handle,
                  mcsparseDirection_t      dir,
                  mcsparseOperation_t      trans,
                  int                      sizeOfMask,
                  int                      mb,
                  int                      nb,
                  int                      nnzb,
                  const mcDoubleComplex*   alpha,
                  const mcsparseMatDescr_t descr,
                  const mcDoubleComplex*   bsrVal,
                  const int*               bsrMaskPtr,
                  const int*               bsrRowPtr,
                  const int*               bsrEndPtr,
                  const int*               bsrColInd,
                  int                      blockDim,
                  const mcDoubleComplex*   x,
                  const mcDoubleComplex*   beta,
                  mcDoubleComplex*         y)

此函数执行了一个 bsrmv 操作和一个掩码操作。

bsrmv() 具有以下特性:

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

  • 该例程支持异步执行。

bsrmv() 的几个注意事项:

  • 仅支持 blockDim > 1

  • 仅支持 MCSPARSE_OPERATION_NON_TRANSPOSEMCSPARSE_MATRIX_TYPE_GENERAL

  • 参数 bsrMaskPtrbsrRowPtrbsrEndPtrbsrColInd 与基准索引一致,可以是基于一的基准索引或基于零的基准索引。上面的示例是基数为一的基准索引。

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    dir

    块的存储格式,可以是 MCSPARSE_DIRECTION_ROWMCSPARSE_DIRECTION_COLUMN

    trans

    仅支持 MCSPARSE_OPERATION_NON_TRANSPOSE

    sizeOfMask

    y中被更新的块行的数量。

    mb

    矩阵的块行数。

    nb

    矩阵的块列数。

    nnzb

    矩阵的非零块数。

    alpha

    用于乘法运算的<type> 标量。

    descr

    矩阵的描述符。支持的矩阵类型有 MCSPARSE_MATRIX_TYPE_GENERAL 此外,支持的索引基准有 MCSPARSE_INDEX_BASE_ZEROMCSPARSE_INDEX_BASE_ONE

    bsrVal

    矩阵的 nnz 个非零块的 <type> 数组。

    bsrMaskPtr

    存储与更新的块行相对应索引的长度为 sizeOfMask 整数数组。

    bsrRowPtr

    包含每个块行的起始位置的整数数组,数 组长度为 mb

    bsrEndPtr

    包含最后一个块行结束位置后移一位的 整数数组,数组长度为 mb

    bsrColInd

    存储了矩阵非零块 nnzb 个列索引信 息的整数数组。

    blockDim

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

    x

    指向元素的<type>向量。

    beta

    <type>标量用于乘法运算。如果 beta 为零, y 可以不是有效的 输入。

    y

    元素的<type>向量。

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

8.3. mcsparse<t>bsrsv2_bufferSize()

mcsparseStatus_t
mcsparseSbsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           float*                   bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

mcsparseStatus_t
mcsparseDbsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           double*                  bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

mcsparseStatus_t
mcsparseCbsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           mcComplex*               bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

mcsparseStatus_t
mcsparseZbsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           mcDoubleComplex*         bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

此函数返回在新稀疏三角线性系统 bsrsv2 中使用的缓冲区大小。 虽然参数 trans 和矩阵 A 的上(下)三角部分有六种组合,但是 bsrsv2_bufferSize() 仅会返回这些组合中最大缓冲区的大小。 缓冲区的大小取决于维度 mbblockDim 以及矩阵的非零块数 nnzb。 如果用户更改了矩阵,则必须再次调用 bsrsv2_bufferSize() 来获取正确的缓冲区大小;否则可能会导致段错误。

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

  • 该例程支持异步执行。

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    dir

    块的存储格式,可以是 MCSPARSE_DIRECTION_ROWMCSPARSE_DIRECTION_COLUMN

    transA

    op(A)操作

    mb

    矩阵 A 的块行数。

    nnzb

    矩阵 A 中非零块的数量。

    descrA

    矩阵 A 的描述符。支持的矩阵类 型有 MCSPARSE_MATRIX_TYPE_GENERAL 此外,支持的索引基准有 MCSPARSE_INDEX_BASE_ZEROMCSPARSE_INDEX_BASE_ONE

    bsrValA

    存储矩阵 A nnzb 个非零 块的<type>数组。

    bsrRowPtrA

    包含每个块行的起始位置和最后一个块 行结束位置后移一位的整数数组,数组 长度为 mb

    bsrColIndA

    存储了矩阵 A 中非零块 nnzb 个列索引信息的整数数组。

    blockDim

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

    输出

    info

    根据不同的算法记录的内部状态。

    pBufferSizeInBytes

    bsrsv2_analysis()bsrsv2_solve() 函数中使用的缓冲区的字节 数。

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

8.4. mcsparse<t>bsrsv2_analysis()

mcsparseStatus_t
mcsparseSbsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           const float*             bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseDbsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           const double*            bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseDbsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           const mcComplex*         bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseZbsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseDirection_t      dirA,
                           mcsparseOperation_t      transA,
                           int                      mb,
                           int                      nnzb,
                           const mcsparseMatDescr_t descrA,
                           const mcDoubleComplex*   bsrValA,
                           const int*               bsrRowPtrA,
                           const int*               bsrColIndA,
                           int                      blockDim,
                           bsrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

此函数执行新稀疏三角线性系统 bsrsv2 的分析阶段。 BSR格式的块大小为 blockDim*blockDim,根据参数 dirA 的设置可以按列主序或行主序存储。参数 dirA 可以为 MCSPARSE_DIRECTION_COLUMNMCSPARSE_DIRECTION_ROW。 矩阵类型必须是 MCSPARSE_MATRIX_TYPE_GENERAL,而填充模式和对角线类型则没有要求。

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

此函数需要由 bsrsv2_bufferSize() 返回缓冲区大小。 pBuffer 的地址必须是128字节的倍数, 如果不是,将返回 MCSPARSE_STATUS_INVALID_VALUE 参数。

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

函数 bsrsv2_analysis() 总是报告第一个结构零,即使参数 policyMCSPARSE_SOLVE_POLICY_NO_LEVEL。 指定为 MCSPARSE_DIAG_TYPE_UNIT 时,即使某些 j 的块 A(j,j) 缺失,也不会报告任何结构零。 用户需要调用 mcsparseXbsrsv2_zeroPivot() 来确定结构零的位置。

如果 bsrsv2_analysis() 报告了一个结构零,用户可以选择是否调用 bsrsv2_solve()。在这种情况下,用户仍然可以调用 bsrsv2_solve(),此函数将在与结构零相同的位置返回一个数值零。 然而,结果 x 是没有意义的。

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

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

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    dir

    块的存储格式,可以是 MCSPARSE_DIRECTION_ROWMCSPARSE_DIRECTION_COLUMN

    transA

    op(A)操作

    mb

    矩阵 A 的块行数。

    nnzb

    矩阵 A 中非零块的数量。

    descrA

    矩阵 A 的描述符。支持的矩阵类型有 MCSPARSE_MATRIX_TYPE_GENERAL 此外,支持的基准索引有 MCSPARSE_INDEX_BASE_ZEROMCSPARSE_INDEX_BASE_ONE

    bsrValA

    存储矩阵 A nnzb 个非零块的 <type>数组。

    bsrRowPtrA

    包含每个块行的起始位置和最后一个块行结 束位置后移一位的整数数组,数组长度为 mb

    bsrColIndA

    存储了矩阵 A 中非零块 nnzb 个 列索引信息的整数数组。

    blockDim

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

    info

    mcsparseCreateBsrsv2Info() 初始化的结构。

    policy

    支持的策略有 MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL

    pBuffer

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

    输出

    info

    将在分析阶段收集的信息填充到结构中 (应该在传递给求解阶段时保持不变)。

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

8.5. mcsparse<t>bsrsv2_solve()

mcsparseStatus_t
mcsparseSbsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseDirection_t      dirA,
                        mcsparseOperation_t      transA,
                        int                      mb,
                        int                      nnzb,
                        const float*             alpha,
                        const mcsparseMatDescr_t descrA,
                        const float*             bsrValA,
                        const int*               bsrRowPtrA,
                        const int*               bsrColIndA,
                        int                      blockDim,
                        bsrsv2Info_t             info,
                        const float*             x,
                        float*                   y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseDbsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseDirection_t      dirA,
                        mcsparseOperation_t      transA,
                        int                      mb,
                        int                      nnzb,
                        const double*            alpha,
                        const mcsparseMatDescr_t descrA,
                        const double*            bsrValA,
                        const int*               bsrRowPtrA,
                        const int*               bsrColIndA,
                        int                      blockDim,
                        bsrsv2Info_t             info,
                        const double*            x,
                        double*                  y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseCbsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseDirection_t      dirA,
                        mcsparseOperation_t      transA,
                        int                      mb,
                        int                      nnzb,
                        const mcComplex*         alpha,
                        const mcsparseMatDescr_t descrA,
                        const mcComplex*         bsrValA,
                        const int*               bsrRowPtrA,
                        const int*               bsrColIndA,
                        int                      blockDim,
                        bsrsv2Info_t             info,
                        const mcComplex*         x,
                        mcComplex*               y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseZbsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseDirection_t      dirA,
                        mcsparseOperation_t      transA,
                        int                      mb,
                        int                      nnzb,
                        const mcDoubleComplex*   alpha,
                        const mcsparseMatDescr_t descrA,
                        const mcDoubleComplex*   bsrValA,
                        const int*               bsrRowPtrA,
                        const int*               bsrColIndA,
                        int                      blockDim,
                        bsrsv2Info_t             info,
                        const mcDoubleComplex*   x,
                        mcDoubleComplex*         y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

此函数执行新稀疏三角线性系统 bsrsv2 的求解阶段。 BSR格式中的块大小为 blockDim*blockDim,并根据参数 dirA 确定是按列主序(column-major)还是按行主序(row-major)存储。 dirA 参数的取值可以是 MCSPARSE_DIRECTION_COLUMNMCSPARSE_DIRECTION_ROW。 矩阵类型必须为 MCSPARSE_MATRIX_TYPE_GENERAL,而填充模式和对角线类型则没有要求。函数 bsrsv02_solve() 可以支持任意的 blockDim 大小。

此函数预计会在给定矩阵和特定操作类型下多次执行。

此函数需要由 bsrsv2_bufferSize() 返回缓冲区大小。 pBuffer 的地址必须是128字节的倍数, 如果不是,将返回 MCSPARSE_STATUS_INVALID_VALUE 参数。

尽管 bsrsv2_solve() 可以在没有级别信息的情况下执行,用户仍然需要注意一致性。 如果使用策略 MCSPARSE_SOLVE_POLICY_USE_LEVEL 来调用 bsrsv2_analysis(),则使不使用级别都能运行 bsrsv2_solve()。 另外,如果使用 MCSPARSE_SOLVE_POLICY_NO_LEVEL 调用 bsrsv2_analysis(),那么 bsrsv2_solve() 只能接受 MCSPARSE_SOLVE_POLICY_NO_LEVEL 来运行; 否则,将返回 MCSPARSE_STATUS_INVALID_VALUE

级别信息可能不仅不会提高性能,还可能会花费额外的时间进行分析。 例如,三对角矩阵没有并行性。 在这种情况下, MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL 性能更好。 如果用户有一个迭代求解器,最好的方法是使用 MCSPARSE_SOLVE_POLICY_USE_LEVEL 进行一次 bsrsv2_analysis()。 然后,在第一次运行中使用 MCSPARSE_SOLVE_POLICY_NO_LEVEL 进行 bsrsv2_solve(),在第二次运行中使用 MCSPARSE_SOLVE_POLICY_USE_LEVEL,然后选择最快的方法来执行剩余的迭代。

函数 bsrsv02_solve() 的行为与 csrsv02_solve() 相同。 也就是说, bsr2csr(bsrsv02(A)) = csrsv02(bsr2csr(A))csrsv02_solve() 中的数值零意味着存在某个零元素 A(j,j)bsrsv02_solve() 中的数值零意味着存在某个不可逆的块 A(j,j)

函数 bsrsv2_solve() 会报告第一个数值零,包括结构零。 指定 MCSPARSE_DIAG_TYPE_UNIT 时,即使 A(j,j) 对于某些 j 不可逆,也不会报告数值零。 用户需要调用 mcsparseXbsrsv2_zeroPivot() 来了解数值零的位置。

如果 pBuffer != NULL,此函数将支持以下属性。

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

  • 该例程支持异步执行。

例如,假设L是一个具有单位对角线的下三角矩阵,那么以下代码可以通过级别信息求解有关 L*y=x 的问题。

// 假设L是由BSR格式表示的m x m稀疏矩阵。
// 块行/列的数量为mb,
// 非零块的数量为nnzb。
// L是下三角矩阵,并且具有单位对角线。
// 假设:
// - 矩阵L的维度为m(=mb*blockDim),
// - 矩阵L有nnz(=nnzb*blockDim*blockDim) 个非零元素,
// - 句柄已经通过mcsparseCreate()函数创建,
// - (d_bsrRowPtr, d_bsrColInd, d_bsrVal) 是存储在设备内存中的L的BSR格式,
// - d_x是存储在设备内存中的右侧向量,
// - d_y是存储在设备内存中的解向量,
// - d_x和d_y的大小为m。
mcsparseMatDescr_t descr = 0;
bsrsv2Info_t info = 0;
int pBufferSize;
void *pBuffer = 0;
int structural_zero;
int numerical_zero;
const double alpha = 1.;
const mcsparseSolvePolicy_t policy = MCSPARSE_SOLVE_POLICY_USE_LEVEL;
const mcsparseOperation_t trans = MCSPARSE_OPERATION_NON_TRANSPOSE;
const mcsparseDirection_t dir = MCSPARSE_DIRECTION_COLUMN;

// 步骤1:创建一个描述符,其中包含以下内容:
// - 矩阵L是从1开始编号的
// - 矩阵L是下三角矩阵
// - 矩阵L具有由参数MCSPARSE_DIAG_TYPE_UNIT指定的单位对角线
//   (L可能并不具有所有对角线元素。)
mcsparseCreateMatDescr(&descr);
mcsparseSetMatIndexBase(descr, MCSPARSE_INDEX_BASE_ONE);
mcsparseSetMatFillMode(descr, MCSPARSE_FILL_MODE_LOWER);
mcsparseSetMatDiagType(descr, MCSPARSE_DIAG_TYPE_UNIT);

// 步骤2:创建一个空的信息结构体
mcsparseCreateBsrsv2Info(&info);

// 步骤3:查询bsrsv2中使用了多少内存,并分配缓冲区
mcsparseDbsrsv2_bufferSize(handle, dir, trans, mb, nnzb, descr,
      d_bsrVal, d_bsrRowPtr, d_bsrColInd, blockDim, &pBufferSize);

// 由mcMalloc返回的pBuffer会自动对齐到128字节。
mcMalloc((void**)&pBuffer, pBufferSize);

// 步骤4:执行分析
mcsparseDbsrsv2_analysis(handle, dir, trans, mb, nnzb, descr,
      d_bsrVal, d_bsrRowPtr, d_bsrColInd, blockDim,
      info, policy, pBuffer);
// L具有单位对角线,因此不会报告结构性零。
status = mcsparseXbsrsv2_zeroPivot(handle, info, &structural_zero);
if (MCSPARSE_STATUS_ZERO_PIVOT == status){
   printf("L(%d,%d) is missing\n", structural_zero, structural_zero);
}

// 步骤5: 处理 L*y = x
mcsparseDbsrsv2_solve(handle, dir, trans, mb, nnzb, &alpha, descr,
   d_bsrVal, d_bsrRowPtr, d_bsrColInd, blockDim, info,
   d_x, d_y, policy, pBuffer);
// L具有单位对角线,因此不会报告任何数值零。
status = mcsparseXbsrsv2_zeroPivot(handle, info, &numerical_zero);
if (MCSPARSE_STATUS_ZERO_PIVOT == status){
   printf("L(%d,%d) is zero\n", numerical_zero, numerical_zero);
}

// 步骤6: 释放资源
mcFree(pBuffer);
mcsparseDestroyBsrsv2Info(info);
mcsparseDestroyMatDescr(descr);
mcsparseDestroy(handle);

输入

handle

处理mcSPARSE库上下文的句柄。

dir

块的存储格式,可以是 MCSPARSE_DIRECTION_ROWMCSPARSE_DIRECTION_COLUMN

transA

op(A)操作

mb

矩阵 A 中块的行数和列数。

alpha

用于乘法运算的<type>标量。

descrA

矩阵 A 的描述符。支持的矩阵类型有 MCSPARSE_MATRIX_TYPE_GENERAL 此外,支持的索引基准有 MCSPARSE_INDEX_BASE_ZEROMCSPARSE_INDEX_BASE_ONE

bsrValA

存储矩阵 Annzb 个非零块的 <type>数组。

bsrRowPtrA

包含每个块行的起始位置和最后一个块行结 结束位置后移一位的整数数组,数组长度为 mb

bsrColIndA

存储了矩阵 A 中非零块 nnzb 个 列索引信息的整数数组。

blockDim

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

info

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

x

大小为 m 的<type>右侧向量。

policy

支持的策略有 MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL

pBuffer

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

输出

y

解向量的类型<type>,大小为 m

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

8.6. mcsparseXbsrsv2_zeroPivot()

mcsparseStatus_t
mcsparseXbsrsv2_zeroPivot(mcsparseHandle_t handle,
                           bsrsv2Info_t     info,
                           int*             position)

如果返回的错误代码是 MCSPARSE_STATUS_ZERO_PIVOTposition=j 表示 A(j,j) 是结构零或数值零(奇异块)。否则为 position=-1

position 可以从0开始,也可以从1开始,与矩阵相同。

函数 mcsparseXbsrsv2_zeroPivot() 是一个阻塞调用。 它调用 mcDeviceSynchronize() 来确保所有先前的核都已完成。

position 可以位于主机内存或设备内存中。 用户可以使用 mcsparseSetPointerMode() 设置正确的模式。

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

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

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    info

    如果用户已调用 bsrsv2_analysis()bsrsv2_solve(), 那么 info 包含结构零的或数值零。

    输出

    position

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

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

8.7. mcsparseCsrmvEx()

mcsparseStatus_t
mcsparseCsrmvEx_bufferSize(mcsparseHandle_t         handle,
                           mcsparseAlgMode_t        alg,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      n,
                           int                      nnz,
                           const void*              alpha,
                           macaDataType             alphatype,
                           const mcsparseMatDescr_t descrA,
                           const void*              csrValA,
                           macaDataType             csrValAtype,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           const void*              x,
                           macaDataType             xtype,
                           const void*              beta,
                           macaDataType             betatype,
                           void*                    y,
                           macaDataType             ytype,
                           macaDataType             executiontype,
                           size_t*                  bufferSizeInBytes)

mcsparseStatus_t
mcsparseCsrmvEx(mcsparseHandle_t         handle,
                  mcsparseAlgMode_t        alg,
                  mcsparseOperation_t      transA,
                  int                      m,
                  int                      n,
                  int                      nnz,
                  const void*              alpha,
                  macaDataType             alphatype,
                  const mcsparseMatDescr_t descrA,
                  const void*              csrValA,
                  macaDataType             csrValAtype,
                  const int*               csrRowPtrA,
                  const int*               csrColIndA,
                  const void*              x,
                  macaDataType             xtype,
                  const void*              beta,
                  macaDataType             betatype,
                  void*                    y,
                  macaDataType             ytype,
                  macaDataType             executiontype,
                  void*                    buffer)

此函数执行矩阵到向量的操作。

函数 mcsparseCsrmvEx_bufferSize 返回 mcsparseCsrmvEx 所需的工作区大小。

此函数具有以下限制:

  • 所有指针都应该与128字节对齐

  • 仅支持 MCSPARSE_OPERATION_NON_TRANSPOSE 操作

  • 仅支持 MCSPARSE_MATRIX_TYPE_GENERAL 矩阵类型

  • 仅支持 MCSPARSE_INDEX_BASE_ZERO 索引

  • 不支持半精度

  • 支持的最低GPU架构为SM_53

此函数具有以下特性:

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

  • 例程支持异步执行

    输入

    alg

    对于csrmv算法的实现,请参见 4.9 mcsparseAlgMode_t 可能的取值。

    alphatype

    数据类型为 alpha

    csrValAtype

    数据类型为 csrValA

    xtype

    数据类型为 x

    betatype

    数据类型为 beta

    ytype

    数据类型为 y

    executiontype

    用于计算的数据类型。

    bufferSizeInBytes

    指向 size_t 变量的指针,将被分配 mcsparseCsrmvEx 所需的工作区大小。

    buffer

    指向工作区缓冲区的指针。

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

8.8. mcsparse<t>csrsv2_bufferSize()

mcsparseStatus_t
mcsparseScsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           float*                   csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

mcsparseStatus_t
mcsparseDcsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           double*                  csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

mcsparseStatus_t
mcsparseCcsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           mcComplex*               csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

mcsparseStatus_t
mcsparseZcsrsv2_bufferSize(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           mcDoubleComplex*         csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           int*                     pBufferSizeInBytes)

此函数返回 csrsv2 (一种新的稀疏三角线性系统)中使用的缓冲区大小。

虽然参数 transA 的上(下)三角部分有六种组合,但 csrsv2_bufferSize() 返回这些组合中所需的最大缓冲区大小。 缓冲区大小取决于矩阵的维度和非零元素的数量。 如果用户更改了矩阵,就需要再次调用 csrsv2_bufferSize() 来获得正确的缓冲区大小;否则,可能会发生分段错误。

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

  • 例程支持异步执行

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    transA

    操作op(A)。

    m

    矩阵 A 的行数。

    nnz

    矩阵 A 的非零元素数。

    descrA

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

    csrValA

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

    csrRowPtrA

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

    csrColIndA

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

    输出

    info

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

    pBufferSizeInBytes

    csrsv2_analysiscsrsv2_solve 中使用的缓冲区的字节数。

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

8.9. mcsparse<t>csrsv2_analysis()

mcsparseStatus_t
mcsparseScsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           const float*             csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseDcsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           const double*            csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseCcsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           const mcComplex*         csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

mcsparseStatus_t
mcsparseZcsrsv2_analysis(mcsparseHandle_t         handle,
                           mcsparseOperation_t      transA,
                           int                      m,
                           int                      nnz,
                           const mcsparseMatDescr_t descrA,
                           const mcDoubleComplex*   csrValA,
                           const int*               csrRowPtrA,
                           const int*               csrColIndA,
                           csrsv2Info_t             info,
                           mcsparseSolvePolicy_t    policy,
                           void*                    pBuffer)

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

对于给定的矩阵和特定的操作类型,预计此函数将仅执行一次。

此函数需要由 csrsv2_bufferSize() 返回的缓冲区大小。 pBuffer 的地址必须是128字节的倍数。 如果不是,则返回 MCSPARSE_STATUS_INVALID_VALUE

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

函数 csrsv2_analysis() 始终报告第一个结构零,即使策略是 MCSPARSE_SOLVE_POLICY_NO_LEVEL。 如果指定了 MCSPARSE_DIAG_TYPE_UNIT,即使某些 j 缺少 A(j,j),也不会报告结构零。 用户需要调用 mcsparseXcsrsv2_zeroPivot() 才能知道结构零的位置。

如果 csrsv2_analysis() 报告了一个结构零,则用户可以选择是否调用 csrsv2_solve()。 在这种情况下,用户仍然可以调用 csrsv2_solve(),它将在与结构零相同的位置返回一个数值零。 然而,结果 x 是没有意义的。

  • 此功能需要内部分配的临时额外存储

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

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    transA

    操作op(A)。

    m

    矩阵 A 的行数。

    nnz

    矩阵 A 的非零元素数。

    descrA

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

    csrValA

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

    csrRowPtrA

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

    csrColIndA

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

    info

    mcsparseCreateCsrsv2Info() 初始化的结构。

    policy

    支持的策略包括 MCSPARSE_SOLVE_POLICY_NO_LEVELHCSPARSE_SOLVE_POLICY_ USE_LEVEL

    pBuffer

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

    输出

    info

    在分析阶段收集的信息填充的结构(应在分析阶段传递 给求解阶段而不变)。

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

8.10. mcsparse<t>csrsv2_solve()

mcsparseStatus_t
mcsparseScsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseOperation_t      transA,
                        int                      m,
                        int                      nnz,
                        const float*             alpha,
                        const mcsparseMatDescr_t descra,
                        const float*             csrValA,
                        const int*               csrRowPtrA,
                        const int*               csrColIndA,
                        csrsv2Info_t             info,
                        const float*             x,
                        float*                   y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseDcsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseOperation_t      transA,
                        int                      m,
                        int                      nnz,
                        const double*            alpha,
                        const mcsparseMatDescr_t descra,
                        const double*            csrValA,
                        const int*               csrRowPtrA,
                        const int*               csrColIndA,
                        csrsv2Info_t             info,
                        const double*            x,
                        double*                  y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseCcsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseOperation_t      transA,
                        int                      m,
                        int                      nnz,
                        const mcComplex*         alpha,
                        const mcsparseMatDescr_t descra,
                        const mcComplex*         csrValA,
                        const int*               csrRowPtrA,
                        const int*               csrColIndA,
                        csrsv2Info_t             info,
                        const mcComplex*         x,
                        mcComplex*               y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

mcsparseStatus_t
mcsparseZcsrsv2_solve(mcsparseHandle_t         handle,
                        mcsparseOperation_t      transA,
                        int                      m,
                        int                      nnz,
                        const mcDoubleComplex*   alpha,
                        const mcsparseMatDescr_t descra,
                        const mcDoubleComplex*   csrValA,
                        const int*               csrRowPtrA,
                        const int*               csrColIndA,
                        csrsv2Info_t             info,
                        const mcDoubleComplex*   x,
                        mcDoubleComplex*         y,
                        mcsparseSolvePolicy_t    policy,
                        void*                    pBuffer)

此函数执行 csrsv2 的求解阶段,这是一个新的稀疏三角线性系统。

对于给定矩阵和特定操作类型,可以多次执行此函数。

此函数需要由 csrsv2_bufferSize() 返回缓冲区大小。 pBuffer 的地址必须是128字节的倍数。如果不是,则返回 MCSPARSE_STATUS_INVALID_VALUE

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

级别信息可能不会提高性能,但会花费额外的时间进行分析。 例如,一个三对角矩阵没有并行性。 在这种情况下, MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_USE_LEVEL 性能更好。 如果用户有一个迭代求解器,最好的方法是用 MCSPARSE_SOLVE_POLICY_USE_LEVEL 执行一次 csrsv2_analysis()。 然后在第一次运行中使用 MCSPARSE_SOLVE_POLICY_NO_LEVEL 执行 csrsv2_solve() 函数,在第二次运行中使用 MCSPARSE_SOLVE_POLICY_USE_LEVEL,选择更快的一个函数来执行剩余的迭代。

函数 csrsv2_solve() 会报告第一个数值零,包括结构零。 如果 status 为0,则表示没有找到任何数值零。 此外,如果指定了 MCSPARSE_DIAG_TYPE_UNIT,则即使某些 j 对应的 A(j,j) 为零,也不会报告任何数值零。 用户需要调用 mcsparseXcsrsv2_zeroPivot() 才能知道数值零的位置。

例如,假设L是一个具有单位对角线的下三角矩阵,下面的代码通过级别信息求解 L*y=x

// 假设L是一个用CSR格式表示的m x m的稀疏矩阵。
// L是具有单位对角线的下三角矩阵。
// 假设:
// - 矩阵L的维度为m,
// - 矩阵L拥有nnz个零元素,
// - 句柄已经由mcsparseCreate()创建,
// - (d_csrRowPtr,d_csrColInd,d_csrVal)用设备内存上矩阵L的CSR格式表示,
// - d_x是设备内存上的右侧向量,
// - d_y是设备内存上的解向量。

mcsparseMatDescr_t descr = 0;
csrsv2Info_t info = 0;
int pBufferSize;
void *pBuffer = 0;
int structural_zero;
int numerical_zero;
const double alpha = 1.;
const mcsparseSolvePolicy_t policy = MCSPARSE_SOLVE_POLICY_USE_LEVEL;
const mcsparseOperation_t trans = MCSPARSE_OPERATION_NON_TRANSPOSE;

// 步骤1:创建包含以下内容的描述符
// - 矩阵L以1为基数
// - 矩阵L为下三角形
// - 矩阵L具有单位对角线,由参数MCSPARSE_DIAG_TYPE_UNIT指定
//   (L可能没有所有对角线元素。)
mcsparseCreateMatDescr(&descr);
mcsparseSetMatIndexBase(descr, MCSPARSE_INDEX_BASE_ONE);
mcsparseSetMatFillMode(descr, MCSPARSE_FILL_MODE_LOWER);
mcsparseSetMatDiagType(descr, MCSPARSE_DIAG_TYPE_UNIT);

// 步骤2:创建一个空的info结构
mcsparseCreateCsrsv2Info(&info);

// 步骤3:查询csrsv2中使用了多少内存,并分配缓冲区
mcsparseDcsrsv2_bufferSize(handle, trans, m, nnz, descr,
      d_csrVal, d_csrRowPtr, d_csrColInd, info, &pBufferSize);
// 由mcMalloc返回的pBuffer会自动对齐到128字节。
mcMalloc((void**)&pBuffer, pBufferSize);

// 步骤4:执行分析
mcsparseDcsrsv2_analysis(handle, trans, m, nnz, descr,
      d_csrVal, d_csrRowPtr, d_csrColInd,
      info, policy, pBuffer);
// L具有单位对角线,因此不会报告任何结构零的位置。
status = mcsparseXcsrsv2_zeroPivot(handle, info, &structural_zero);
if (MCSPARSE_STATUS_ZERO_PIVOT == status){
   printf("L(%d,%d) is missing\n", structural_zero, structural_zero);
}

// 步骤5:求解L*y = x
mcsparseDcsrsv2_solve(handle, trans, m, nnz, &alpha, descr,
   d_csrVal, d_csrRowPtr, d_csrColInd, info,
   d_x, d_y, policy, pBuffer);
// L具有单位对角线,因此不会报告任何数值零的位置。
status = mcsparseXcsrsv2_zeroPivot(handle, info, &numerical_zero);
if (MCSPARSE_STATUS_ZERO_PIVOT == status){
   printf("L(%d,%d) is zero\n", numerical_zero, numerical_zero);
}

// 步骤6:释放资源
mcFree(pBuffer);
mcsparseDestroyCsrsv2Info(info);
mcsparseDestroyMatDescr(descr);
mcsparseDestroy(handle);

备注

csrsv2_solve() 每行需要更多的非零元素才能达到良好的性能。如果平均每行超过 16 个非零元素,它的性能会更好。

如果 pBuffer != NULL,则此函数将支持以下属性

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

  • 例程支持异步执行

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    transA

    操作op(A)。

    m

    矩阵 A 的行数和列数。

    alpha

    用于乘法的<type>标量。

    descrA

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

    csrValA

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

    csrRowPtrA

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

    csrColIndA

    整数数组,包含矩阵 Annz 个非零元素的列索引。

    info

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

    x

    大小为 m 的<type>右侧向量。

    policy

    支持的策略包括 MCSPARSE_SOLVE_POLICY_NO_LEVELMCSPARSE_SOLVE_POLICY_ USE_LEVEL

    pBuffer

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

    输出

    y

    大小为 m 的<type>解向量

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

8.11. mcsparseXcsrsv2_zeroPivot()

mcsparseStatus_t
mcsparseXcsrsv2_zeroPivot(mcsparseHandle_t handle,
                           csrsv2Info_t     info,
                           int*             position)

如果返回的错误代码为 MCSPARSE_STATUS_ZERO_PIVOTposition=j 表示 A(j,j) 存在结构零或数值零。否则 position=-1

position 可以从0开始,也可以从1开始,与矩阵相同。

函数 mcsparseXcsrsv2_zeroPivot() 是一个阻塞调用。 它调用 mcDeviceSynchronize() 来确保所有先前的核都已完成。

position 可以位于主机内存或设备内存中。 用户可以使用 mcsparseSetPointerMode() 设置正确的模式。

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

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

    输入

    handle

    处理mcSPARSE库上下文的句柄。

    info

    如果用户已调用 csrsv2_analysis()csrsv2_solve() info 包含结构零或数值零

    输出

    position

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

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

8.12. mcsparse<t>gemvi()

mcsparseStatus_t
mcsparseSgemvi_bufferSize(mcsparseHandle_t    handle,
                           mcsparseOperation_t transA,
                           int                 m,
                           int                 n,
                           int                 nnz,
                           int*                pBufferSize)

mcsparseStatus_t
mcsparseDgemvi_bufferSize(mcsparseHandle_t    handle,
                           mcsparseOperation_t transA,
                           int                 m,
                           int                 n,
                           int                 nnz,
                           int*                pBufferSize)

mcsparseStatus_t
mcsparseCgemvi_bufferSize(mcsparseHandle_t    handle,
                           mcsparseOperation_t transA,
                           int                 m,
                           int                 n,
                           int                 nnz,
                           int*                pBufferSize)

mcsparseStatus_t
mcsparseZgemvi_bufferSize(mcsparseHandle_t    handle,
                           mcsparseOperation_t transA,
                           int                 m,
                           int                 n,
                           int                 nnz,
                           int*                pBufferSize)
mcsparseStatus_t
mcsparseSgemvi(mcsparseHandle_t     handle,
               mcsparseOperation_t  transA,
               int                  m,
               int                  n,
               const float*         alpha,
               const float*         A,
               int                  lda,
               int                  nnz,
               const float*         x,
               const int*           xInd,
               const float*         beta,
               float*               y,
               mcsparseIndexBase_t  idxBase,
               void*                pBuffer)

mcsparseStatus_t
mcsparseDgemvi(mcsparseHandle_t     handle,
               mcsparseOperation_t  transA,
               int                  m,
               int                  n,
               const double*        alpha,
               const double*        A,
               int                  lda,
               int                  nnz,
               const double*        x,
               const int*           xInd,
               const float*         beta,
               double*              y,
               mcsparseIndexBase_t  idxBase,
               void*                pBuffer)

mcsparseStatus_t
mcsparseCgemvi(mcsparseHandle_t     handle,
               mcsparseOperation_t  transA,
               int                  m,
               int                  n,
               const mcComplex*     alpha,
               const mcComplex*     A,
               int                  lda,
               int                  nnz,
               const mcComplex*     x,
               const int*           xInd,
               const float*         beta,
               mcComplex*           y,
               mcsparseIndexBase_t  idxBase,
               void*                pBuffer)

mcsparseStatus_t
mcsparseZgemvi(mcsparseHandle_t       handle,
               mcsparseOperation_t    transA,
               int                    m,
               int                    n,
               const mcDoubleComplex* alpha,
               const mcDoubleComplex* A,
               int                    lda,
               int                    nnz,
               const mcDoubleComplex* x,
               const int*             xInd,
               const float*           beta,
               mcDoubleComplex*       y,
               mcsparseIndexBase_t    idxBase,
               void*                  pBuffer)

此函数执行矩阵到向量的操作。

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

  • 例程支持异步执行

函数 mcsparse<t>gemvi_bufferSize() 返回 mcsparse<t>gemvi() 中使用的缓冲区大小。

输入

handle

处理mcSPARSE库上下文的句柄。

trans

操作op(A)

m

矩阵 A 的行数。

n

矩阵 A 的列数。

alpha

用于乘法的<type>标量。

A

指向稠密矩阵 A 的指针。

lda

A 的主维度的大小。

nnz

向量 x 的非零元素数。

x

大小为 n 的<type>稀疏向量, 具有 nnz 个非零元素。

xInd

x 中非零值的索引

beta

用于乘法的<type>标量。 如果 beta 为零, y 不需要是一个有效的输入。

y

包含 m 个元素的稠密向量。

idxBase

0或1,分别表示基于0或基于1的索引。

pBufferSize

mcsparse<t>gemvi() 函数中 使用的缓冲区所需的元素数量。

pBuffer

工作空间缓冲区

输出

y

更新后的<type>稠密向量

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