Windows下Fortran编译Lapack库及使用的方法(转自新浪)

Lapack 是一套被非常广泛使用的线性代数计算工具库,现在的主要编写语言时 Fortran90 。Lapack 基本上可以说是速度最快的线性代数计算库,我们看看官方给出的其被应用的几个地方就可以看出来:
 
high-level interface:
Matlab
Octave
NAG Numerical Librairies
Maple
R project
Scilab
 
列表上这些软件/语言是不是如雷贯耳,由此可见 Lapack 的流行程度。
 
Lapack同时有 Fortran 和 C/C++ 的接口,现在网上能找到的教程似乎都是 C 的居多,为此我整理了下我搭建 Lapack Fortran 使用环境的步骤,希望对其他人有帮助。
 
本文使用环境如下:
 
操作系统版本:Windows 8
使用的编译器:gfortran (GCC版本4.6.2 MinGW环境)
Lapack版本: 3.4.2
 
1)MinGW设置:
 
由于需要使用自带的Makefile进行编译,因此要用到Makefile和自带的Make程序。对于Linux这当然不是问题,对于Windows而言则有点麻烦。
 
在 Windows 下使用make来编译程序有两种主要途径,分别是 Cygwin和 MinGW 。安装这两种软件(?)后他们就可以在 Windows 下模拟出 Linux 的使用环境。他们的主要区别我个人理解是:Cygwin 更偏向于模拟 Linux,因此编译出来的软件还是使用的 Linux 的一系列接口, Cygwin 则模拟这些接口,这也是为什么 Cygwin 编译出来的 Windows 程序还需要 cygwin1.dll 才能运行,同时效率也比较低,但是带来的好处是在两个系统上的兼容性好; MinGW 更倾向于让 Windows 用户使用 Linux 上的资源,因此编译出来的程序使用的是 Windows 的接口,速度也更快一些。
 
Cygwin 在安装的时候可选组件非常多,在 Cygwin 下如果你选择了安装 Make 组件,那么你可以在 CMD 命令行或者 Cygwin Shell 下同时用 Make 命令进行编译 ( CMD 命令行下可能还得再加个 Makefile 的文件名,具体我记不清了,但是肯定是可以做的),比较方便。
 
MinGW 相对麻烦一些,因为 MinGW 在安装时可选组件和定制项很少,不能单独安装 Make 组件。在 MinGW 下使用 Make的唯一方法,就是在安装时选择安装 MSYS Basic System。这个组件是模拟一个 Linux Shell ,这样我们就有类似 Cygwin 的能力了。
 
Windows下Fortran编译Lapack库及使用的方法
 
如果安装 MinGW 的时候没有安装这个组件,不要慌张,打开 MinGW 安装程序,再添加一下就行。有了这个组件后,关于MinGW的配置就大功告成了。
 
2)LAPACK源码下载及设置:
 
