MKL中mkl_?dnscsr已弃用,替代的CSR转密集格式接口是什么?
替代已弃用的
mkl_?dnscsr实现CSR转密集矩阵的方案 Intel oneAPI MKL的Inspector-executor Sparse BLAS接口确实没有提供直接的CSR转密集格式的专用例程,你可以通过稀疏矩阵-密集矩阵乘法的方式间接实现,核心思路是将CSR矩阵与对应维度的单位矩阵相乘,输出结果就是转换后的密集矩阵。
具体实现步骤
- 构造一个维度匹配的单位矩阵作为乘法的右侧密集矩阵:若CSR矩阵是
m×n的维度,单位矩阵需为n×n,存储为列主序或行主序的密集数组(注意MKL的密集矩阵默认列主序)。 - 使用Inspector-executor接口的稀疏矩阵乘法例程完成计算,不同精度对应不同函数:
- 双精度:
mkl_sparse_d_mv - 单精度:
mkl_sparse_s_mv - 复数双精度:
mkl_sparse_z_mv - 复数单精度:
mkl_sparse_c_mv
- 双精度:
代码示例(双精度)
#include "mkl_spblas.h" int main() { // 假设已有的CSR矩阵数据:m行n列,nz个非零元 MKL_INT m = 3, n = 3, nz = 4; double *csr_val = (double*)malloc(nz * sizeof(double)); MKL_INT *csr_colind = (MKL_INT*)malloc(nz * sizeof(MKL_INT)); MKL_INT *csr_rowptr = (MKL_INT*)malloc((m+1) * sizeof(MKL_INT)); // 填充CSR数据(示例矩阵) csr_val[0] = 1.0; csr_val[1] = 2.0; csr_val[2] = 3.0; csr_val[3] = 4.0; csr_colind[0] = 0; csr_colind[1] = 2; csr_colind[2] = 1; csr_colind[3] = 2; csr_rowptr[0] = 0; csr_rowptr[1] = 2; csr_rowptr[2] = 3; csr_rowptr[3] = 4; // 创建CSR稀疏矩阵句柄 sparse_matrix_t csr_mat; mkl_sparse_d_create_csr(&csr_mat, SPARSE_INDEX_BASE_ZERO, m, n, csr_rowptr, csr_rowptr+1, csr_colind, csr_val); // 构造单位矩阵(列主序,n×n) double *identity = (double*)calloc(n*n, sizeof(double)); for(MKL_INT i=0; i<n; i++) { identity[i*n + i] = 1.0; } // 目标密集矩阵(m×n,列主序) double *dense_mat = (double*)malloc(m*n * sizeof(double)); // 设置乘法提示并优化 mkl_sparse_set_mv_hint(csr_mat, SPARSE_OPERATION_NON_TRANSPOSE, SPARSE_STORAGE_COLUMN_MAJOR, NULL); mkl_sparse_optimize(csr_mat); // 执行乘法:csr_mat * identity = dense_mat mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1.0, csr_mat, SPARSE_STORAGE_COLUMN_MAJOR, identity, 0.0, dense_mat); // 后续处理:使用dense_mat,释放资源等 mkl_sparse_destroy(csr_mat); free(csr_val); free(csr_colind); free(csr_rowptr); free(identity); free(dense_mat); return 0; }
额外说明
- 如果你的场景中不需要反复执行转换,也可以手动遍历CSR的行指针和列索引,直接填充密集矩阵,这种方式在小矩阵场景下可能更高效。
- 确保使用的MKL版本支持Inspector-executor接口(oneAPI MKL 2021及以上版本均支持)。
内容的提问来源于stack exchange,提问作者Astor
相关产品推荐
相关产品推荐

