You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:55:15