非root用户安装科学计算包blas、lapack和FFTW
一、安装FFTW
1、下载FFTW源码包
下载地址:http://www.fftw.org/download.html若要下载之前版本,点击下图browse可以下载之前版本。
2、解压编译安装
tar -zxvf fftw-3.3.10.tar.gz cd fftw-3.3.10/ ./configure --prefix=/BIGDATA2/nscc_sci_1/xujb/fftw --enable-threads make make install
注:如果在配置或编译过程中遇到问题,您可能需要在重试之前运行“make distclean”;确保没有以前编译尝试留下的任何陈旧文件。
3、测试例子
使用自己准备的例子(vim test_fftw.cpp 测试代码在最后面)
g++ test_fftw.cpp -o test_fftw -lfftw3 \ -L/BIGDATA2/nscc_sci_1/xujb/fftw/lib \ -I/BIGDATA2/nscc_sci_1/xujb/fftw/include
然后会生成test_fftw可执行程序 通过命令(./test_fftw)执行测试例子
一、安装blas、lapack
blas提供了一些基本的矩阵和向量运算,lapack提供了更丰富的线性方程求解、二次规划、特征值分解等等的运算。cblas是blas的c接口,lapacke是lapack的c接口,因为要用c进行调用,一并安装。1、环境准备
依赖库至少需要 gfortran、cmake。其他不能确定2、下载lapack安装包
下载地址:https://www.netlib.org/lapack/
【lapack包里已经包含了blas包了,无需重新下载】
3、解压编译安装
tar -zxvf lapack-3.10.0.tar.gz cd lapack-3.10.0/
解压之后它里面会含有BLAS,CBLAS,LAPACKE等文件夹,其中BLAS是BLAS的源码,CBLAS是BLAS的C语言接口
在make之前,需要先创建一个make.inc文件,可以直接根据make.inc.example创建
(如果需要其它编译器编译,从INSTALL/make.inc.*拷贝过来)
cp make.inc.example make.inc make blaslib make cblaslib make lapacklib make lapackelib
4、检查库文件和头文件
1、 静态库路径: ~/lapack-3.10.0。
检查下~/lapack-3.10.0下是否有librefblas.a、libcblas.a、liblapack.a、liblapacke.a这几个文件,没有的话重新编译一次。
2. 头文件路径
cblas头文件路径: ~/lapack-3.10.0/CBLAS/include
lapacke头文件路径: ~/lapack-3.10.0/LAPACKE/include
【注意】:cblas是blas的c接口,lapacke是lapack的c接口,由于blas、lapack是fortran代码所以这两个没有头文件,只有.a文件
5、其它
1、修改Makefile文件
如果是使用gfortran,则无须更改make.inc里的内容,否则需要根据系统环境和编译器修改文件里对应的选项。
LAPACK依赖BLAS,因此在编译LAPACK前需要提供BLAS包,所幸LAPACK里已经集成了BLAS包,但默认并不编译它。
要想编译LAPACK前先编译BLAS,需要修改一下makefile:
vim Makefile
然后make编译
2、cd LAPACKE目录下,再次进行make操作!~【重要】
两处都make成功后,会在目录lapack-3.10.0下生成 liblapack.a、liblapacke.a、librefblas.a、libtmglib.a 这个4个静态库文件
把这4个静态库文件,拷贝到/usr/local/lib/目录下(非root用户拷贝到自己创建目录下)
cp *.a /BIGDATA2/nscc_sci_1/xujb/usr/local/lib/
cd LAPACKE/include cp *.h /BIGDATA2/nscc_sci_1/xujb/usr/local/include/
至此lapack 和 blas已经安装好了!
3、其它
cd lapack-3.8.0/
cp INSTALL/make.inc.gfortran make.inc
vim make.inc
给OPTS和NOOPT这两个设置都加上-fPIC选项。如果是64位系统,还需要加上-m64选项。修改后如下
make lapacklib 2>&1 | tee log
make clean # 清理文件
4、单独编译blas
进入 BLAS/SRC 文件夹,执行以下几条命令cd BLAS/SRC/
gfortran -c -O3 *.f # 编译所有的 .f 文件,生成 .o文件,
ar rv libblas.a *.o # 链接所有的 .o文件,生成.a 文件
6、测试lapack和blas包是否安装成功
测试代码(test.c)放在最后面使用软连接进行编译
gcc test.c -o test -I/BIGDATA2/nscc_sci_1/xujb/usr/local/include -L/BIGDATA2/nscc_sci_1/xujb/usr/local/lib -llapacke -llapack -lrefblas -lgfortran -lm -w
执行./test
三、测试的代码
1、FFTW的测试代码
/* * test_fftw.cpp */ #include <stdio.h> #include <fftw3.h> int main() { int N = 8; fftw_complex *out = NULL, *in = NULL ,*in2; fftw_plan p,p1; in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N); out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N); in2 = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N); printf("original signal: "); for(int i = 0;i<N;i++) { in[i][0] = 2*i - 1; in[i][1] = 0; printf("%f ",in[i][0]); } p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD,FFTW_ESTIMATE); fftw_execute(p); printf("\nbefore fourier: "); for(int i =0;i<N;i++) { printf("%.2f +j %.3f ",out[i][0],out[i][1]); } p1 = fftw_plan_dft_1d(N,out,in2,FFTW_BACKWARD,FFTW_ESTIMATE); fftw_execute(p1); printf("\nbefore ifourier: "); for(int i = 0;i<N;i++) { in2[i][0] = in2[i][0] / N ; printf("%.2f ",in2[i][0]); } printf("\n"); fftw_destroy_plan(p); fftw_free(in); fftw_free(out); fftw_free(in2); return 0; }
2、blas、lapack的测试代码
vim test.c
#include <stdio.h>
#include <lapacke.h>
int main (int argc, const char * argv[])
{
double a[5*3] = {1,2,3,4,5,1,3,5,2,4,1,4,2,5,3};
double b[5*2] = {-10,12,14,16,18,-3,14,12,16,16};
lapack_int info,m,n,lda,ldb,nrhs;
int i,j;
m = 5;
n = 3;
nrhs = 2;
lda = 5;
ldb = 5;
info = LAPACKE_dgels(LAPACK_COL_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+ldb*j]);
}
printf("\n");
}
return(info);
}