在Python-C ++中链接英特尔MKL - C-Fortran 2003程序

时间:2012-12-19 11:56:23

标签: c++ python boost fortran intel-mkl

我正在尝试链接一个自然相当复杂的程序:

  • 在Linux Fedora下开发并运行
  • 在fortran 2003中编写的主要代码严重依赖于英特尔的MKL库和小块的ANSI C代码
  • 它有C ++接口(使用iso_c_binding)
  • 通过boost.python
  • 从python访问c ++接口

在运行期间,我得到以下文字

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部分在两种情况下都是等价的,但必定存在一个隐藏的谜团。问题通常是链接错误 - 我认为不适用(库与英特尔手册完全相同 - 接口,线程和计算库非常标准)

二手编译器:

ifort 12.1.0,icpc 12.1.0,python Python 2.7.1,icc 12.1.0(小C片段也调用MKL,但是)

编辑(由于Hirsto Iliev的评论)

我以这种方式运行strace:strace python t83.py;结果是(在点击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

我理解open的规范与here中的一样,特别是3,4为正数,表明open已找到一个文件并为其分配文件discriptors。我已经验证该文件确实存在于那个地方。

这也是“好”的英特尔编译器目录:

czeslaw@stefan:~/prog/FoCpy3 $ which ifort
/opt/intel/composer_xe_2011_sp1.7.256/bin/intel64/ifort 

所以版本是一样的 - 显然它不是版本问题。

libmkl_def.so的所有内容都相同。

免责声明:虽然我对自己所写的内容充满信心,但事实并非如此。每句话都应以“如果我没有记错”开头。

2 个答案:

答案 0 :(得分:11)

对我来说,intel site提出的解决方案效果很好

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

这似乎是某种错误。

答案 1 :(得分:6)

似乎解决方案是与-lmkl_rt而不是-lmkl_sequential -lmkl_intel_lp64 -lmkl_core相关联。我不明白为什么人们应该优先于其他人。我感到很困惑,但是有效(到目前为止)。

修改 英特尔人声称这是MKL库的错误。