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))。
例如,假设 A 是 mb*kb, B 是 k*n, C 是 m*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_ROW或MCSPARSE_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_ZERO和MCSPARSE_INDEX_BASE_ONE。bsrValA包含矩阵
A的nnzb个 非零块的<type>数组。bsrRowPtrA由整数组成的长度为
mb+ 1 的数组, 其中包含每个块行的起始位置 和最后一个块行结束位置加一。bsrColIndA包含矩阵
A的nnzb个 非零块的列索引的整数数组。blockDim稀疏矩阵
A的块维度,大于零。B如果
op(B)=B,则为(ldb,n)维度的数组;否则为(ldb,k)维度的数组。ldbB的主维度。beta用于乘法的<type>标量。 如果
beta为零, 则C不必是有效输入。C维度为
(ldc, n)的数组。ldcC的主维度。输出
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库上下文的句柄。
algoalgo = 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_UNIT和MCSPARSE_DIAG_TYPE_NON_UNIT。csrValA类型为<type>的数组, 其中包含矩阵
A中nnz个非零元素。csrRowPtrA由整数组成的长度为
m+ 1 的数组, 其中包含每一行的起始位置 和最后一行结束位置加一。csrColIndA整数数组,长度为
nnz, 包含矩阵A非零元素的列索引。B<type>的右侧矩阵。
op(B)的大小为m-by-nrhs。ldbB和X的 前导维度。info在分析阶段收集的信息的结构 (应该不经更改地传递到求解阶段)。
policy支持的策略包括
MCSPARSE_SOLVE_POLICY_NO_LEVEL和MCSPARSE_SOLVE_POLICY_USE_LEVEL。输出
info基于不同算法的内部状态记录。
pBufferSize在
csrsm2_analysis和csrsm2_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,并且对于某些 j, A(j,j) 缺失,则不会报告结构零。
用户需要调用 mcsparseXcsrsm2_zeroPivot() 来获取结构零的位置。
如果 csrsm2_analysis() 报告一个结构零,用户可自行决定是否调用csrsm2_solve()。
在这种情况下,用户仍然可以调用 csrsm2_solve(),此函数将在与结构零相同的位置返回一个数值零。
结果 X 是没有意义的。
此函数需要内部分配的临时额外存储空间。
如果流式有序内存分配器可用,则该例程支持异步执行
输入
handle处理mcSPARSE库上下文的句柄。
algoalgo = 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_UNIT和MCSPARSE_DIAG_TYPE_NON_UNIT。csrValA类型为<type>的数组, 其中包含矩阵
A中nnz个非零元素。csrRowPtrA由整数组成的长度为
m+ 1 的数组, 其中包含每一行的起始位置 和最后一行结束位置加一。csrColIndA整数数组,长度为
nnz, 包含矩阵A非零元素的列索引。B<type>的右侧矩阵。
op(B)的大小为m-by-nrhsldbB和X的 前导维度。info在分析阶段收集的信息的结构 (应该不经更改地传递到求解阶段)。
policy支持的策略包括
MCSPARSE_SOLVE_POLICY_NO_LEVEL和MCSPARSE_SOLVE_POLICY_USE_LEVELpBuffer用户分配的缓冲区, 大小由
csrsm2_bufferSize()返回。输出
infoinfo是一个在分析阶段收集信息的结构体,(在求解阶段不 改变并传递给函数使用)。
有关返回状态的描述,请参见 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_TRANSPOSE 和 MCSPARSE_OPERATION_TRANSPOSE。
该操作是原地操作,即矩阵 B 被矩阵 X 覆盖。
如果 transB 为 MCSPARSE_OPERATION_NON_TRANSPOSE,则 ldb 必须不小于 m。
否则,如果 transB 为 MCSPARSE_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,即使某些 j 的 A(j,j) 为零,也不报告数值零的位置。
用户需要调用 mcsparseXcsrsm2_zeroPivot() 来获取数值零的位置。
csrsm2 提供了两种由参数 algo 指定的算法。
algo=0 是非块版本, algo=1 是块版本。非块版本受内存带宽限制。
块版本将矩阵划分为小的块,并应用稠密运算。
尽管块版本的计算量比非块版本大,但如果非块版本已经达到最大带宽,块版本可能会更快。
如果 pBuffer != NULL ,此函数具有以下特性。
该例程不需要额外的存储空间。
该例程支持异步执行。
输入
handle处理mcSPARSE库上下文的句柄。
algoalgo = 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_UNIT和MCSPARSE_DIAG_TYPE_NON_UNIT。csrValA类型为<type>的数组, 其中包含矩阵
A中nnz个非零元素。csrRowPtrA由整数组成的长度为
m+ 1 的数组, 其中包含每一行的起始位置 和最后一行结束位置加一。csrColIndA整数数组,长度为
nnz, 包含矩阵A非零元素的列索引。B<type>的右侧矩阵。
op(B)的大小为m-by-nrhsldbB和X的 主维度。info在分析阶段收集的信息的结构 (应该不经更改地传递到求解阶段)。
policy支持的策略包括
MCSPARSE_SOLVE_POLICY_NO_LEVEL和MCSPARSE_SOLVE_POLICY_USE_LEVELpBuffer用户分配的缓冲区, 大小由
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
其中, A 和 C 是稠密矩阵, B 是一个基于CSC存储格式的稀疏矩阵,由三个数组 cscValB 、 cscColPtrB 和 cscRowIndB 定义。 alpha 和 beta 是标量值;注意: B 的索引是基于0的。
该例程不需要额外的存储空间。
该例程支持异步执行。
输入
handle处理mcSPARSE库上下文的句柄。
m矩阵A的行数。
n矩阵
B和C的列数。k矩阵
A的列数。nnz矩阵
B的非零元素个数。alpha用于乘法的<type>标量
A维度为
(lda, k)的数组。lda矩阵
A的主维度,至少为mcscValB维度为
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。