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

你可能感兴趣的:(windows,优化,library,fortran,makefile,编译器)