非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
-L和-I后为我们指定软件的安装路径的lib文件夹和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/
lapack目录下的include里的头文件拷贝到/usr/local/include/目录下(非root用户拷贝到自己创建目录下)
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);
}

  

 


 

 

posted @ 2022-06-09 15:20  惊小呆  阅读(1353)  评论(0编辑  收藏  举报