MKL中如何使用mkl_sparse_?_mv?

问题描述 投票:0回答:1

有谁能给我一个例子,说明如何在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;
}
intel-mkl
1个回答
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.

© www.soinside.com 2019 - 2024. All rights reserved.