在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编译器(通常 gccgfortran )。

  • Python头文件(通常是名为 python3-devpython3-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 ............
  • 这个 CythonPythran 预编译器也是必要的,因为这是必要的。 pybind11 。建议将这些软件包与一起安装 pipconda ,因为您可能(甚至很可能)需要这些软件包的更新版本,而不是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禁用或启用。