有谁能给我一个例子,说明如何在MKL中使用 mkl_sparse_?_mv
? 具体来说,如何定义稀疏矩阵A?
int main(int argc, char** argv) {
printf("Testing sparse blas\n");
sparse_operation_t operation = SPARSE_OPERATION_TRANSPOSE;
float alpha = 1.0;
float beta = 0.0;
sparse_matrix_type_t A_type = SPARSE_MATRIX_TYPE_GENERAL;
int m = (int) pow(2,3);
int n = (int) pow(2,5);
float * x = calloc(n,sizeof(float));
int i;
for (i=0;i<n;i++) {
x[i] = i*2+1;
}
float * y = calloc(m*n,sizeof(float));
// How to define A?
mkl_sparse_s_mv(operation, alpha, A, SPARSE_MATRIX_TYPE_GENERAL, x, beta, y);
return 0;
}
矩阵 A
应通过以下其中一种方式创建 mkl_sparse_?_create_?
例程。例如,如果你有一个CSR稀疏矩阵,你应该调用 mkl_sparse_?_create_csr
将其转换为内部表示法 (sparse_matrix_t
):
constexpr MKL_INT M = 5;
constexpr MKL_INT N = 5;
constexpr MKL_INT NNZ = 13;
float csrVal[NNZ] = { /* ... */ };
MKL_INT csrColInd[NNZ] = { /* ... */ };
MKL_INT csrRowPtr[M + 1] = { /* ... */ };
sparse_matrix_t csrA;
mkl_sparse_s_create_csr(&csrA, SPARSE_INDEX_BASE_ZERO, N, M,
csrRowPtr, csrRowPtr + 1, csrColInd, csrVal);
然后用它来 mkl_sparse_s_mv
:
float x[N] = { /* ... */ };
float y[N] = { /* ... */ };
float alpha = /* ... */, beta = /* ... */;
matrix_descr descrA;
descrA.type = SPARSE_MATRIX_TYPE_GENERAL;
mkl_sparse_optimize(csrA);
mkl_sparse_s_mv(SPARSE_OPERATION_NON_TRANSPOSE, alpha, csrA, descrA, x, beta, y);
mkl_sparse_destroy(csrA);
这段代码取自MKL发行版中提供的例子。你可以在 $MKLROOT/examples/examples_core_c.tgz/spblasc/source/sparse_csrmv.c
.