生成完整的LAPACK(可选)

操作步骤

KML_LAPACK依赖于开源的Netlib LAPACK以提供完整的LAPACK接口功能。因此安装KML_LAPACK后需自行获取开源的Netlib LAPACK v3.9.1的源代码包,具体安装步骤如下所述:

  1. 下载Netlib LAPACK v3.9.1的源代码包。保存在编译机器可访问的路径中,假设位于“/data/lapack-3.9.1.tar.gz”

    可从此处下载:https://github.com/Reference-LAPACK/lapack/archive/v3.9.1.tar.gz

  2. 假设libklapack.a位于“/usr/local/kml/lib/libklapack.a”,使用以下脚本编译原始的Netlib LAPACK库,并在当前目录的lapack_adapt子目录下生成适配的liblapack_adapt.a。

    netlib=/data/lapack-3.9.1.tar.gz
    klapack=/usr/local/kml/lib/libklapack.a
    mkdir lapack_adapt
    cd lapack_adapt
    
    # build netlib lapack
    mkdir netlib
    cd netlib
    tar zxvf $netlib
    mkdir build
    cd build
    cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON ../lapack-3.9.1
    make -j
    cd ../..
    
    cp netlib/build/lib/liblapack.a liblapack_adapt.a
    
    # get symbols defined both in klapack and netlib lapack
    nm -g liblapack_adapt.a | grep 'T ' | grep -oP '\K\w+(?=_$)' | sort | uniq > netlib.sym
    nm -g $klapack | grep 'T ' | grep -oP '\K\w+(?=_$)' | sort | uniq > klapack.sym
    comm -12 klapack.sym netlib.sym > comm.sym 
    
    # update symbols name of liblapack_adapt.a
    while read sym; do \
        if ! nm liblapack_adapt.a | grep -qe " T ${sym}_\$"; then \
            continue; \
        fi; \
        ar x liblapack_adapt.a $sym.f.o; \
        mv $sym.f.o ${sym}_netlib.f.o; \
        objcopy --redefine-sym ${sym}_=${sym}_netlib_ ${sym}_netlib.f.o; \
        ar d liblapack_adapt.a ${sym}.f.o; \
        ar ru liblapack_adapt.a ${sym}_netlib.f.o; \
        rm ${sym}_netlib.f.o; \
    done < comm.sym

  3. (可选)生成完整功能的单一KML_LAPACK动态库。

    某些应用场景可能只允许链接单个LAPACK动态链接库,此时可采用以下方法将上一节生成的libklapack_xxx.a和liblapack_adapt.a合成单一的libklapack_full.so。

    假设KML_LAPACK库为/usr/local/kml/lib/libklapack.a和/usr/local/kml/lib/libkservice.a,适配后的Netlib LAPACK库为当前目录下的liblapack_adapt.a。
    gcc -o libklapack_full.so -shared -fPIC -Wl,--whole-archive /usr/local/kml/lib/libklapack.a liblapack_adapt.a -Wl,--no-whole-archive /usr/local/kml/lib/libkservice.a -fopenmp -lpthread -lgfortran -lm

    执行完成后当前目录下会生成libklapack_full.so,可以单独链接此so得到LAPACK-3.9.1的全部接口功能。

    此时仍然需要单独链接KML_BLAS库以及libgfortran等系统库。

安装后验证

使用时,假设环境变量KML_LAPACK_ROOT为libklapack.*所在目录,ADAPT_ROOT为适配后Netlib LAPACK库所在目录。用户应用可以选择使用动态链接库或静态链接库。编译应用源代码时需要链接到KML_LAPACK、Netlib LAPACK、Netlib BLAS和gfortran库并开启OpenMP支持。