2012-12-19 48 views
2

我試圖連接一個程序,它本質上是相當複雜的:的Python-C++中的鏈接英特爾MKL - C-Fortran 2003的程序

  • 開發和Linux下Fedora的運行
  • Fortran語言編寫的2003
  • 主代碼是在很大程度上依賴於Intel的MKL庫和小件的ANSI C代碼
  • 它已丙
  • 的C++接口是從蟒經由Boost.Python的訪問++接口(使用ISO_C_BINDING)

在運行時,我得到了下面的文本程序停止

MKL FATAL ERROR: Cannot load neither libmkl_avx.so nor libmkl_def.so 

之後。

我已檢查這兩個libmkl_avx.solibmkl_def.so$LD_LIBRARY_PATH

最終因此鏈接通過:

g++ -g3 -shared -Wl,-soname,libFrrBoost_rt.so interfejs.o t83.o gen_random2.o 
-L/opt/intel/composerxe/mkl/lib/intel64 -lpython2.7 -lifport -lifcore -lboost_python  
-Wl,--start-group -lmkl_sequential -lmkl_intel_lp64 -lmkl_core -Wl,--end-group 
-o libFrrBoost_rt.so 

libFrrBoost是運行python t83.py被鏈接的模塊,然後

(以當準備二進制文件時,特定的鏈接器不會發出抱怨)導入模塊libFrrBoost會導致錯誤。

嘗試谷歌。我發現的所有信息均與C/Fortran編寫的「常用程序」相關,並且僅包含英特爾的MKL。我能夠毫無問題地運行這類程序。我認爲Makefile中鏈接行的MKL部分在兩種情況下都是等價的,但是必須存在隱藏的奧祕。這個問題通常是壞的鏈接 - 我沒有看到適用(庫是完全按照Intel的手冊 - 接口,線程和計算庫是非常標準)

使用編譯器:

ifort 12.1.0,ICPC 12.1.0,蟒蛇的Python 2.7.1,

我已經運行了strace的ICC 12.1.0(在小C段還呼籲MKL,但)

EDIT(由於Hirsto伊利耶夫的評論)通過這種方式:strace python t83.py;其結果是(grepping libmkl後:

open("/opt/intel/composer_xe_2011_sp1.7.256/mkl/lib/intel64/libmkl_avx.so", O_RDONLY) = 3 
open("/usr/bin/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/opt/slurm-2.2.5/lib/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/opt/intel/composer_xe_2011_sp1.7.256/compiler/lib/intel64/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/opt/intel/composer_xe_2011_sp1.7.256/debugger/lib/intel64/libmkl_avx.so", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/opt/intel/composer_xe_2011_sp1.7.256/mkl/lib/intel64/libmkl_avx.so", O_RDONLY) = 3 

我明白,開放規格是在here的,尤其是3,4是積極的,表明開放已經找到了文件,並賦予其文件discriptors我已經驗證文件確實在那個地方存在

也這是「好」英特爾編譯器的目錄:

[email protected]:~/prog/FoCpy3 $ which ifort 
/opt/intel/composer_xe_2011_sp1.7.256/bin/intel64/ifort 

所以版本是相同的 - aparently它不是一個版本的問題。

libmkl_def.so的一切都是一樣的。

免責聲明:雖然我可能聽起來對自己寫的內容充滿信心,但我不是。每個句子都應該以「如果我沒有弄錯」開頭。

+1

用'strace -f -e trace = file -o trace.out ./program args ...'跟蹤你的程序,然後在'trace.out'中grep for libmkl_def'來查看dlopen )'實際上是在尋找它。 –

+0

親切!我不知道這個命令。但結果不盡人意。我將編輯主文章並在那裏回答,因爲我需要更多空間和更多格式選項而不是評論。 – Lacek

+0

請採取一些專業意見 - http://software.intel.com/sites/products/mkl/ - 已經幫助我多出一次 –

回答

4

看來解決方案是鏈接-lmkl_rt而不是-lmkl_sequential -lmkl_intel_lp64 -lmkl_core。我不明白爲什麼要給予其他優勢。我很困惑,但它的工作(迄今)。

編輯 英特爾人聲稱這是MKL庫的bug。

+0

mkl_rt是一個包裝庫,它爲您的平臺提供了適當的mkl_whatever。您應該始終鏈接到mkl_rt,而不是特定的mkl_whatever。 –

+0

我看到很多相關的問題/答案,但這個答案只能解決這個問題。 – emeth

8

對我來說,解決方案的intel site作品提出了很好

export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_sequential.so 

這似乎是某種錯誤的。

+0

+1,當我發現這個錯誤使用intel編譯的python numpy/scipy針對mkl庫構建時也爲我工作。 – innisfree

+0

'locate mkl'會顯示你的位置,如果它沒有安裝在默認位置 – jeremycg

相關問題