首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ATLAS/LAPACK支持构建numpy

使用ATLAS/LAPACK支持构建numpy
EN

Stack Overflow用户
提问于 2019-07-23 18:03:09
回答 4查看 1.2K关注 0票数 19

为了获得对ATLAS/LAPACK例程的支持,我试图编译numpy v1.12。

问题

我用于编译的设置似乎无法将ATLAS/LAPACK库引入numpy

安装程序

在我正在处理的主机(计算集群)上,我没有管理权限。

但是,节点通过GNU模块提供对gcc 4.7.2和5.3.0、glibc 2.17和2.22以及ATLAS/LAPACK库和头v3.10.2的访问。

出于兼容性原因,我正在使用一个包含Python2.7.16的虚拟环境。同样,出于同样的原因,我正在安装一个旧版本的numpy。如果一切顺利,我可能会探索更新版本的numpy,但此时,这正是我正在使用的。

我的numpy源目录有一个名为site.cfg的配置文件,其中包括以下指令:

代码语言:javascript
复制
[ALL]
library_dirs = /usr/local/lib:/net/module/sw/glibc/2.22/lib64:/net/module/sw/atlas-lapack/3.10.2/lib
include_dirs = /usr/local/include:/net/module/sw/glibc/2.22/include:/net/module/sw/atlas-lapack/3.10.2/include

[atlas]
libraries = lapack,f77blas,cblas,atlas
library_dirs = /net/module/sw/atlas-lapack/3.10.2/lib
include_dirs = /net/module/sw/atlas-lapack/3.10.2/include

我正在通过以下命令编译numpy

代码语言:javascript
复制
$ CFLAGS="${CFLAGS} -std=c99 -fPIC" LDFLAGS="-L/home/areynolds/.conda/envs/genotyping_environment/lib -Wl,-rpath=/home/areynolds/.conda/envs/genotyping_environment/lib -Wl,--no-as-needed -Wl,--sysroot=/,-L/net/module/sw/glibc/2.22/lib64" python setup.py build --fcompiler=gnu95

我使用--fcompiler=gnu95作为用GNU编译的ATLAS/LAPACK库。我正在重写CFLAGSLDFLAGS变量,以便GCC工具包能够正确编译和链接。

问题

编译后,我对numpy库进行测试,以查看通过一种方法安装了什么:

代码语言:javascript
复制
$ python
...
>>> import numpy.distutils.system_info as sysinfo
>>> sysinfo.get_info('atlas')
ATLAS version 3.10.2 built by root on Wed Jun  1 15:39:08 PDT 2016:
    UNAME    : Linux module0.altiusinstitute.org 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    INSTFLG  : -1 0 -a 1 -l 1
    ARCHDEFS : -DATL_OS_Linux -DATL_ARCH_UNKNOWNx86 -DATL_CPUMHZ=2876 -DATL_AVXMAC -DATL_AVX -DATL_SSE3 -DATL_SSE2 -DATL_SSE1 -DATL_USE64BITS -DATL_GAS_x8664
    F2CDEFS  : -DAdd_ -DF77_INTEGER=int -DStringSunStyle
    CACHEEDGE: 229376
    F77      : /net/module/sw/gcc/5.3.0/bin/gfortran, version GNU Fortran (GCC) 5.3.0
    F77FLAGS : -O -mavx2 -mfma -m64 -fPIC
    SMC      : /usr/bin/x86_64-redhat-linux-gcc, version x86_64-redhat-linux-gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
    SMCFLAGS : -O -fomit-frame-pointer -mavx2 -mfma -m64 -fPIC
    SKC      : /usr/bin/x86_64-redhat-linux-gcc, version x86_64-redhat-linux-gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
    SKCFLAGS : -O -fomit-frame-pointer -mavx2 -mfma -m64 -fPIC                                                                                                                                                    
    {'libraries': ['lapack', 'f77blas', 'cblas', 'atlas', 'f77blas', 'cblas'], 'library_dirs': ['/net/module/sw/atlas-lapack/3.10.2/lib'], 'define_macros': [('ATLAS_INFO', '"\\"3.10.2\\""')], 'language': 'f77', 'include_dirs': ['/net/module/sw/atlas-lapack/3.10.2/include']}

