在Python中调用Pardiso 6

问题描述 投票:1回答:2

我正在尝试在Python中使用Pardiso 6稀疏求解器库。问题是我似乎无法加载Pardiso共享库(SO)。这是我打电话时遇到的错误

import ctypes
pardiso = ctypes.CDLL(pardiso_so_address)
Traceback (most recent call last):
  File "test.py", line 27, in <module>
    pardiso = ctypes.CDLL(lib720)
  File "/home/amin/anaconda3/envs/idp/lib/python3.7/ctypes/__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./libpardiso600-GNU720-X86-64.so: undefined symbol: sgetrf_

如果有人能对此有所了解,我将非常感激。


PS。我已经联系了Pardiso开发人员,他们告诉我我需要链接优化的BLAS,但是我已经通过conda安装了MKL。


Update 1:我通过mkl安装了conda,但没有帮助。奇怪的是,我在标题中添加了import scipy,错误消失了。如果添加import mkl,也会发生相同的情况。因此,由于某种原因,除非手动导入scipymkl,否则.so不知道存在lapack安装。无论如何,现在引发了另一个错误,我认为可能与libgfortran库有关。这是错误

Traceback (most recent call last):
  File "test.py", line 34, in <module>
    pardiso = ctypes.CDLL(lib720)
  File "/home/amin/anaconda3/envs/test/lib/python3.7/ctypes/__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: ./libpardiso600-GNU720-X86-64.so: undefined symbol: _gfortran_st_close

我仔细检查了是否安装了libgfortran,并且确实是:

(test) PyPardisoProject$ ldconfig -p | grep libgfortran
    libgfortran.so.5 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgfortran.so.5
    libgfortran.so.4 (libc6,x86-64) => /lib/x86_64-linux-gnu/libgfortran.so.4

[我认为类似的事情可能正在发挥作用,即库在那里,但需要触发(类似于import scipy似乎对liblapack所做的事情,但我不知道如何触发它。] >

[Note

:我在Pardiso网站上的C语言中找到一个示例,并通过]针对它测试了.so文件
$ gcc pardiso_sym.c -o pardiso_sym -L . -lpardiso600-GNU720-X86-64 -llapack -fopenmp -lgfortran
$ OMP_NUM_THREADS=1 ./pardiso_sym 

并且它可以正常工作(使用我的计算机上的现有库)。因此,.so起作用了,只是我不知道如何通知它在Python中的依赖关系。

更新2

:这是ldd pardiso_sym的输出:
Scripts$ ldd pardiso_sym
    linux-vdso.so.1 (0x00007ffe7e982000)
    libpardiso600-GNU720-X86-64.so (0x00007f326802d000)
    liblapack.so.3 => /lib/x86_64-linux-gnu/liblapack.so.3 (0x00007f3267976000)
    libgfortran.so.4 => /lib/x86_64-linux-gnu/libgfortran.so.4 (0x00007f3267795000)
    libgomp.so.1 => /lib/x86_64-linux-gnu/libgomp.so.1 (0x00007f326775b000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3267568000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f3267545000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f32673f6000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f32685df000)
    libblas.so.3 => /lib/x86_64-linux-gnu/libblas.so.3 (0x00007f3267389000)
    libgfortran.so.5 => /lib/x86_64-linux-gnu/libgfortran.so.5 (0x00007f32670e9000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f32670cf000)
    libquadmath.so.0 => /lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007f3267083000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f326707d000)

因此,我在/lib/x86_64-linux-gnu中添加了通用路径,即/lib64PATH,并通过以下方式再次运行Python脚本:

PATH=$PATH:/lib/x86_64-linux-gnu:/lib64 python padiso_script.py

但是会引发相同的错误。我也尝试过添加到LD_LIBRARY_PATH,但是也没有用。

我正在尝试在Python中使用Pardiso 6稀疏求解器库。问题是我似乎无法加载Pardiso共享库(SO)。这是调用import ctypes pardiso = ...

python ctypes blas intel-mkl pardiso
2个回答
1
投票

[Pardiso 6 sparse solver至少依赖于Lapack函数sgetrf,该函数使用具有行互换的部分数据透视来计算通用M×N矩阵A的LU分解。

根据我们的阅读,sgetrf与共享的Lapack库动态链接。您需要提供一个包含一个实现的PATH。


0
投票

Pardiso 6和Intel MKL Pardiso不兼容,因为它们具有不同的API。您可以尝试从系统路径中删除MKL,添加OpenBLAS,然后尝试再次链接您的示例。

© www.soinside.com 2019 - 2024. All rights reserved.