【Python笔记】如何源码编译依赖LAPACK和ATLAS库的NumPy包

上篇笔记介绍了不依赖lapack和atlas库的NumPy包源码编译/安装方法,但“纯净版”的NumPy会损失性能,故本篇笔记说明如何源码编译安装依赖lapack和atlas库的NumPy包。

1. GCC版本要求

使用较新版本的GCC工具集(尽量不低于v4.7)且集成有gfortran编译器。

备注1:这里大写的"GCC"是指GNU Compiler Collection,它除包含C语言编译器gcc外,还包含很多其它语言的编译器(如g++/gfortran等)

备注2:3.x版的的C语言编译器gcc会由于某些头文件缺失导致编译atlas库报错

备注3:若GCC工具集中没有gfortran编译器,则编译lapack库时会遇到一些莫名其妙的错误(因为lapack是用fortran编写的),好在GCC4.7及以上版本中已经集成了gfortran编译器

在GCC版本符合要求的前提下,临时将其加入环境变量PATH并设置动态库查找路径:

$ export PATH=/home/slvher/tools/gcc48/bin/:$PATH
$ export LD_LIBRARY_PATH=/home/slvher/tools/gcc48/lib64:/home/slvher/tools/gcc48/lib

备注4:在当前shell会话中临时设置LD_LIBRARY_PATH可以保证编译过程中正确搜索到GCC库,但最好不要设置到.bash_profile中,因为那样会影响其它程序的查找路径,可能会踩到坑。

备注5:这里提到的GCC的版本要求及环境变量设置如果没有出差错,那么下面的编译会比较顺利,否则会遇到各种编译/链接问题,后续我会用一篇笔记来记录这些踩坑的过程及遇到这些诡异问题时的分析思路,这里不赘述。

2. 编译LAPACK和ATLAS库

lapack是用fortran开发的经过特别优化的线性代数计算库;atlas也是一个优化过的线性代数计算库,它提供了BLAS库的全部API(包括C接口和Fortran接口),还实现了lapack库中的部分函数,atlas在编译过程中会根据机器的配置参数来调整科学计算函数的参数,以便在该机器上达到更好的计算性能。

初看起来,需要分别编译lapack和atlas两个库,所幸的是,atlas库支持编译时自动编译lapack库,因此,只需正确完成atlas库的编译配置,编译atlas库就可以了。

下面是编译atlas/lapack库的主要步骤。

1) 分别从官网下载lapack源码包和atlas源码包,我下载的是目前的最新版lapack-3.5.0.tgz及atlas3.10.2.tar.bz2

2) 解压atlas源码压缩包:tar -jxvf atlas3.10.2.tar.bz2

3) cd ATLAS && mkdir BLDdir && cd BLDdir

4) 执行configure命令以配置编译参数

$ ../configure --shared -b 64 --prefix=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs --with-netlib-lapack-tarfile=/home/slvher/tools/scikit-learn-virtualenv/dep-libs/lapack-3.5.0.tgz 

其中,--shared表明要编译atlas共享库(configure会自动在编译命令中插入"-fPIC"参数,无需在这里显式指定);--prefix指定编译结果的安装路径;--with-netlib-lapack-tarfile表明编译atlas库时会用相同的编译器及编译/链接参数自动编译lapack库,这里指定lapack源码包的路径后,configure运行后会自动解压lapack源码并将其拷贝至BLDdir/src/lapack/reference/这个目录下。

5) configure运行完后,BLDdir目录下生成了Make.inc文件,该文件中设置了众多编译参数(如查找路径、编译产出路径、编译器、传给编译器的参数,等等),BLDdir子目录下很多模块的Makefile都会include这个Make.inc,包括源码独立的lapack包,可见,这个Make.inc文件可以达到统一编译环境的目的。

6) make build

7) make check

8) make ptcheck

9) make install

如果上述一系列命令均执行成功,那么编译完成的*.a和*.so库会安装到--prefix参数指定的路径下,这些库的头文件也会被拷贝到安装路径下的include目录。

