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

标签 c++ python boost fortran intel-mkl

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

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

在运行时我得到以下文本

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 是链接的模块,那么

运行导入模块 libFrrBoost 的 python t83.py(特别是链接器在准备二进制文件时不会提示)会导致错误。

尝试谷歌。我发现的所有信息都与用 C/Fortran 编写的“常规程序”有关,并且只包括英特尔的 MKL。我能够毫无问题地运行这类程序。我认为 Makefile 中链接行的 MKL 部分在这两种情况下是等效的,但一定有什么地方隐藏着谜团。问题通常是错误的链接——我认为这不适用(这些库与英特尔手册中的完全一样——接口(interface)、线程和计算库非常标准)

使用的编译器:

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;结果是(在 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 中所示an,尤其是 3,4 为正数,表示打开已找到一个文件并为其分配了文件描述符。我已验证该文件确实存在于该位置。

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

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

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

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

免责声明:虽然我听起来对自己写的东西很有信心,但我不是。每句话都应该以“如果我没记错的话”开头。

最佳答案

我在 intel site 上提出的解决方案效果很好

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

这似乎是某种错误。

关于c++ - 在 Python-C++-C-Fortran 2003 程序中链接英特尔的 MKL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13951953/

相关文章:

c++ - 在 C++ 中使用 map<pair<int,int>,string>

python - Selenium Python 列中的表行未存储在我的列表变量中

Python 使用函数结果进行正则表达式替换

c++ - timeGetTime 是衡量游戏循环时间的好方法吗?

c++ - 您能否像在 C# 中那样在 C++ 中显式设置结构布局/对齐方式?

c++ - MSVC 对##__VA_ARGS__ 的处理与其他编译器的比较

python - Pybrain 神经网络 : _convertToOneOfMany error

c++ - 我可以使用共享内存或其他 IPC

c++ - 如何检查 Linux 操作系统中使用的 C++ 版本?

c++ - 如何从 2d Boost.MultiArray 中获取子数组?