首页 > 解决方案 > 如何在 MKL 中使用 mkl_sparse_?_mv?

问题描述

谁能给我一个使用 将稀疏矩阵乘以向量的示例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;
}

标签: intel-mkl

解决方案


矩阵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.


推荐阅读