---
title: 线性代数运算库（LAPACK）迁移
description: "KML_LAPACK对外提供的接口，与MKL_LAPACK的接口参数和函数名完全一致，可以直接替换库使用。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0020.html
sourcePath: /source/zh/kunpenghpcs/hpckit/mg/kunpengaccel_12_0020.html
indexId: 2aa9f6d2586e0e5356227a0feaa7996964cffbcaeb65bd0287216f0ba8976c2e58
---
# 线性代数运算库（LAPACK）迁移

#### 可替换性

KML_LAPACK对外提供的接口，与MKL_LAPACK的接口参数和函数名完全一致，可以直接替换库使用。

如表1 LAPACK的替换映射关系所示为可替换的接口与MKL中LAPACK的Fortran接口的映射关系（仅给出已优化的接口）。


**表1 LAPACK的替换映射关系**

| MKL接口 | KML对应接口 | 数据类型 | 描述 |
| --- | --- | --- | --- |
| ?getrf | ?getrf | s、d、c、z | 计算矩阵A的LU分解 |
| ?geqrf | ?geqrf | s、d、c、z | 计算矩阵的QR分解 |
| ?gerqf | ?gerqf | s、d、c、z | 计算矩阵的RQ分解 |
| ?geqlf | ?geqlf | s、d、c、z | 计算矩阵的QL分解 |
| ?gelqf | ?gelqf | s、d、c、z | 计算矩阵的LQ分解 |
| ?ppsv | ?ppsv | s、d、c、z | 计算矩阵A的Cholesky分解，并通过分解结果求解线性方程组 |
| ?ptsv | ?ptsv | s、d、c、z | 求解线性方程组，其中系数矩阵A为（共轭）对称正定三对角矩阵。 |
| ?getri | ?getri | s、d、c、z | 根据?getrf得到的LU分解结果计算逆矩阵 |
| ?syevd | ?syevd | s、d | 计算对称（Hermite）矩阵的全部特征值和特征向量 |
| ?heevd | ?heevd | c、z | 计算对称（Hermite）矩阵的全部特征值和特征向量 |
| ?sytrd | ?sytrd | s、d | 将对称矩阵矩阵通过相似变换成对称三对角矩阵 |
| ?hetrd | ?hetrd | c、z | 将Hermite矩阵通过相似变换成对称三对角矩阵 |
| ?potrf | ?potrf | s、d、c、z | 计算对称正定矩阵或者Hermite正定矩阵的Cholesky分解 |
| ?pttrf | ?pttrf | s、d、c、z | 计算实（共轭）对称正定三对角矩阵A的LDL\*或U\*DU分解 |
| ?potri | ?potri | s、d、c、z | 计算对称正定矩阵的逆。 |
| ?gesv | ?gesv | s、d、c、z | 求解线性方程组，其中是的矩阵，和为的矩阵。 |
| ?orglq | ?orglq | s、d | 生成具有正交行的实/复矩阵Q，且该矩阵定义为K个N阶基本反射器的乘积的前M行 |
| ?unglq | ?unglq | c、z | 生成具有正交行的实/复矩阵Q，且该矩阵定义为K个N阶基本反射器的乘积的前M行 |
| ?ormlq | ?ormlq | s、d | 计算或，其中Q是由?gelqf计算得到。 |
| ?unmlq | ?unmlq | c、z | 计算或，其中Q是由?gelqf计算得到。 |
| ?orgql | ?orgql | s、d | 生成具有正交列的实/复矩阵Q，且该矩阵定义为K个M阶基本反射器的乘积的前N列 |
| ?ungql | ?ungql | c、z | 生成具有正交列的实/复矩阵Q，且该矩阵定义为K个M阶基本反射器的乘积的前N列 |
| ?ormql | ?ormql | s、d | 计算或，其中Q是由?geqlf计算得到。 |
| ?unmql | ?unmql | c、z | 计算或，其中Q是由?geqlf计算得到。 |
| ?orgqr | ?orgqr | s、d | 生成具有正交行的实/复矩阵Q，且该矩阵定义为K个N阶基本反射器的乘积的前M行 |
| ?ungqr | ?ungqr | c、z | 生成具有正交行的实/复矩阵Q，且该矩阵定义为K个N阶基本反射器的乘积的前M行 |
| ?orgrq | ?orgrq | s、d | 生成具有正交行的实/复矩阵Q，且该矩阵定义为K个N阶基本反射器的乘积的前M行 |
| ?ungrq | ?ungrq | c、z | 生成具有正交行的实/复矩阵Q，且该矩阵定义为K个N阶基本反射器的乘积的前M行 |
| ?ormrq | ?ormrq | s、d | 计算或，其中Q是由?gerqf计算得到。 |
| ?unmrq | ?unmrq | c、z | 计算或，其中Q是由?gerqf计算得到。 |
| ?ormqr | ?ormqr | s、d | 计算或，其中Q是由?geqrf计算得到。 |
| ?unmqr | ?unmqr | c、z | 计算或，其中Q是由?geqrf计算得到。 |
| ?syev | ?syev | s、d | 计算对称（Hermite）矩阵的所有特征值与特征向量。 |
| ?heev | ?heev | c、z | 计算对称（Hermite）矩阵的所有特征值与特征向量。 |
| ?pttrs | ?pttrs | s、d、c、z | 求解三对角方程AX=B，其中系数矩阵A由?pttrf分解而来。 |
| ?ptts2 | ?ptts2 | s、d、c、z | 求解三对角方程AX=B，其中系数矩阵A由?pttrf分解而来。 |
| ?lasr | ?lasr | s、d、c、z | 对矩阵A做平面旋转操作。 |
| ?gtsv | ?gtsv | s、d、c、z | 求解线性方程组A\*X=B，其中系数矩阵A为一般三对角矩阵。 |
| ?gttrf | ?gttrf | s、d、c、z | 计算一般三对角矩阵A的LU分解。 |
| ?gttrs | ?gttrs | s、d、c、z | 求解三对角方程A\*X=B或A\*\*T \*X=B或A\*\*H \*X=B，其中系数矩阵A由?gttrf分解而来。 |
| ?sytrd\_2stage | ?sytrd\_2stage | s、d、c、z | 将对称矩阵或Hermite矩阵A转为对称或Hermite三对角矩阵T， |
| ?trtrs | ?trtrs | s、d、c、z | 求解三角方程A \* X = B，或A\*\*T \* X = B。 |
| ?laset | ?laset | s、d、c、z | 初始化m\*n的矩阵，且将对角线元素设置为beta，非对角线元素设置为alpha。 |
| ?sptrf | ?sptrf | s、d、c、z | 计算压缩对称矩阵的LDL\*或U\*DU分解。 |
| ?hptrf | ?hptrf | s、d、c、z | 计算压缩Hermite矩阵的LDL\*或U\*DU分解。 |
| ?pptrf | ?pptrf | s、d、c、z | 计算压缩存储的对称正定矩阵的LLT或UTU分解。 |
| ?pptrs | ?pptrs | s、d、c、z | 求解三对角方程A\*X=B或A\*\*T \*X=B或A\*\*H \*X=B。其中系数矩阵A由?gttrf分解而来。 |
| ?pptri | ?pptri | s、d、c、z | 计算压缩存储的对称正定矩阵的逆矩阵。 |
| ?getrs | ?getrs | s、d、c、z | 求解一般线性方程A\*X=B或A\*\*T \* X=B或A\*\*H \* X=B。其中系数矩阵A由?getrf分解而来。 |
| ?posv | ?posv | s、d、c、z | 求解线性方程组。其中A为实对称或共轭对称的正定矩阵；X和B为矩阵。 |
| ?trtri | ?trtri | s、d、c、z | 计算上/下三角矩阵的逆矩阵。 |
| ?laswp | ?laswp | s、d、c、z | 对矩阵做一系列的行交换操作。 |
| ?lascl | ?lascl | s、d、c、z | 对矩阵做scalar操作。 |
| ?lange | ?lange | s、d、c、z | 计算矩阵的范数，包含：1范数，F范数，无穷范数等。 |
| ?sgesv | ?gesv | ds、zc | 求解线性方程组，其中是的矩阵，和为的矩阵。 |
| ?gels | ?gels | s、d、c、z | 使用矩阵的QR或LQ分解来求解超定或欠定线性方程组。 |
| ?gelsd | ?gelsd | s、d、c、z | 使用分治法对线性最小二乘问题求解其最小范数解。 |
| ?gelss | ?gelss | s、d、c、z | 使用SVD方法对线性最小二乘问题求解其最小范数解。 |
| ?steqr | ?steqr | s、d、c、z | 使用QL或QR方法求解对称三对角矩阵的特征值和特征向量。 |
| ?gtts2 | ?gtts2 | s、d、c、z | 求解三对角方程A\*X=B或A\*\*T \*X=B或A\*\*H \*X=B，其中系数矩阵A由?gttrf分解而来。 |
| ?ormbr | ?ormbr | s、d | 计算C=Q\*C或Q\*\*T\*C或C\*Q或C\*Q\*\*T或C=P\*C或P\*\*T\*C或C\*P或C\*P\*\*T， |
| ?unmbr | ?unmbr | c、z | 计算C=Q\*C或Q\*\*T\*C或C\*Q或C\*Q\*\*T或C=P\*C或P\*\*T\*C或C\*P或C\*P\*\*T， |
| ?orgtr | ?orgtr | s、d | 通过反射因子生成正交矩阵Q，其中反射因子由SYTRD计算得来。 |
| ?ungtr | ?ungtr | c、z | 通过反射因子生成正交矩阵Q，其中反射因子由SYTRD计算得来。 |
| ?lacpy | ?lacpy | s、d、c、z | 拷贝矩阵A的所有元素或部分元素到矩阵B。 |
| ?stedc | ?stedc | s、d、c、z | 对称三对角矩阵的特征值求解，使用Divide\-and\-Conquer算法。 |
| ?gesvd | ?gesvd | s、d、c、z | 一般矩阵SVD分解。 |
| ?gebrd | ?gebrd | s、d、c、z | 一般矩阵变换到双对角矩阵。 |
| ?bdsdc | ?bdsdc | s、d | 计算N\*N的上/下双对角矩阵B的奇异值分解，使用分治算法。 |
| ?gesdd | ?gesdd | s、d、c、z | 计算矩形矩阵的奇异值分解，可以用来计算左和右奇异向量，使用分治算法。 |
| ?bdsqr | ?bdsqr | s、d、c、z | 使用对双对角矩阵的QR算法的SVD分解来求解奇异值或左右奇异向量。 |


