intel-mkl - 如何在 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;
}
解决方案
矩阵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
.
推荐阅读
- php - 无法使用 ajax 在 laravel 中验证加密的 word 文档(docx)
- angular - 我想从列表 angular 6 中搜索数据
- asp.net-core - 30 分钟后,asp.net 核心身份中缺少其他声明
- laravel - 如果使用 VUE JS 在 s3 中不存在图像,如何设置默认图像
- vue.js - 在vue中加载dom时如何获取dom的高度?
- python - 关于opencv-python 3.4.3
- r - Biostrings::getPromoterSeq 返回查询基因 ID 的多个序列
- reactjs - React TS - 向上传递组件树
- c# - 将 C# Translate Text API 代码从异步转换为 SQL Server CLR 函数的同步
- tuples - 如何在水晶语言的宏中使用构造函数创建一个元组