迁移步骤
C语言迁移步骤
- MKL LAPACK提供Fortran和LAPACK(C语言封装)两种接口,KML LAPACK提供的Fortran接口与MKL完全一致,C语言调用时将头文件#include "mkl.h"替换为#include "klapack.h" 。
- 在编译链接时,替换MKL相关的链接选项,具体选项请参见《鲲鹏数学库 开发指南》中“生成完整的LAPACK”章节的安装后验证部分的说明。
例如:
迁移前使用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。
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DLAPACKE=ON
LAPACK编译后会生成liblapacke.a,编译应用时需要增加LAPACKE的头文件路径和LAPACKE库的路径。
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一致,代码无需修改。
父主题: 线性代数运算库(LAPACK)迁移