Numpy multiarray.so:未定义的符号:cblas_sgemm

时间:2016-01-05 19:28:59

标签: python numpy opensuse blas atlas

我尝试根据numpy==1.10.2在服务器上安装scipymatplotlibopensuse。 我已经numpyvirtualenv安装了numpy(我也尝试了点数 - 当然也是同样的结果)。现在,当我尝试在python控制台中导入ImportError: /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so: undefined symbol: cblas_sgemm 时,我收到了以下错误:

ldd /home/user/.virtualenvs/project/lib/python2.7/site-packages/numpy/core/multiarray.so`
linux-vdso.so.1 (0x00007fffa0d69000)
libtatlas.so.3 => /home/user/.local/usr/lib64/atlas/libtatlas.so.3 (0x00007fe366d66000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe366a50000)
libpython2.7.so.1.0 => /usr/lib64/libpython2.7.so.1.0 (0x00007fe3666b2000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe366496000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe3660f0000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe367a15000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe365eec000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007fe365ce9000)

注意:我不是此服务器上的超级用户。

编辑:

libtatlas.so.3 => /home/user/.local/usr/lib64/atlas/libtatlas.so.3

ImportError: /usr/lib64/atlas/libtatlas.so.3: undefined symbol: clapack_ilaenv - 由于libatlas的其他问题,我将此链接起来: numpy

SOLLUTION

问题在于ATLAS lib。根据@ali_m的建议,我使用OpenBLAS而不是ATLAS从源代码安装了job.setOutputKeyClass(IntWritable.class); job.setOutputValueClass(IntWritable.class); Here link to instruction how to install numpy with BLAS.

1 个答案:

答案 0 :(得分:5)

正如您在上面的评论中提到的,您从RPM包中提取libtatlas.so.3并将其复制到本地目录中,而不是从源代码构建它或通过包管理器安装它。我确信这是问题的原因。

特别是clapack_*cblas_*符号似乎未在libtatlas.so.3中定义。在我的Ubuntu机器上,如果我sudo apt-get install libatlas-base-dev我得到两个不同的共享库:

~$ ldconfig -p | grep atlas
        liblapack_atlas.so.3 (libc6,x86-64) => /usr/lib/liblapack_atlas.so.3
        liblapack_atlas.so (libc6,x86-64) => /usr/lib/liblapack_atlas.so
        libatlas.so.3 (libc6,x86-64) => /usr/lib/libatlas.so.3
        libatlas.so (libc6,x86-64) => /usr/lib/libatlas.so

clapack_*cgemm_*符号在liblapack_atlas.so.3而不是libatlas_so.3中定义:

~$ nm -D /usr/lib/libatlas.so.3 | grep clapack_ilaenv

~$ nm -D /usr/lib/libatlas.so.3 | grep cblas_sgemm

~$ nm -D /usr/lib/liblapack_atlas.so.3 | grep clapack_ilaenv
0000000000041d90 T clapack_ilaenv

~$ nm -D /usr/lib/liblapack_atlas.so.3 | grep cblas_sgemm
                 U cblas_sgemm

鉴于您没有管理员权限,因此无法通过普通系统包管理器安装ATLAS,以下是三种可能的解决方案:

  • 可能可以从不同的RPM包中提取liblapack_atlas.so.3的二进制文件(或者与OpenSUSE等价的任何东西),并通过修改{{{n}来链接它。 1}} numpy源目录中的文件。
  • 另一种选择是build ATLAS from source,但根据我的经验,这是一个漫长而痛苦的过程。
  • 我的个人建议是改为构建OpenBLAS,如我之前的回答here所述。编译起来要容易得多,而且到目前为止我遇到的每个基准测试都有更好的性能。