至此,ATLAS和LAPACK库均完成编译,其中LAPACK库是.a静态库,ATLAS库是.so动态库。事实上,ATLAS的动态库中已经包含了LAPACK静态库的所有符号和代码。

下面可以开始编译依赖LAPACK和ATLAS库的NumPy包了。

3. 编译优化版NumPy包

前提:官网下载NumPy源码包并解压,这里以目前最新版numpy-1.9.2.tar.gz为例进行说明。

1) cd至解压目录numpy-1.9.2

2) cp site.cfg.example site.cfg

3) 在site.cfg中配置atlas项,其中include_dirs和library_dirs是atlas库安装路径下的include和lib目录

[atlas]
atlas_libs   = lapack,f77blas,cblas,atlas
library_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib
include_dirs = /home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include

4) python setup.py config

5) python setup.py build --fcompiler=gnu95 ## 指定Fortran编译器为GCC4.8工具集中的gfortran

6) python setup.py install

正常情况下,build成功后,install会把编译产出拷贝到当前python解释器安装路径下的lib/python2.7/site-packages目录中。

此时,可以通过下面的例子来查看NumPy包的配置情况:

>>> import numpy as np
>>> np.__config__.show()
atlas_3_10_blas_threads_info:
    libraries = ['lapack', 'f77blas', 'cblas', 'atlas']
    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
    define_macros = [('HAVE_CBLAS', None), ('ATLAS_INFO', '"\\"3.10.2\\""')]
    language = c
    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
lapack_opt_info:
    libraries = ['tatlas', 'lapack', 'f77blas', 'cblas', 'atlas']
    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
    define_macros = [('ATLAS_INFO', '"\\"3.10.2\\""')]
    language = f77
    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
blas_opt_info:
    libraries = ['lapack', 'f77blas', 'cblas', 'atlas']
    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
    define_macros = [('HAVE_CBLAS', None), ('ATLAS_INFO', '"\\"3.10.2\\""')]
    language = c
    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
openblas_info:
  NOT AVAILABLE
openblas_lapack_info:
  NOT AVAILABLE
atlas_3_10_threads_info:
    libraries = ['tatlas', 'lapack', 'f77blas', 'cblas', 'atlas']
    library_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/lib']
    define_macros = [('ATLAS_INFO', '"\\"3.10.2\\""')]
    language = f77
    include_dirs = ['/home/slvher/tools/scikit-learn-virtualenv/dep-libs/sklearn-libs/include']
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE
mkl_info:
  NOT AVAILABLE

也可以用具体的例子来验证其功能是否正常:

>>> import numpy as np
>>> np.arange(15).reshape(3, 5)
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>>
>>> a = np.arange(15).reshape(3, 5)
>>> a
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])
>>> type(a)
<type 'numpy.ndarray'>
>>>
>>>
>>> from numpy.linalg import *
>>> b = np.array([[1.0, 2.0], [3.0, 4.0]])
>>> b
array([[ 1.,  2.],
       [ 3.,  4.]])
>>> b.transpose()
array([[ 1.,  3.],
       [ 2.,  4.]])
>>> inv(b)
array([[-2. ,  1. ],
       [ 1.5, -0.5]])
>>>

【参考资料】

1. Example: Installing ATLAS with full LAPACK on Linux/AMD64

2. SciPy.org - Building everything from source with gfortran on Ubuntu

3. SciPy.org - Building and installing NumPy

======================= EOF ======================

时间: 2024-10-11 16:06:40

【Python笔记】如何源码编译依赖LAPACK和ATLAS库的NumPy包的相关文章

【Python笔记】如何编译不依赖lapack和atlas库的NumPy包

