Dr.Shi's Studio.

linux下安装lapack和blas的安装

Word count: 1.2kReading time: 5 min
2023/03/05
loading

BLAS,为 Basic Linear Algebra Subprograms 的缩写,即基础线性代数程序集,是一个应用程序接口(API)标准,用以规范发布基础线性代数操作的数值库(如矢量、矩阵乘法等)。该程序集最初发布于1979年,并用于创建更大的数值程序包(如 LAPACK)。在高性能计算领域,BLAS被广泛使用。各软件软件厂商在对blas借口高度优化后发行(openblas、MKL等)。LAPACK,是 Linear Algebra PACKage 的缩写,是以 Fortran语言编写的,用于数值计算的函式集。 LAPACK 提供了丰富的工具函数,可用于诸如解多元线性方程式、线性系统方程组的最小二乘解、计算特征向量、用于计算矩阵 QR 分解的 Householder 变换、以及奇异值分解等问题。除此之外Netlib也实现了在Fortran之外的C语言的调用方式,用Cblas和LAPACKE。

BLAS分为三级: 第一级,完成向量与向量或者向量与标量以及范数之间的运算。 第二级,涉及矩阵与向量之间的操作。 第三级,涉及矩阵与矩阵之间的操作。

安装

1.环境
系统:Ubuntu、CentOS
编译器:gcc、gfortran

如果没有安装gfortran的话需要安装:

1
2
ubuntu: sudo apt-get install gfortran
Centos: yum install gcc-gfortran

2.下载lapack,lapack的安装包已经包含了blas、cblas、lapacke,所以只需要下载lapack的安装包即可。将下载的安装包解压,进入解压后的安装包。

1
2
3
4
5
6
cd lapack-3.11.0
cp make.inc.example make.inc
make blaslib
make cblaslib
make lapacklib
make lapackelib

如果需要使用lapack和blas构建C语言的动态库,也就是需要上述编译的lapack静态库(.a文件)。lapack默认的编译选项不支持上述操作,因此我们需要修改lapack-3.11.0/make.inc.example,打开文件,在下列几个编译选项上加上-fPIC,然后按照上述过程重新编译lapack

1
2
3
4
CFLAGS = -O3 -fPIC

FFLAGS = -O2 -frecursive -fPIC
FFLAGS_NOOPT = -O0 -frecursive -fPIC

3.编译完成后检查lapack-3.11.0目录下是否有librefblas.a、libcblas.a、liblapack.a、liblapacke.a这几个文件,没有的话重新编译一次。

4.头文件路径为: cblas头文件路径: lapack-3.11.0/CBLAS/include lapacke头文件路径: lapack-3.11.0/LAPACKE/include

为了后续使用时不用每次都指定头文件和静态库的路径,有两种方式处理。第一种办法是把上述静态库xxx.a复制到/usr/local/lib,把cblas和lapacke的头文件复制到/usr/local/include。如果没有root权限,则在用户目录下的~/.bashrc里添加

1
2
3
4
5
export CPLUS_INCLUDE_PATH=xxxx/lapack-3.11.0/LAPACKE/include:$CPLUS_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=xxxx/lapack-3.11.0/CBLAS/include:$C_INCLUDE_PATH
export C_INCLUDE_PATH=xxxx/lapack-3.11.0/LAPACKE/include:$C_INCLUDE_PATH
export C_INCLUDE_PATH=xxxx/lapack-3.11.0/CBLAS/include:$C_INCLUDE_PATH
export LD_LIBRARY_PATH=xxxx/lapack-3.11.0:$LD_LIBRARY_PATH

执行一下命令source ~/.bashrc重新加载环境变量。

测试

1.cbals测试

新建文件test.c

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include "cblas.h"

int main()
{
const int dim=2;
double a[4]={1.0,1.0,1.0,1.0},b[4]={2.0,2.0,2.0,2.0},c[4];
int m=dim,n=dim,k=dim,lda=dim,ldb=dim,ldc=dim;
double al=1.0,be=0.0;
cblas_dgemm(101,111,111,m,n,k,al,a,lda,b,ldb,be,c,ldc);
printf("the matrix c is:%f,%f\n%f,%f\n",c[0],c[1],c[2],c[3]);
return 0;
}
编译

1
gcc test.c -o test -lcblas -lrefblas -lm -lgfortran

编译时若出现错误,如果是头文件和静态库未找到,请参考第2部分。也可以在编译时加路径参数,缺哪个补哪个,如下

1
2
3
4
gcc test.c -o test -lcblas -lrefblas -lm -lgfortran -I/xxx/lapack-3.11.0/CBLAS/include -L/xxx/lapack-3.11.0 -L/usr/lib/gcc/x86_64-linux-gnu/7
# -I/xxx/lapack-3.10.1/CBLAS/include 用自己的CBLAS头文件路径替代
# -L/xxx/lapack-3.10.1 用自己的lapack静态库路径替代
# -L/usr/lib/gcc/x86_64-linux-gnu/7 用自己的gcc libgfortran.a 所在的路径替代

运行 ./test,预期输出

1
2
the matrix c is:4.000000,4.000000
4.000000,4.000000
2.lapacke测试 新建文件test.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/* Calling DGELS using row-major order */

#include <stdio.h>
#include <lapacke.h>

int main (int argc, const char * argv[])
{
double a[5][3] = {1,1,1,2,3,4,3,5,2,4,2,5,5,4,3};
double b[5][2] = {-10,-3,12,14,14,12,16,16,18,16};
lapack_int info,m,n,lda,ldb,nrhs;
int i,j;

m = 5;
n = 3;
nrhs = 2;
lda = 3;
ldb = 2;

info = LAPACKE_dgels(LAPACK_ROW_MAJOR,'N',m,n,nrhs,*a,lda,*b,ldb);

for(i=0;i<n;i++)
{
for(j=0;j<nrhs;j++)
{
printf("%lf ",b[i][j]);
}
printf("\n");
}
return(info);
}
编译时注意,更换静态库的链接顺序,可能会报错
1
gcc test.c -o test -llapacke -llapack -lcblas  -lrefblas  -lm -lgfortran
运行 ./test,预期输出
1
2
3
2.000000 1.000000
1.000000 1.000000
1.000000 2.000000
至此安装过程结束。

CATALOG
  1. 1. 安装
  2. 2. 测试