LAPACKLAPACK,全称是Linear Algebra PACKage,一个高性能的线性代数的程序库,主页http://www.netlib.org/lapack/ 。
1、安装
LAPACK是用fortran写的,LAPACKE是它的C语言接口,先安装LAPACK,然后安装LAPACKE,那么在程序中可以直接调用C函数来实现需要的功能。
下面介绍这两个包的安装。
1)LAPACK的安装
从官方网站上下载lapack包,目前最新版本是3.3.1。解压之后,查看一下README文件。在Linux上安装(我用的时Ubuntu10.04LTS),需要先配置好make.inc文件。
一些编译参数,
PLAT 表示使用的平台,会接在生成lib库的名字中,原本是 _LINUX, 我改成空的了。
FORTRAN 表示你使用的fortran编译器,根据自己安装的编译器来设置,我用的是 gfortran。
OPTS 表示 编译时的优化程度,设置为 -O2即可。
LOADER 设置成和FORTRAN 基本一样就可以了。
确定生成目标如下,
BLASLIB = http://www.cnblogs.com/libblas$(PLAT).a
LAPACKLIB = liblapack$(PLAT).a
TMGLIB = libtmglib$(PLAT).a
EIGSRCLIB = libeigsrc$(PLAT).a
LINSRCLIB = liblinsrc$(PLAT).a
原来的这些库文件的名字前面没有lib的,这里加上。因为linux上库文件一般有前缀lib的,在链接的时候 -l后面带的是库的名字,那个时候是不加lib的。如果已经编译生成了这些库,可以重命名,而不用重新编译。
在Makefile中,可以看到 all这一行有很多选项,我们make的时候,可以输入lib,那么就会只生成lib,如果直接make,会把所有的都编译,包括测试。还有一行lib, 列出了要生成的lib,注释掉的一行没有blaslib,如果已经安装了blaslib,那么就不用改了,没有安装的话,就把上一行注释掉,把这一行的注释去掉。或者自己手动加上。
2) LAPACKE的安装
从网站上下载lapacke的压缩包,就是Standard C language APIs for LAPACK对应的压缩包,解压缩,查看README文件。
同样地,需要修改make.inc文件,
CC 表示使用的C程序编译器,改成 gcc,
LINKER 表示编译时要使用的连接器,前面几行注释提到了, 之前编译lapack.a 和blas.a用的什么fortran编译器,这里就用什么。那么改成 gfortran.
LAPACKE 表示要生成的库文件的名字,类似的,改成liblapacke.a
LAPACKE的编译需要之前生成的lapack库文件,所以LIBS这一行需要设置好。
LIBS = $(LAPACK_PATH)/liblapack.a $(LAPACK_PATH)/libblas.a
其中LAPACK_PATH就是liblapack.a所在的目录了。
查看以下Makefile,没什么需要修改的,可以直接make,或者是make lapacke, 不让它编译test的内容。然后就生成liblapacke.a了。
2、使用示例
因为生成的是库文件,所以可以把这些库文件放在系统的/usr/lib下面,这样链接这些库的时候可以不用给出路径了。
先测试一下LAPACK。链接中有一个测试例子,http://blog.sciencenet.cn/home.php?mod=space&uid=271986&do=blog&id=280793。
使用下面的语句编译,
gfortran test.f90 -llapack -lblas
然后就生成了a.out,可以执行了。
再测试LAPACKE。在lapacke的文件夹下面,有testing目录。我们近测试一个小的程序。新建一个目录,test_lapacke,把testing/include下面的test_utils.h文件拷出来,把utlis文件夹拷出来,把interface的一个.c文件拷出来,比如cbdsqr_1.c。还有lapacke文件夹下面的include里面的头文件。
那么按下面的命令编译,
gcc *.h cbdsqr_1.c utils/*.c -llapack -lblas -llapacke
编译成功,运行,输出PASSED,…。那么就表示程序运行正确了。
这些只是测试,想要更方便的使用这些库,有两种方法,一是将那几个库文件放在/usr/lib下面,使用-l指定链接这些库,同时把lapacke/include下面的文件放到/usr/include下面,那么使用的时候,可以直接包含这些头文件。另一种方法就是把这些库文件,和那几个头文件放在自己的工程目录里。这两种方法差不多。