构建配置

构建配置

我想在我没有 root (或 sudo)权限的远程(Debian squeeze)系统上安装某个(非公开的、数字的)python 模块。由于未安装 python-dev 包,我编译并本地安装了 python 2.7(使用 ./configure --prefix=$HOME/rt)。我同样使用 setup.py 的 --user 选项安装了 numpy、scipy 和 tinyarray,因为这些是必需的。后来我安装了该模块,没有出现任何问题。但是,在 python 中导入模块后,我收到以下消息:

RuntimeWarning:安装的 SciPy 不使用 UMFPACK。相反,SciPy 将使用它附带的 SuperLu 版本。在这种情况下,性能可能会非常差。

事实上,表现很差。经过进一步研究发现该模块支持使用 umfpack 和 MUMPS。两者都可以接受,但在不同的系统上,我发现 MUMPS 的性能稍好一些。我安装也没有成功。关于 umfpack,除了似乎不再存在的 scipy 的 scipack 之外,我没有找到任何有关如何安装它的信息。

所以我尝试安装 MUMPS。

从模块的安装文件:

构建配置

安装脚本必须知道如何链接 LAPACK 和 BLAS,以及可选的 MUMPS。默认情况下,它会假设 LAPACK 和 BLAS 可以在它们常用的名称下找到。默认情况下,MUMPS 不会被链接,除非在libmumps-scotch-dev安装软件包时在基于 Debian 的系统上。

build.conf所有这些设置都可以通过在发行版根目录中创建/编辑文件来配置 。该配置文件由多个部分组成,每个依赖项对应一个部分,由 [dependency-name] 标头引导,后跟 name = value 条目。可能的名称是关键字参数distutils.core.Extension(有关完整列表,请参阅从this document <http://docs.python.org/distutils/apiref.html>_ 顶部开始的第三个表)。相应的值是以空格分隔的字符串列表。

当前可能的两个部分是 [lapack] 和 [mumps]。前者配置针对 LAPACK 的链接BLAS,后者对抗 MUMPS(没有 LAPACK 和 BLAS)。

build.conf链接自编译 MUMPS、SCOTCH <http://www.labri.fr/perso/pelegrin/scotch/>_ 和METIS <http://glaros.dtc.umn.edu/gkhome/metis/metis/overview>_的示例::

[mumps]
libraries = zmumps mumps_common pord metis esmumps scotch scotcherr mpiseq
    gfortran

与 Intel MKL 链接的示例build.conf.::

[lapack]
libraries = mkl_intel_lp64 mkl_sequential mkl_core mkl_def
library_dirs = /opt/intel/mkl/lib/intel64
extra_link_args = -Wl,-rpath=/opt/intel/mkl/lib/intel64

详细语法build.confdocumentation of Python's configparser module <http://docs.python.org/3/library/configparser.html#supported-ini-file-structure>_.

我编译了 MUMPS 并重建了模块,使用如下的 build.conf:

   [mumps]
   libraries = zmumps mumps_common pord
   library_dirs = /*path_to_mumps_compilation*/lib /*path_to_mumps_compilation*/libseq
   include_dirs = /*path_to_mumps_compilation*/include
   extra_link_args = -Wl,-rpath=/*path_to_mumps_compilation*/lib

重新安装模块并在 python 中导入后,出现导入错误:

/*path_to*/_mumps.so: 未定义符号: mumps_get_mapping

在检查 _mumps.so 后,似乎该符号确实未定义。这是安装过程中使用的 _mumps.so 的链接命令:

    gcc -pthread -shared build/temp.linux-i686-2.7/kwant/linalg/_mumps.o -L/u/fphys/iw386/rt/lib -lmumps_common -lzmumps -lpord -lmetis -lesmumps -lscotch -lscotcherr -lmpiseq -llapack -lblas -o build/lib.linux-i686-2.7/kwant/linalg/_mumps.so -Wl,-rpath=/u/fphys/iw386/rt/lib

请注意,mumps_common 已加载,并且 mumps_get_mapping 在 libmumps_common.a 中未定义:

    $ nm -g rt/lib/libmumps_common.a |grep mumps_get_mapping
    00000000 T mumps_get_mapping

我不太清楚什么是“暂定符号”。这是否也意味着未定义?

然后,我还尝试通过从源代码构建 scotch 和 metis 来安装它们(如安装文件中的示例中所建议的那样)并使用此 build.conf:

    [mumps]
     libraries = zmumps mumps_common pord metis esmumps scotch scotcherr mpiseq gfortran
     library_dirs = /u/fphys/iw386/rt/lib
     include_dirs = /u/fphys/iw386/rt/include
     extra_link_args = -Wl,-rpath=/u/fphys/iw386/rt/lib

其中所有库已移至 /u/fphys/iw386/rt/lib ,所有头文件已移至 /u/fphys/iw386/rt/include

导入时的错误消息现已更改为

_mumps.so:未定义符号:for_write_seq_lis

for_write_seq_lis似乎是一个与fortran相关的方法。然而,我使用的gfortran库文件是系统通过gfortran包提供的。我宁愿避免尝试从源代码构建 gfortran 和 gcc 及其依赖项。

任何帮助,将不胜感激。

相关内容