NumPy是科学计算方面的一个Python库,在数据挖掘或机器学习或科学统计等领域经常被用到,官网在这里. 在实际业务中,为发挥NumPy的高性能,在编译NumPy时会依赖一些经过特别优化的第三方科学计算库.对于初次接触NumPy的新手来说,从源码编译安装依赖外部库的NumPy通常不是一个简单的任务. 事实上,NumPy这个Python包本身不需依赖任何第三方库就能完成编译和安装使用,只不过其计算性能会受到影响. 本篇笔记记录的是如何在不依赖外部库的情况下来编译使用NumPy,这样做为了理清Nu

马哥linux学习笔记:源码编译安装

由于rpm包在作者制作封装的时候已经把程序的一些特性固定了,如果我们根据自己的需求,需要运用程序的一些没有普适性相关特性,就需要下载程序的源码手动编译安装了,这里只是简单的介绍一下C代码的程序包编译安装方法. 为了能更直观的看到源码编译安装的过程,我演示一下在centos7.2环境中编译安装httpd2.2: 首先,编译的前提是得有称手的工具及环境了,编译c源代码就需要用到开发工具,make,gcc了,环境就需要开发库跟头文件了,如果系统中没有这些,就需要yum安装了. 这里我运行yum gro

【原创】源码编译libevent-2.0.21-stable生成库文件说明

按照 README 中的说明,首先执行 configure 下面的输出信息是针对源码编译所在机器进行的检测 [[email protected] libevent-2.0.21-stable]# ./configure checking for a BSD-compatible install... /usr/bin/install -c ... configure: creating ./config.status config.status: creating libevent.pc con

源码编译opencv的安卓Android库

因为项目需要,稍微改了opencv一点源码,这个时候就需要源码编译opencv的库了.我pc机器上面试了没有问题,但是我们项目是跑在移动设备安卓上面的,算法通过jni打包接口供上层java调用,opencv用的安卓版本的,这就坑爹了,没办法,我就编译安卓版本的opencv吧,这里面的坑真多. 参考链接: https://www.jianshu.com/p/925614d6e9e0 OpenCV3.4源码交叉编译android库 https://blog.csdn.net/Martin_chen2

linux下JUCE源码编译依赖库

JUCE 源码https://github.com/julianstorer/JUCE 想在ubuntu下编译需要提前安装以下依赖库 sudo apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-devsudo apt-get install freeglut3-devsudo apt-get install build-essential gdb subversionsudo apt-get install automake

内核源码编译多余出来的lib库文件干啥用的

场景说明:从内核的官网下载2.6.32的内核源码,然后使用make menuconfig指令,配置内核,使用make module的过程中,会在/lib/module下生成2.6.32的文件夹 ,将某些驱动以模块的方式存在在这个目录下,但是很遗憾,机器上的内核版本是2.6.32.431,我非常好奇的就是这是啥门子的内核版本, 如何是好啊,所以在实际的目录下/lib/module下还有一个2.6.32.431的文件夹,很明显,如果这个时候生成,如果我执行make install指令,会产生什么惊天

[笔记]Android 源码编译

问题: 解决方法: 下载地址ftp://ftp.gnu.org/gnu/make/make3.8.2的安装步骤:tar -zxvf make3.8.2.tar.gz在make-3.8.2目录下./configuremakemake install一般情况下不会出现错误,在/usr/local/bin中可得到新版本的make,复制到/usr/bin中即可 直接sudo apt-get install bison即可

源码编译LNMP环境

  一.环境准备: 1.部署LNMP架构需要安装依赖包 yum -y install make gcc gcc-c++ flex bison file libtool libtool-libs autoconf kernel-devel libjpeg libjpeg-devel libpng libpng-devel gd freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glib2 glib2-devel bzip2

源码编译安装Mysql5.7版本

1.源码编译安装mysql(5.7版本) 下载地址: https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-boost-5.7.18.tar.gz #(MySQL从5.7版本之后,boost是必须的,建议把系统自带的boost库卸载,源码编译安装高版本 Boost库是为C++语言标准库提供扩展的一些C++程序库的总称) (1)环境准备: [[email protected] ~]# ls mysql-boost-5.7.18.tar.gz  nginx