LAPACK 源码的下载可以去官网(http://www.netlib.org/lapack/)下,下载下来后是一个tgz文件。下载完成后解压之。
 
LAPACK 源码的 Makefile 和 make.inc 是我们需要根据系统环境修改的地方。默认源码里没有 make.inc ,但是有个 make.inc.example ,把它改名成 make.inc 。
 
打开 make.inc ,里面每个参数所需要注意的事项都注意得很清楚了,比如编译器选项什么的,根据你的需求改就是了。
 
贴一下我的 make.inc文件,由于官方默认设置就是基于gfortran所以其实我压根没改
 
####################################################################
#  LAPACK make include file.                                       #
#  LAPACK, Version 3.4.0                                           #
#  April 2012                                                   #
####################################################################
#
SHELL = /bin/sh
# 
#  Modify the FORTRAN and OPTS definitions to refer to the
#  compiler and desired compiler options for your machine.  NOOPT
#  refers to the compiler options desired when NO OPTIMIZATION is
#  selected.  Define LOADER and LOADOPTS to refer to the loader and
#  desired load options for your machine.
#
FORTRAN  = gfortran
OPTS     = -O2
DRVOPTS  = $(OPTS)
NOOPT    = -O0
LOADER   = gfortran
LOADOPTS =
#
# Timer for the SECOND and DSECND routines
#
# Default : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME
#TIMER    = EXT_ETIME
# For RS6K : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME_
# TIMER    = EXT_ETIME_
# For gfortran compiler: SECOND and DSECND will use a call to the INTERNAL FUNCTION ETIME
TIMER    = INT_ETIME
# If your Fortran compiler does not provide etime (like Nag Fortran Compiler, etc...)
# SECOND and DSECND will use a call to the INTERNAL FUNCTION CPU_TIME
# TIMER    = INT_CPU_TIME
# If neither of this works...you can use the NONE value... In that case, SECOND and DSECND will always return 0
# TIMER     = NONE
#
#  Configuration LAPACKE: Native C interface to LAPACK
#  To generate LAPACKE library: type 'make lapackelib'
#  Configuration file: turned off (default)
#  Complex types: C99 (default)
#  Name pattern: mixed case (default)
#  (64-bit) Data model: LP64 (default)
#
# CC is the C compiler, normally invoked with options CFLAGS.
#
CC = gcc
CFLAGS = -O3
#
#  The archiver and the flag(s) to use when building archive (library)
#  If you system has no ranlib, set RANLIB = echo.
#
ARCH     = ar
ARCHFLAGS= cr
RANLIB   = ranlib
#
#  Location of the extended-precision BLAS (XBLAS) Fortran library
#  used for building and testing extended-precision routines.  The
#  relevant routines will be compiled and XBLAS will be linked only if
#  USEXBLAS is defined.
#
# USEXBLAS    = Yes
XBLASLIB     =
# XBLASLIB    = -lxblas
#
#  The location of the libraries to which you will link.  (The
#  machine-specific, optimized BLAS library should be used whenever
#  possible.)
#
BLASLIB      = ../../librefblas.a
LAPACKLIB    = liblapack.a
TMGLIB       = libtmglib.a
LAPACKELIB   = liblapacke.a
 
这里吐槽下,我下载的 Lapack 版本是3.4.2,结果下载下来文件夹名是3.4.2,但是 make.inc 的注释版本是3.4.0,makefile的注释版本是3.4.1,你们敢认真点吗。
 
值得注意的是, Lapack 需要用到 Blas 库,因此你系统有无 Blas 库对应着两种不同的做法。
 
如果系统已经有了 Blas 库,或者说你想要用自己的 Blas 库,你需要修改 make.inc 里的 USEXBLAS 、 XBLASLIB 和 XBLASLIB 三个变量,修改完直接Make就行了。
 
如果系统没有 Blas 库,Lapack 源码里自己带了一个,可以直接用。那么保持 make.inc 里的设置如上文件所示,打开 Makefile,把 Blas 库加到编译目标里,就是 lib 参数编程:
 
lib: blaslib lapacklib tmglib
 
设置完成后打开 MinGW Shell ,一路 cd 到 Lapack 源码所在目录,输入 Make 回车,等待漫长编译过程。
 
编译完成后会自动对 Lapack 包进行测试,测试是调用一个 lapack_testing.py 文件进行测试。系统如果没有 Python 的话这一步应该会出错,需要注意下。(不过我 MinGW 默认安装后没有出错,可能已经自动安装了 Python)
 

Windows下Fortran编译Lapack库及使用的方法 

 
3)Lapack的使用:
 
上面编译的设置是生成静态库,编译完成后我们就得到三个文件:
 
liblapack.a
librefblas.a
libtmglib.a
 
有三种方式可以使用 Lapack:
 
假设我们要编译一个程序 program.f90,对应方法如下:
 
a. 放到系统 lib 文件夹:
 
把上面三个文件直接拷贝到 MinGW 的 lib 文件夹下,然后再编译的时候直接加
 
gfortran program.f90 -llapack -lrefblas -o program.exe
 
即可链接程序。
 
b. 放到主程序根目录:
 
把上面三个静态链接库和程序放在一个目录下,然后用下面的命令编译
 
gfortran program.f90 liblapack.a librefblas.a -o program.exe
 
c. 在主程序目录单独给 lapack 库单独建个文件夹:
 
比如在 program.90 文件夹下新建 Lapack 文件夹,利用 -L 把这个文件夹添加到 lib 搜索路径里。编译命令就变成:
 
gfortran program.f90 -L./Lapack -llapack -lrefblas -o program.exe
 
我个人推荐采用第三种方式,一方面代码层次简洁美观,另外一方面减少代码阅读者对于搭建编译环境所需要的时间。
 
最后给个示例文件测试,使用第三种方法,源码:
 
!Testlapack.f90
program main
  implicit none
  real :: a(3,3),b(3)
  integer :: v(3),iflag
  !external sgesv
  a=reshape([2.0,0.0,0.0,0.0,3.0,0.0,0.0,0.0,4.0],[3,3])
  b=[998.0,999.0,1000.0]
  print *,'a=',a
  print *,'b=',b
  call sgesv(3,1,a,3,v,b,3,iflag)
  print *,'solve=',b
end program main
 
编译命令:
gfortran TestLapack.f90 -L./Lapack -llapack -lrefblas -o TestLapack.exe -Wall
 
结果:
 
Windows下Fortran编译Lapack库及使用的方法
 
 本文转自新浪博客:http://blog.sina.com.cn/s/blog_62c832270101eo60.html

posted on 2015-11-15 12:53  Paulcnblogs  阅读(4938)  评论(0编辑  收藏  举报

导航