Windows下lapack的編譯

lapack我就不介紹了,MATLAB的底層就是它。

 

我要在Windows下使用lapack,應該怎麼辦?

1. 有現成的編譯好的庫。比如LAPACK for Windows,或者http://www.fi.muni.cz/~xsvobod2/misc/lapack/

2. CLAPACK,即將原始Fortran程序經f2c轉換後的C程序。可以自己編譯,也可以使用已經編譯好的library。

CLAPACKhttp://www.netlib.org/clapack/

CLAPACK Windows 預編譯庫:http://www.netlib.org/clapack/LIB_WINDOWS/prebuilt_libraries_windows.html

f2c:http://www.netlib.org/f2c/

CLAPACK可以在Windows下用CMake生成VS工程,然後編譯。

3. 在Windows上編譯原始Fortran程序。(忽略使用Cygwin,有點麻煩而且不是徹底的Windows方法)


既然有現成的library可用,爲什麼還要自己編譯呢?

--因爲現有的預編譯library都是lapack 3.2 或3.2版本以下的,而我需要的是3.3版本,Release date: Su 11/14/2010。Release沒多久,CLAPACK還沒有相應更新。

 

爲什麼需要3.2版的lapack?

--請看What's new

Thread safe xLAMCH: SLAMCH and DLAMCH were the only two routines not thread-safe in LAPACK-3.2. This is fixed: all routines in LAPACK-3.3 are now thread-safe.

只有3.3版的lapack纔是完全線程安全的,3.2版的SLAMCH and DLAMCH是線程不安全的。我需要多線程並行調用lapack的svd,它調用了xLAMCH,所以只有3.3版的lapack才能滿足我的要求。

 

怎麼編譯?

1. Fortran編譯器。lapack是用Fortran寫的,自然需要Fortran編譯器。我用的是intel fortran編譯器30天試用版,到這裏下載:http://software.intel.com/en-us/articles/intel-visual-fortran-composer-xe-evaluation/

2. Lapack源碼。到這裏下載3.3版源碼:http://www.netlib.org/lapack/lapack.tgz

3. 用nmake編譯。

安裝完intel fortran編譯器後,可以打開命令行窗口。位置:Intel Parallel Studio XE 2011 -> Command Prompt。打開IA-32(64) Visual Studio 2008(2010) mode,然後cd到lapack目錄,nmake。

當然,直接nmake是絕對不work的。lapack的makefile是爲Linux寫的,用GNU make來編譯的。Windows Visual Studio也有自己的makefile,不過和GNU的makefile語法有些差別,所以修改makefile是必須的。

首先,將make.inc.example重命名爲make.inc,註釋掉SHELL = /bin/sh(前面加#),並將PLAT改爲Win32PLAT = _WIN32)。其它修改如下:
FORTRAN  = ifort /nologo
OPTS     = /O2
DRVOPTS  = $(OPTS)
NOOPT    = /Od
LOADER   = $(FORTRAN)
LOADOPTS =

ARCH     = lib
ARCHFLAGS= /nologo /out:
RANLIB   = echo

ifort是Intel的fortran編譯器,O2表示優化選項(有O1O2O3等可供選擇),Od表示無優化。

然後修改makefile。以下是修改要點:

1. include make.inc修改爲!include <make.inc>。前面加感嘆號,還要使用尖括號。

2. 路徑中的/修改爲/。比如../make.inc修改爲../make.inc

3. .a修改爲.lib.o修改爲.obj

4. windows下無rm(刪除文件)命令,取而代之的是del命令。同時-f參數無效,取消之。同樣,替換mv命名爲move命令(移動文件)。

5. 將ifdef...endif修改爲!ifdef...!endif,前面加感嘆號。另外,VS的makefile沒有ifeqifneq命令。

6. VS的makefile沒有$<宏,修改爲$?。相應地,$^修改爲$**

7. VS的makefile沒有宏追加命令,即無MY_MACRO += ...形式。

8. GNU make可以用";"將多個命令組合在一起,VS的makefile需要使用“&&”。

9. Windows下的lib命令不能這樣使用:lib /out out.lib src1.obj src2.obj,而必須是lib /out:out.lib src1.obj src2.obj,即.out:和輸出文件名間不能有空格。

 

其它注意事項:

1. 關於優化。可以自己調整優化選項,這個對lapack的速度還是有一定影響的。比如我的選項爲OPTS = /O2 /arch:SSE2。試驗發現O2比O1, O3都好。

2. 關於鏈接。ifort在編譯的時候會加上fortran的運行庫,如ifconsol.lib,libifcoremt.lib,libifport.lib,libmmt.lib,以及svml_disp.lib等。我很奇怪,lapack是純算法的,最多也就需要malloc,free,printf和計時函數等,爲什麼還需要這麼多的庫?lapack的很多函數需要work array(space)的,所以malloc,free其實並不需要;printf則用於出錯提示。這意味着你編譯出來的blas和lapack庫還需要附帶這些forran運行庫,很是不爽。我首先嚐試用MT選項編譯靜態庫,未成功;又嘗試用Zl選項去除這些導入信息,但鏈接的時候還是會有問題。推薦方法:使用Zl(注意是ZL不是Zi)選項,然後用lib工具將ifconsol.lib,libifcoremt.lib,libifport.lib,libmmt.lib,以及svml_disp.lib等組合成一個庫,也就是最後只需要3個庫。這三個庫順序不能變,必須是fortran運行庫第一,blas.lib第二,lapack庫最後,因爲blas.lib和lapack.lib依賴於fortran運行庫,lapack.lib依賴於blas.lib。

3. 關於頭文件。我使用的頭文件修改自http://www.fi.muni.cz/~xsvobod2/misc/lapack/download/headers.tar.gz。注意:這些頭文件中的函數名是小寫帶下劃線的,類似sgemm_,而實際庫中的函數名是大寫不帶下劃線的,即SGEMM(前置下劃線問題見前一篇博客)。所以需要將這些函數名全部修改。另外注意extern "C"的使用。

 

參考:

1. Windows下的makefile語法:http://blog.csdn.net/diaoni/archive/2004/12/01/200333.aspx

2. GNU make語法:http://www.gnu.org/software/make/manual/make.pdf

3. ifort優化選項:http://upload.programfan.com/upfile/20071026044421.zip

 

下載:

我修改好的lapack 3.3.0版的makefile,以及編譯好的win32和win64庫文件,以及相應的頭文件:

http://down.qiannao.com/space/file/wpzhao/-4e0a-4f20-5206-4eab/lapack_3.3.0_win_wpzhao.rar/.page

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章