看上去还好吧?

但是当我通过另一种方法检查时,我得到了一个不同的答案:

代码语言:javascript
复制
>>> np.show_config()
lapack_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blas_opt_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
openblas_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
blis_info:
  NOT AVAILABLE
openblas_lapack_info:
    libraries = ['openblas', 'openblas']
    library_dirs = ['/usr/local/lib']
    define_macros = [('HAVE_CBLAS', None)]
    language = c
lapack_mkl_info:
  NOT AVAILABLE
blas_mkl_info:
  NOT AVAILABLE

尽管在site.cfg中描述了手动设置,但没有提到ATLAS,LAPACK显然也没有指向正确的模块目录(/net/module/sw/atlas-lapack/3.10.2)。

我如何正确地将对ATLAS/LAPACK的支持编译成numpy,或者真正地测试我是否有一个集成到numpy中的工作ATLAS/LAPACK设置,这给了我一个一致(且可靠)的答案?

EN

回答 4

Stack Overflow用户

发布于 2019-12-17 19:58:48

一个正交的建议,但它可能是有益的一般,不只是针对您的特殊问题。

看看斯派克。它是一个从源构建包的包管理器。这是一个非常有趣和有希望的项目,它允许您只需几步就可以构建各种各样的库/软件。

我刚刚检查过,py-numpy是一个受支持的包(即spack list numpy)。如果您想使用默认选项进行安装(使用spack info py-numpy检查它们),您只需使用一个简单的spack install py-numpy安装它,它将与missig依赖项一起构建。

如果您想要更改某些东西,例如您可能希望使用特定的实现或版本的BLAS/LAPACK,您可以很容易地指定想要的依赖项(即spack install py-numpy ^openblas)。

我可以向你保证,它会给你很多次的头痛,给我很多次。我在我工作的HPC上和我的本地机器上都使用它。

我刚刚向您展示了一些命令,但我只是简单地说明了您可以轻松地使用它做的事情(您可以使用不同的BLAS实现构建多个numpy变体,或者使用不同的选项创建相同的实现,或者.如果我建议你开始看“规范语法”)。

票数 1
EN

Stack Overflow用户

发布于 2019-07-31 00:43:47

BLAS/LAPACK是numpy的可选依赖项。因此,根据您想要做的事情,您可以完全不使用ATLAS。

如果您想确保您的numpy是针对正确的库编译的,我将在Python之外对编译好的库使用ldd

我使用的是最新的numpy和Python3.7,所以文件名对您来说是不同的。

代码语言:javascript
复制
> cd <numpy_dir>
> find . -name "*.so"

./core/_dummy.cpython-37m-darwin.so
./core/_multiarray_tests.cpython-37m-darwin.so
./core/_multiarray_umath.cpython-37m-darwin.so
./core/_operand_flag_tests.cpython-37m-darwin.so
./core/_rational_tests.cpython-37m-darwin.so
./core/_struct_ufunc_tests.cpython-37m-darwin.so
./core/_umath_tests.cpython-37m-darwin.so
./fft/fftpack_lite.cpython-37m-darwin.so
./linalg/_umath_linalg.cpython-37m-darwin.so
./linalg/lapack_lite.cpython-37m-darwin.so
./random/mtrand.cpython-37m-darwin.so

然后,我在每个文件上运行ldd (因为我在macOS上使用了otool -L )。以下3个文件是针对BLAS库编译的。

代码语言:javascript
复制
core/_multiarray_umath.cpython-37m-darwin.so
linalg/_umath_linalg.cpython-37m-darwin.so
linalg/lapack_lite.cpython-37m-darwin.so
票数 0
EN

Stack Overflow用户

发布于 2019-11-18 18:11:06

我是用numpy 1.11.1 (这意味着我的回答在你的情况下可能不是100%的准确)做的,下面的收件如下:

代码语言:javascript
复制
export ATLAS=<folder with the atlas/lapack libraries>
export LAPACK=$ATLAS
cat > site.cfg <<EOF
[atlas]
atlas_libs = lapack, f77blas, cblas, atlas
EOF
python setup.py bdist_wheel
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57169862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档