亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 Python 中調用 Pardiso 6

在 Python 中調用 Pardiso 6

慕虎7371278 2022-11-01 15:14:48
我正在嘗試在 Python 中使用 Pardiso 6 稀疏求解器庫。問題是我似乎無法加載 Pardiso 共享對象 (SO)。這是我打電話時遇到的錯誤import ctypespardiso = 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.更新1:我mkl通過安裝conda,但沒有幫助。奇怪的是,我添加import scipy到標題中并且錯誤消失了。如果我添加import mkl. 因此,出于某種原因,除非scipy或mkl手動導入,否則.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,但我不知道如何觸發它。注意:我在 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:因此,我添加了公共路徑,即/lib/x86_64-linux-gnu和/lib64toPATH并通過以下方式再次運行 Python 腳本:PATH=$PATH:/lib/x86_64-linux-gnu:/lib64 python padiso_script.py但同樣的錯誤被拋出。我也嘗試添加LD_LIBRARY_PATH,但也沒有工作。
查看完整描述

3 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

Pardiso 6 sparse solver至少取決于 Lapack 函數sgetrf,該函數使用帶有行交換的部分旋轉來計算一般 M×N 矩陣 A 的 LU 分解。

從我們閱讀的內容來看,libpardiso600-GNU720-X86-64.so它與共享的 Lapack 庫動態鏈接。您需要提供一個包含一個實現的 PATH。

在啟動 Python 之前,我建議您使用LD_LIBRARY_PATH并包含您正在使用的 BLAS/Lapack 庫的路徑。它可以是 netlib 實現、ATLAS 實現或 MKL 實現。

LD_LIRARY_PATH=$LD_LIRARY_PATH:/my_path_to_lapack \python -c"import ctypes; pardiso = ctypes.CDLL(pardiso_so_address)"

如果你使用conda,你可以用命令安裝

conda install -c anaconda mkl

在這種情況下,安裝可能會直接解決問題。


查看完整回答
反對 回復 2022-11-01
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

PATH訣竅是,您需要在加載 Pardiso 庫之前在 Python 腳本中顯式加載依賴項,即lapack,blas和,而不是將依賴項的位置添加到 system 。gfortran此外,您必須將可選mode=ctypes.RLTD_GLOBAL參數顯式傳遞給ctypes.CDLL方法,以使依賴項全局可訪問,因此 Pardiso 可以訪問它們。


import ctypes

import ctypes.util


shared_libs = ["lapack", "blas", "omp", "gfortran"]

for lib in shared_libs:

    # Fetch the proper name of the dependency

    libname = ctypes.util.find_library(lib)

    # Load the dependency and make it globally accessible

    ctypes.CDLL(libname, mode=ctypes.RTLD_GLOBAL)

# Finally, load the Pardiso library

pardiso = ctypes.CDLL(pardiso_so_address)

以我的經驗,如果您在已安裝的conda環境中mkl,您只需將其gfortran列為依賴項,其余的將自動加載和訪問,在這種情況下 set shared_libs = ["gfortran"].


查看完整回答
反對 回復 2022-11-01
?
幕布斯7119047

TA貢獻1794條經驗 獲得超8個贊

Pardiso 6 和 Intel MKL Pardiso 不兼容,因為它們具有不同的 API。您可以嘗試從系統路徑中刪除 MKL,添加 OpenBLAS,然后再次嘗試鏈接您的示例。



查看完整回答
反對 回復 2022-11-01
  • 3 回答
  • 0 關注
  • 270 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號