线性代数运算库(LAPACK)迁移
可替换性
KML_LAPACK对外提供的接口,与MKL-LAPACK的接口参数和函数名完全一致,可以直接替换库使用。
如表1 LAPACK的替换映射关系所示为可替换的接口与MKL中LAPACK的Fortran接口的映射关系(仅给出已优化的接口)。
|
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 |
将对称矩阵或Hermite矩阵通过相似变换成对称三对角T |
|
?hetrd |
?hetrd |
c、z |
将对称矩阵或Hermite矩阵通过相似变换成对称三对角T |
|
?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 |
计算 |
|
?unmlq |
?unmlq |
c、z |
计算 |
|
?orgql |
?orgql |
s、d |
生成具有正交列的实/复矩阵Q,且该矩阵定义为K个M阶基本反射器的乘积的前N列 |
|
?ungql |
?ungql |
c、z |
生成具有正交列的实/复矩阵Q,且该矩阵定义为K个M阶基本反射器的乘积的前N列 |
|
?ormql |
?ormql |
s、d |
计算 |
|
?unmql |
?unmql |
c、z |
计算 |
|
?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 |
计算 |
|
?unmrq |
?unmrq |
c、z |
计算 |
|
?ormqr |
?ormqr |
s、d |
计算 |
|
?unmqr |
?unmqr |
c、z |
计算 |
|
?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 |
求解线性方程组 |
|
?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 25.1.0.SPC001 开发指南》中“鲲鹏数学库开发指南 > 应用数学库 > KML_LAPACK库函数说明 > 函数定义”章节。
若需使用LAPACKE接口(MKL中标准的C接口),需在编译开源Netlib LAPACK时增加对LAPACKE封装库的编译,请参见C语言迁移步骤中说明。
C语言迁移步骤
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函数声明。
迁移后若需使用LAPACKE接口,需在编译Netlib LAPACK时同时编译LAPACKE,在安装KML_LAPACK的编译原始的Netlib LAPACK库步骤中的cmake命令后添加-DLAPACKE=ON。
1
|
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DLAPACKE=ON |
LAPACK编译后会生成liblapacke.a,编译应用时需要增加LAPACKE的头文件路径和LAPACKE库的路径。
1
|
gcc app.c -o app -fopenmp -I /data/lapack-3.9.1/LAPACKE/include -I $KML_LAPACK_ROOT/include -L $KML_LAPACK_ROOT/lib64 -l:liblapacke.a -l:libklapack.a -L $ADAPT_ROOT -l:liblapack_adapt.a -L $KML_BLAS_ROOT -lkblas -l:libkservice.a -lgfortran -lm |
Fortran接口迁移步骤
Fortran接口与MKL一致,代码无需修改。






























