在Linux上从源代码构建¶
一般说明¶
要从源代码构建NumPy/SciPy,请获取 source package ,将其解包,然后执行以下操作:
python setup.py install --user # installs to your home directory
或
python setup.py build
python setup.py install --prefix=$HOME/local
在构建之前,您还需要安装NumPy和SciPy所依赖的软件包
BLAS和LAPACK库(可选,但强烈建议用于NumPy,对于SciPy是必需的):通常 ATLAS + OpenBLAS ,或 MKL 。
C和Fortran编译器(通常
gcc
和gfortran
)。Python头文件(通常是名为
python3-dev
或python3-devel
)
通常,您需要从您的Linux发行版提供的包中安装以上所有内容,因为自己构建它们很复杂。如果您需要使用特定的BLAS/LAPACK库,您可以这样做
export BLAS=/path/to/libblas.so
export LAPACK=/path/to/liblapack.so
export ATLAS=/path/to/libatlas.so
python setup.py ............
这个 Cython 和 Pythran 预编译器也是必要的,因为这是必要的。
pybind11
。建议将这些软件包与一起安装pip
或conda
,因为您可能(甚至很可能)需要这些软件包的更新版本,而不是Linux发行版中提供的版本。
在下面,您将找到许多主要Linux发行版的其他安装说明和建议。
具体说明¶
Debian/Ubuntu¶
要从源代码构建,需要以下软件包:
sudo apt-get install gcc gfortran python3-dev libopenblas-dev liblapack-dev
要自定义使用的BLAS,您可以设置 site.cfg 文件。请参阅 site.cfg.example 您可以设置的选项的numpy源代码中的文件。
请注意,Debian和Ubuntu包以可交换的方式优化了BLAS库。您可以安装库,如ATLAS或OpenBLAS,并更改通过替代机制使用的默认库:
$ sudo apt-get install libopenblas-base libatlas3-base
$ update-alternatives --list libblas.so.3
/usr/lib/atlas-base/atlas/libblas.so.3
/usr/lib/libblas/libblas.so.3
/usr/lib/openblas-base/libopenblas.so.0
$ sudo update-alternatives --set libblas.so.3 /usr/lib/openblas-base/libopenblas.so.0
有关如何为特定CPU构建优化的ATLAS包的说明,请参阅/usr/share/doc/libatlas3-base/readme.debian。打包的OpenBLAS在运行时选择最佳代码,因此不需要重新编译,除非打包的版本还不支持使用的CPU。
您也可以使用自己通过预加载构建的库。这不需要管理员权限。
LD_PRELOAD=/path/to/libatlas.so.3 ./my-application
软呢帽26¶
要安装Scipy内部版本要求,您可以执行以下操作:
sudo dnf install gcc-gfortran python3-devel openblas-devel lapack-devel
英特尔C编译器与MKL¶
英特尔MKL 11.0(2012年12月更新)¶
考虑到Linux上与英特尔®Composer XE SP1版本捆绑在一起的英特尔®MKL的默认安装路径,将以下行添加到顶级NumPy目录中的site.cfg,以使用用于英特尔®64(或更早的em64T)体系结构的英特尔®MKL:
[mkl]
library_dirs = /opt/intel/composer_xe_2013/mkl/lib/intel64
include_dirs = /opt/intel/composer_xe_2013/mkl/include
mkl_libs = mkl_intel_lp64,mkl_intel_thread,mkl_core
如果您正在构建32位的NumPy,请添加如下内容
[mkl]
library_dirs = /opt/intel/composer_xe_2013/mkl/lib/ia32
include_dirs = /opt/intel/composer_xe_2013/mkl/include
mkl_libs = mkl_intel,mkl_intel_thread,mkl_core
除了上述英特尔®MKL的分层链接方法,您还可以使用动态接口库mkl_rt.lib。因此,对于ia32和intel64体系结构,进行如下更改
mkl_libs = mkl_rt
将numpy/numpy/distutils/intelcpiler.py中的cc_exe修改为如下所示:
cc_exe = 'icc -O2 -g -openmp -avx'
这里,我们使用基于英特尔®沙桥架构(-AVX)的英特尔®至强E5或E3系列的默认优化(-O2)、OpenMP线程(-openmp)和英特尔®AVX优化。有关特定于处理器的选项的详细信息,请运行ICC--help。
使用英特尔编译器编译并安装NumPy(在64位平台上,将“intel”替换为“intelem”):
python setup.py config --compiler=intel build_clib --compiler=intel build_ext --compiler=intel install
使用英特尔编译器编译并安装SciPy(在64位平台上,将“intel”替换为“intelem”):
python setup.py config --compiler=intel --fcompiler=intel build_clib --compiler=intel --fcompiler=intel build_ext --compiler=intel --fcompiler=intel install
您必须将LD_LIBRARY_PATH设置为英特尔®MKL库(精确值取决于您的体系结构、编译器和库版本)和OpenMP库,NumPy才能工作。如果您为英特尔®64平台构建NumPy:
$export LD_LIBRARY_PATH=/opt/intel/composer_xe_2013/mkl/lib/intel64: /opt/intel/composer_xe_2013/compiler/lib/intel64:$LD_LIBRARY_PATH
如果为ia32位平台构建NumPy:
$export LD_LIBRARY_PATH=/opt/intel/composer_xe_2013/mkl/lib/ia32: /opt/intel/composer_xe_2013/compiler/lib/ia32:$LD_LIBRARY_PATH
Fortran ABI不匹配¶
一些线性代数库是用G77ABI构建的,而另一些线性代数库是用GFortran ABI构建的,这两个ABI是不兼容的。因此,如果您使用 gfortran 并链接到一个线性代数库,比如MKL,它是用G77ABI构建的,那么就会出现异常或段错误。SciPy通过将CBLAS API用于BLAS API中受此问题影响的几个函数来修复此问题。
请注意,SciPy需要在构建时知道需要做什么,构建系统将自动检查线性代数库是否为MKL,如果是,则使用CBLAS API而不是BLAS API。如果自动检测失败或用户想要覆盖此自动检测机制,请设置环境变量 SCIPY_USE_G77_ABI_WRAPPER 设置为0或1可使用CBLAS API禁用或启用。