用BLAS+LAPACK或OpenBLAS或MKL编译安装SciPy

昨天有一个工单,涉及到编译安装SciPy。如果在个人电脑上,对性能没有太大要求的,可以直接在Linux下用包管理器安装好或者在Windows下安装已经打包好的SciPy。然而在对性能有需求的地方,还是需要进行编译安装的。另外,国内的超级计算机基本上都是在一个内网里,不接入外网,要登陆使用必须挂VPN,所以自然是不能用包管理器的了。NumPy和SciPy一般是一起装的,matplotlib依赖这两个。NumPy的线性代数部分依赖现有的高性能线性代数库,比如Intel MKL、AMD ACML、GotoBLAS2、LAPACK、ATLAS等。网上的文章很多都说要用ATLAS + LAPACK来装,但我没用这个方法。最大的原因是,ATLAS在安装的时候会检测CPU是否有睿频,有的话要频率开到最大才能继续编译安装。但是一般用户没有sudo权限,所以只能另寻他法。找了一圈试了一下以后发现可以只装netlib的BLAS和LAPACK来安装SciPy,或者用OpenBLAS来装(其实也要用到netlib的LAPACK),或者用MKL来装。
装这个包这两天折腾了我好久。好在问题总算解决了,我整理了一下我的安装步骤,以供参考。

安装环境:SuSE Enterprise Linux 11, 2 * Xeon X5650 @ 2.67GHz, GCC 4.3.4, ICC 12.1。对于其他64位的Linux来说,下面的方法应该都适用,只要你搞清楚你的ICC路径(如果有的话)。

*****共同部分*****
1、编译Python 2.7.10
解压压缩包(下略,默认有这个步骤),进入得到的目录

如果不是使用ICC来安装,不要指定CC CXX FC这三个参数,也不要加上–without-gcc这个参数。记得要更新PATH路径,否则下面的安装会使用系统自带的Python(除非你正想如此)。

2、安装setuptools-18.3.1

 

3、安装pip-7.1.2

 

4、安装nose-1.3.7

 

*****用GCC、BLAS和LAPACK安装*****
这个应该比较有用,毕竟不是谁都会没事搞一套贵死人的ICC来玩的(我不会告诉你我发现ICC的试用期过了可以通过往回调系统时间来继续用)。

5、安装numpy-1.9.2
解压得到文件夹后直接

 

6、安装BLAS
下载地址:http://www.netlib.org/blas/blas.tgz

修改make.inc,64位系统要改:

然后make

7、安装LAPACK
下载地址:http://www.netlib.org/lapack/

修改make.inc,64位系统要改:

然后make即可。
这里的BLASLIB是用来做计算对比参考的,看看编译出来的LAPACK的结果和BLAS的差别有多大,一般不会有问题。

8、安装scipy-0.16.0
设置环境变量

然后直接

就可以了

*****用GCC、OpenBLAS安装*****
OpenBLAS是GotoBLAS2-1.13的衍生版,因为后者已经停止维护了,前者是中科院的一个大牛在进行继续开发,对龙芯和比较新的Intel CPU有进一步优化,在Sandy Bridge架构上甚至可以媲美Intel MKL。
下载地址:http://www.openblas.net/

5、装OpenBLAS-0.2.14
在解压出来的文件夹里直接make就可以了。如果要改编译器,则在make后面指定CC CXX FC三个参数。

6、装OpenBLAS自带的LAPACK
OpenBLAS自带了netlib的LAPACK,好像也是用于对比验证的。进入OpenBLAS解压文件夹里的lapack-netlib,将make.inc里面的以下三项参数改成下面这个样子:

然后make,此时得到一个完整的LAPACK,记下此时所在文件夹的地址

7、编译numpy-1.9.2
在numpy-1.9.2文件夹里

编辑site.cfg,找到[openblas]一项,注释掉对应的四行,并且把下面的路径改为对应的安装路径,然后

 

8、编译SciPy

就可以了。这里补充一句,numpy可以在没有LAPACK的情况下编译安装,但是scipy不行,起码我试了几次都提示没找到这两个。所以还是要编译一个LAPACK的。

*****用ICC、MKL安装*****
如果用ICC和MKL来安装,请确保第一步的三个参数CC CXX FC设置成了icc icpc ifort。否则可能出错。安装方法基本就是按https://software.intel.com/en-us/articles/numpy-scipy-with-mkl/所说的进行安装,你可以认为我做了一个翻译。

5、安装numpy-1.9.2
在numpy-1.9.2文件夹内新建一个site.cfg,输入:

编辑numpy-1.9.2/numpy/distutils/intelccompiler.py,修改

编辑numpy-1.9.2/distutils/fcompiler/intel.py
在class IntelFCompiler下的get_flags_opt,修改为

以上两项表示打开OpenMP支持,针对本机架构做优化。然后退出到numpu-1.9.2目录,执行

以后使用的时候(包括下面编译之前)需要先设置相关的路径

这里第二个路径随不同版本的ICC可能有变动,可能会变为<ICC安装路径>/compiler/lib/intel64

6、用MKL编译安装scipy-0.16.0
在scipy-0.16.0的目录里执行:

【应该】是可以的,但是我遇到了报错说ld : cannot find -lmkl_lapack32
然后我改成了

就没有问题了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注