Связывание MKL от Intel в программе Python-C ++ — C-Fortran 2003

Я пытаюсь связать программу, которая довольно сложна:

  • разработан и работает под Linux Fedora
  • Основной код, написанный на Fortran 2003, в значительной степени опирается на библиотеку Intel MKL и небольшие фрагменты кода ANSI C
  • имеет интерфейс C ++ (используйте iso_c_binding)
  • доступ к интерфейсу c ++ осуществляется через python через boost.python

Во время выполнения я получаю следующий текст

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 — это модуль, который связан, тогда

Бег python t83.py (в частности компоновщик не жалуется при подготовке двоичного файла), который импортирует модуль libFrrBoost, вызывает ошибку.

Пытался гуглить. Вся информация, которую я нашел, была связана с «обычными программами», написанными на C / Fortran и просто включающими MKL от Intel. Я могу запускать такого рода программы без проблем. Я думаю, что MKL-часть связующей строки в Makefile эквивалентна в обоих случаях, но где-то должна быть скрытая тайна. Обычно проблема заключалась в плохом соединении, которое я не вижу применимым (библиотеки точно такие же, как в руководстве Intel — интерфейс, потоки и вычислительные библиотеки довольно стандартны)

Использованные компиляторы:

ifort 12.1.0, icpc 12.1.0, python Python 2.7.1, icc 12.1.0 (небольшой фрагмент кода C также вызывает MKL, но)

РЕДАКТИРОВАТЬ (из-за комментария Хирсто Илиева)

Я запустил 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

Я понимаю, что спецификация для open как Вот в частности, 3,4 положительны и указывают, что open нашел файл и присвоил ему файловые дескрипторы. Я проверил, что файл существует в этом месте.

также это «хороший» каталог компилятора Intel, как:

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

Таким образом, версия та же самая — очевидно, это не проблема версии.

Все то же самое для libmkl_def.so,

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИХотя я могу быть уверен в том, что я пишу, я не уверен. Каждое предложение должно начинаться с «Если я не ошибаюсь».

2

Решение

Для меня решение, предложенное на сайт Intel работает хорошо

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

Кажется, это какая-то ошибка.

10

Другие решения

Кажется, решение состоит в том, чтобы связать с -lmkl_rt вместо -lmkl_sequential -lmkl_intel_lp64 -lmkl_core, Я не понимаю, почему один должен давать преимущество перед другими. Я в замешательстве, но это работает (пока).

редактировать
Люди Intel утверждают, что это была ошибка библиотеки MKL.

6

По вопросам рекламы [email protected]