標籤:
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 的能力了。 如果安裝 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)
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 結果: 本文轉自新浪部落格:http://blog.sina.com.cn/s/blog_62c832270101eo60.html
Windows下Fortran編譯Lapack庫及使用的方法(轉自新浪)