EN
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

迁移步骤

C语言迁移步骤

  1. MKL LAPACK提供Fortran和LAPACK(C语言封装)两种接口,KML LAPACK提供的Fortran接口与MKL完全一致,C语言调用时将头文件#include "mkl.h"替换为#include "klapack.h" 。
  2. 在编译链接时,替换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一致,代码无需修改。