在 Python-C++-C-Fortran 2003 程序中链接英特尔的 MKL
Linking Intel's MKL within Python-C++-C-Fortran 2003 program
我正在尝试链接一个性质非常复杂的程序:
- 在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.so
和libmkl_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部分在这两种情况下都是等效的,但肯定有一个隐藏的谜团。问题通常是链接不好——我认为这不适用(库与英特尔手册中的完全一样——接口、线程和计算库都是非常标准的)
使用过的编译器:
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的规范在这里是一样的,特别是,因为3,4是正的,表明open已经找到了一个文件,并为它分配了文件描述符。我已经确认该文件确实存在于该位置。
这也是"好"的英特尔编译器目录作为:
czeslaw@stefan:~/prog/FoCpy3 $ which ifort
/opt/intel/composer_xe_2011_sp1.7.256/bin/intel64/ifort
所以版本是一样的——显然这不是版本问题。
libmkl_def.so
的一切都是一样的。
免责声明:虽然我听起来对自己写的东西很有信心,但我不是。每句话都应该以"如果我没有错的话"开头。
英特尔网站上提出的For me解决方案运行良好
export LD_PRELOAD=/opt/intel/mkl/lib/intel64/libmkl_core.so:/opt/intel/mkl/lib/intel64/libmkl_sequential.so
这似乎是某种虫子。
似乎解决方案是与-lmkl_rt
而不是-lmkl_sequential -lmkl_intel_lp64 -lmkl_core
链接。我不明白为什么一方要给予另一方优势。我很困惑,但这(到目前为止)有效。
edit英特尔人员声称这是MKL库错误。
- 将gsl c++程序与"英特尔MKL"链接
- 如何指示 CMAKE 在 Visual Studio 中使用英特尔 MKL
- 检测 Visual Studio 项目的属性中是否启用了英特尔 MKL
- 使用特征/英特尔 MKL 求解稀疏线性系统
- 英特尔 MKL 稀疏 QR 求解 C++ 返回未初始化错误
- 在 Linux 上实施英特尔 MKL 的 DFT 时"Segmentation fault"
- 构建不依赖于MSVCR120.DLL的自定义英特尔 MKL DLL
- 英特尔 MKL 和 JNI:如何添加 ld 从中搜索符号的共享库?
- 在 Python-C++-C-Fortran 2003 程序中链接英特尔的 MKL
- FFT使用“英特尔MKL”和“英特尔IPP”
- 英特尔MKL函数内部调用TerminateProcess()
- 如何链接英特尔 MKL 库,只需使用cblas_dgemm函数即可
- 使用带零填充的英特尔 MKL 的 3D FFT
- MKL 英特尔C++和准随机数生成器
- 结合 OpenMP、英特尔 MKL 和 MSVC 编译器时出现大量内存泄漏
- 英特尔MKL是否支持Armadilo、Eigen或biltz++ ?
- 我如何利用英特尔-mkl与tensorflow
- Rcpp与英特尔MKL多线程
- 无法将“英特尔MKL 11.3”库与Eigen 3.2.9 TDM-GCC-5.1.0 Win64链接
- 连接Ipopt与英特尔MKL