Linux/HPC-在Linux中编译和安装LAPACK/BLAS

  BLAS(Basic Linear Algebra Subprograms)是一系列基本线性代数运算函数的接口(interface)标准,是一个接口的标准而不是某种具体实现(implementation)。

  LAPACK(Linear Algebra PACKage),是用Fortran 90编写的一组函数,提供了求解联立线性方程组、线性方程组最小二乘解、特征值问题和奇异值问题的函数集。还提供了相关的矩阵分解(LU、Cholesky、QR、SVD、Schur、广义 Schur)等,例如重新排序 Schur 分解和估计条件数等功能。

  本文将涉及多种BLAS/LAPACK的实现,注意不要与求解稀疏矩阵方程的方法搞混。

一、 netlib BLAS/LAPACK

  这个版本的BLAS被称为reference BLAS,常常作为求解速度参考,运行速度较慢,串行求解,可以直接下载LAPACK,其中会包含BLAS。

  首页:LAPACK — Linear Algebra PACKage (netlib.org)

  LAPACK 是一个免费提供的开源软件包,使用修改后的 BSD 许可证,因此,它可以包含在商业软件包中(并且已经包含在内)。

  首先进入首页下载当前最新版本的lapack包:lapack-3.10.0.tar.gz(文章发布时最新版本为version 3.10.0)

  拷贝到相应位置后,解压,进入lapack主目录:

  1. 进入INSTALL文件夹,拷贝相应的make.inc文件到lapack主目录,例如,如果使用的是gfortran,则需要拷贝make.inc.gfortran,如果使用的是IVF,则需要拷贝make.inc.ifort,删掉后面的编译器名,只保留文件名make.inc;

  2. 打开makefile文件,找到如下关键字:

.PHONY: lib
#lib: lapacklib tmglib
lib: blaslib variants lapacklib tmglib

  确认注释掉了第二行,第三行是有效行。

  这一步的意思是,由于lapack依赖blas,如果你的系统中没有blaslib,则需要在编译lapack时也编译blas。

  3. 主目录中的lapack_testing.py缺少执行权限,在编译过程中会出现“make: execvp: ./lapack_testing.py: Permission denied”的错误,因此需要给该文件提供权限,简单起见,输入命令
chmod +777 lapack_testing.py

   4. 执行编译命令

make all

  在编译完成后会执行测试程序,输出如下结果表示编译完成:

  --> LAPACK TESTING SUMMARY <--
  Processing LAPACK Testing output found in the TESTING directory
  SUMMARY      nb test run    numerical error      other error
  ================ =========== ================= ================
  REAL          1316145   0 (0.000%)      0 (0.000%)
  DOUBLE PRECISION  1316967  0 (0.000%)      0 (0.000%)
  COMPLEX       776317  0 (0.000%)      0 (0.000%)
  COMPLEX16      777128  0 (0.000%)       0 (0.000%)

  --> ALL PRECISIONS 4186557 0 (0.000%) 0 (0.000%)

  编译完成后,会得到三个文件:
  liblapack.a librefblas.a libtmglib.a
  可以作为静态编译库使用。  
  注意:不同的编译器、硬件环境可能会造成一定的数值误差。
二、OpenBLAS
  OpenBLAS 是一个基于GotoBLAS2 1.13 BSD版本的优化BLAS库,OpenBLAS是BLAS标准的一种具体实现,对LAPACK只有部分实现。
  Openblas在编译时根据目标硬件进行优化,生成运行效率很高的程序或者库。Openblas的优化是在编译时进行的,所以其运行效率一般比atlas要高。但这也决定了openblas对硬件依赖性高,换了机器就需要重新编译。
  性能堪比MKL
   编译过程简单,在解压源代码后,有Makefile和CMake两种编译方式。
  1. Makefile
  源代码中自带Makefile,可以在主文件夹直接运行make或者make -j,程序会自动检测主机CPU架构并生成特定优化的库,如果需要其他架构,则命令为“make TARGET=xxx”。
  编译完成的输出显示:

  OS ... Linux
  Architecture ... x86_64
  BINARY ... 64bit
  C compiler ... GCC (cmd & version : cc (Debian 8.3.0-6) 8.3.0)
  Fortran compiler ... GFORTRAN (cmd & version : GNU Fortran (Debian 8.3.0-6) 8.3.0)
  Library Name ... libopenblas_sandybridgep-r0.3.23.a (Multi-threading; Max num-threads is 40)

  最终生成的库文件为libopenblas_xxx-r0.3.23.a和libopenblas_xxx-r0.3.23.so,xxx是CPU架构名称。
  要安装到指定文件夹内,命令“make PREFIX=/path/to/your/installation install”。
   2. CMake
   标准的CMake编译模式,用户自定义配置项不多。
mkdir build
cd build
ccmake ..
make
make install
三、Intel MKL(商用闭源)
  MKL目前集成于oneAPI套件中,安装该套件即可使用MKL库。
  英特尔数学核心函数库(Intel Math Kernel Library,MKL)是一套经过高度优化和广泛线程化的数学例程,专为需要极致性能的科学、工程及金融等领域的应用而设计。是一套经过高度优化和线程化的函数库,并提供了C和Fortran接口。
  拥有BLAS和LAPACK的完整实现,但不提供源代码,在英特尔的CPU上效率更高。
四、AMD AOCL(商用闭源)
  AOCL是一组基于AMD“Zen”核心架构和世代针对AMD处理器优化的数字库。支持的处理器系列包括 AMD EPYC、AMD 锐龙和 AMD 锐龙 Threadripper 处理器。行业标准数学库的优化实现支持快速开发科学和高性能计算应用程序。
  根据自身系统选取相应的包安装即可,由于闭源所以不需要编译步骤。
  拥有BLAS和LAPACK的完整实现,但不提供源代码,在AMD的CPU上效率更高。
五、NVIDIA cuBLAS/cuSOLVER(商用闭源)
  cuBLAS库可提供基本线性代数子程序(BLAS)的GPU加速实现。cuBLAS利用针对NVIDIA GPU高度优化的插入式行业标准BLAS API,加速AI和HPC应用。cuBLAS库包含用于批量运算、跨多个GPU的执行以及混合精度和低精度执行的扩展程序。通过使用 cuBLAS,应用将能自动从定期性能提升及新的GPU体系架构中受益。cuBLAS库包含在NVIDIA HPC SDK和CUDA Toolkit中。
  cuBLAS支持 152 个标准 BLAS 例程,支持半精度和整数矩阵乘法。多GPU间矩阵操作在开发中。
  cuSOLVER库提供了密集和稀疏的直接线性求解器和特征求解器的集合,可为计算机视觉、CFD、计算化学和线性优化应用提供显著的加速。cuSOLVER库包含在NVIDIA HPC SDK和CUDA Toolkit中。
  cuSOLVER库只提供了关键LAPACK求解器,例如LU、SVD、QR等,不是LAPACK的完整实现。
posted @ 2022-03-30 10:53  流光Light  阅读(2035)  评论(0)    收藏  举报