---
title: 稀疏基础线性代数库（Sparse BLAS）迁移
description: "KML_SPBLAS对外提供的接口，与MKL-SPBLAS的接口参数和函数名不一致，需要修改部分源码。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0012.html
sourcePath: /source/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0012.html
indexId: ffec46564f0e2a9ee1a8e113a239e554f4274f31a707ee69a38bf26823f076c458
---
# 稀疏基础线性代数库（Sparse BLAS）迁移

#### 可替换性

KML_SPBLAS对外提供的接口，与MKL-SPBLAS的接口参数和函数名不一致，需要修改部分源码。

如表1、表2所示为可替换的接口与MKL接口的映射关系。


**表1 Level1接口的替换映射关系**

| MKL接口 | KML对应接口 | 数据类型 | 描述 |
| --- | --- | --- | --- |
| cblas\_?axpyi | kml\_sparse\_?axpyi | s，d，c，z | 稀疏向量分别缩放与加和 |
| cblas\_?doti | kml\_sparse\_?doti | s，d | 稀疏向量点积。 |
| cblas\_?dotci | kml\_sparse\_?dotci\_sub | c，z | 共轭稀疏向量与另一稀疏向量的点积。 |
| cblas\_?dotui | kml\_sparse\_?dotui\_sub | c，z | 复数稀疏向量点积。 |
| cblas\_?gthr | kml\_sparse\_?gthr | s，d，c，z | 将full\-storage格式的稀疏向量中指定的元素加载到compressed格式的向量中 |
| cblas\_?gthrz | kml\_sparse\_?gthrz | s，d，c，z | 将full\-storage格式的稀疏向量y中指定的元素加载到compressed格式的向量中。 |
| cblas\_?roti | kml\_sparse\_?roti | s，d | 基于平面上点旋转。 |
| cblas\_?sctr | kml\_sparse\_?sctr | s，d，c，z | 将compressed格式的向量写入full\-storage格式的稀疏向量 |


**表2 Level2、3接口的替换映射关系**

| MKL接口 | KML对应接口 | 数据类型 | 描述 |
| --- | --- | --- | --- |
| mkl\_?csrgemv | kml\_sparse\_?csrgemv | s，d，c，z | 矩阵与向量计算，稀疏矩阵采用CSR格式存储。 |
| mkl\_?csrsymv | kml\_sparse\_?csrsymv | s，d，c，z | 矩阵与向量计算，稀疏矩阵采用CSR格式存储。 |
| mkl\_cspblas\_?csrgemv | kml\_csparse\_?csrgemv | s，d，c，z | 矩阵与向量计算，稀疏矩阵采用CSR格式存储。 |
| mkl\_cspblas\_?csrsymv | kml\_csparse\_?csrsymv | s，d，c，z | 矩阵与向量计算，稀疏矩阵采用CSR格式存储。 |
| mkl\_?csrmv | kml\_sparse\_?csrmv | s，d，c，z | 矩阵与向量乘积，矩阵是CSR格式的稀疏矩阵。 |
| mkl\_?csrsv | kml\_sparse\_?csrsv | s，d，c，z | 求解三角矩阵方程组计算，稀疏矩阵采用CSR格式存储。 |
| mkl\_?csrmm | kml\_sparse\_?csrmm | s，d，c，z | 矩阵与矩阵计算，其中一个稀疏矩阵采用CSR格式存储。 |
| mkl\_?csradd | kml\_sparse\_?csradd | s，d，c，z | 计算2个CSR格式的稀疏矩阵之和。 |
| mkl\_?csrmultcsr | kml\_sparse\_?csrmultcsr | s，d，c，z | 矩阵与矩阵计算，其中3个稀疏矩阵采用3\-array CSR格式存储。 |
| mkl\_?csrmultd | kml\_sparse\_?csrmultd | s，d，c，z | 矩阵与矩阵计算，其中2个稀疏矩阵采用CSR格式存储。 |


#### C语言迁移步骤

需要迁移的部分主要有三大类：

- 函数名
  可替换的接口与MKL接口的映射关系请参见可替换性。

- 函数入参
  部分接口的参数再MKL中使用指针进行传递，KML接口直接传入数值，具体请参见《Kunpeng HPCKit 26.1.RC1 开发指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0011.html)中“鲲鹏数学库 开发指南”章节。

- 声明变量
  MKL部分变量带有MKL前缀，需要改为KML。


例：csrmv接口

迁移前：

```
#include "mkl_spblas.h"

char transa = 'N';
MKL_INT m = 4;
MKL_INT k = 4;
float alpha = 0.5;
float beta = 1.2;
char *matdescra = "G00F"; // 一般矩阵，基 1 索引
float val[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9};
MKL_INT indx[9] = {1, 2, 4, 3, 4, 1, 3, 4, 1};
MKL_INT pntrb[4] = {1, 4, 6, 9};
MKL_INT pntre[4] = {4, 6, 9, 10};
float x[4] = {1, 3, -2, 5};
float y[4] = {-1, 1, 5, 3};
mkl_scsrmv(&transa, &m, &k, &alpha, matdescra, val, indx, pntrb, pntre, x, &beta, y);
return 0;
/*
*  Output Y:
*
*     12.80  -14.80  26.50   8.10
*
* */
```

迁移后：

```
#include "kspblas.h"

kml_sparse_operation_t opt = KML_SPARSE_OPERATION_NON_TRANSPOSE;
KML_INT m = 4;
KML_INT k = 4;
float alpha = 0.5;
float beta = 1.2;
char *matdescra = "G00F"; // 一般矩阵，基 1 索引
float val[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9};
KML_INT indx[9] = {1, 2, 4, 3, 4, 1, 3, 4, 1};
KML_INT pntrb[4] = {1, 4, 6, 9};
KML_INT pntre[4] = {4, 6, 9, 10};
float x[4] = {1, 3, -2, 5};
float y[4] = {-1, 1, 5, 3};
kml_sparse_status_t status = kml_sparse_scsrmv(opt, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y);
return status;
/*
*  Output Y:
*
*     12.80  -14.80  26.50   8.10
*
* */
```


#### Fortran接口迁移步骤

Fortran接口迁移与C语言迁移步骤一致。