以上接口均为Fortran接口，在C语言中使用时需在接口名称后增加下划线，且参数类型均为指针类型，请参见《Kunpeng HPCKit 26.1.RC1 开发指南》(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0721.html)中“鲲鹏数学库 开发指南 > 应用数学库 > KML_LAPACK库函数说明 > 函数定义”章节。

若需使用LAPACKE接口（MKL中标准的C接口），需在编译开源Netlib LAPACK时增加对LAPACKE封装库的编译，请参见C语言迁移步骤中说明。


#### C语言迁移步骤

1. MKL LAPACK提供Fortran和LAPACK（C语言封装）两种接口，KML LAPACK提供的Fortran接口与MKL完全一致，C语言调用时将头文件#include "mkl.h"替换为#include "klapack.h" 。

例如：

迁移前使用Fortran接口：

```
/* Declare the dgetrf interface */
void dgetrf_(int *m, int *n, double *a, int *lda, int *ipiv, int *info);
......
int m = 4;
int n = 4;
int lda = 4;
int ipiv[4];
int info = 0;
double a[] = {1.80,  5.25,  1.58, -1.11,
2.88, -2.95, -2.69, -0.66,
2.05, -0.95, -2.90, -0.59,
-0.89, -3.80, -1.04,  0.80};
dgetrf_(&m, &n, a, &lda, ipiv, &info);
```

迁移前使用LAPACKE接口：

```
#include "mkl.h"
......
int m = 4;
int n = 4;
int lda = 4;
int ipiv[4];
double a[] = {1.80,  5.25,  1.58, -1.11,
2.88, -2.95, -2.69, -0.66,
2.05, -0.95, -2.90, -0.59,
-0.89, -3.80, -1.04,  0.80};
int info = LAPACKE_dgetrf(LAPACK_COL_MAJOR, m, n, a, lda, ipiv);
```

迁移后使用KML LAPACK的Fortran接口：

```
#include "klapack.h"
......
int m = 4;
int n = 4;
int lda = 4;
int ipiv[4];
int info = 0;
double a[] = {1.80,  5.25,  1.58, -1.11,
2.88, -2.95, -2.69, -0.66,
2.05, -0.95, -2.90, -0.59,
-0.89, -3.80, -1.04,  0.80};
dgetrf_(&m, &n, a, &lda, ipiv, &info);
```

与使用MKL的Fortran接口一致，包含klapack.h可得到Fortran接口的C函数声明。


#### Fortran接口迁移步骤

Fortran接口与MKL一致，代码无需修改。
