2016-06-26 10 views
0

Я пытаюсь связать Ipopt с Intel MKL (instructions).Связь Ipopt с Intel MKL

Intel's Link Advisor предлагает:

Ссылка линия:

-Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a ${MKLROOT}/lib/intel64/libmkl_core.a ${MKLROOT}/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm -ldl 

Опции компилятора:

-DMKL_ILP64 -qopenmp -I${MKLROOT}/include 

Я пытаюсь настроить Ipopt с:

../configure CXX=icpc CC=icc F77=ifort --with-blas=" -Wl,--start-group ${MKLROOT}/lib/intel64/libmkl_intel_ilp64.a ${MKLROOT}/lib/intel64/libmkl_core.a ${MKLROOT}/lib/intel64/libmkl_intel_thread.a -Wl,--end-group -lpthread -lm -ldl" CXXFLAGS=" -DMKL_ILP64 -qopenmp -I${MKLROOT}/include" 

Это eventu сальдо, указывающее:

checking whether user supplied BLASLIB=[text above] does not work 
+0

Какую версию MKL вы используете? – kangshiyin

+0

Я только что загрузил обновление Parallel Studio 2016 3, так что моя догадка - последняя, ​​которая, я думаю, 11.3.2 –

+0

Каков вывод команды 'echo $ {MKLROOT}' на вашем компьютере? – kangshiyin

ответ

3

Прежде всего вам необходимо убедиться, что MKL правильно установлен и настроен, как показано здесь.

https://software.intel.com/en-us/get-started-with-parallel-studio-xe-for-linux

постоянный путь поставить следующую строку в ваш .bashrc или .profile

source /opt/intel/parallel_studio_xe_2016.<##>.<###>/psxevars.sh intel64 

Вы можете использовать следующую CmdLine, чтобы проверить, если MKL готов. Он должен отображать действительный установочный каталог MKL.

$ echo $MKLROOT 

Если вы используете MKL ссылку консультанта линии, почему бы вам не следовать инструкциям в точности? Я заметил, что вы пропустили OpenMP lib -liomp5 в опции ссылок и весь параметр компиляции.

я могу построить Ipopt с одной динамической MKL по

$ mkdir build 
$ cd build 
$ ../configure --with-blas=' -Wl,--no-as-needed -L${MKLROOT}/lib/intel64 -lmkl_rt -lpthread -lm -ldl' CFLAGS=' -m64 -I${MKLROOT}/include' CXXFLAGS=' -m64 -I${MKLROOT}/include' 

и с динамическим MKL по

$ mkdir build 
$ cd build 
$ ../configure --with-blas='-Wl,--no-as-needed -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_intel_thread -liomp5 -lpthread -lm -ldl' CFLAGS=' -m64 -I${MKLROOT}/include' CXXFLAGS=' -m64 -I${MKLROOT}/include' 

Но она не работает со статическим МКЛ.

Указанные выше настройки работают только с gcc-компилятором.


Динамический MKL с компилятором icc также работает со следующей настройкой.

$ mkdir build 
$ cd build 
$ ../configure --with-blas=' -L${MKLROOT}/lib/intel64 -lmkl_intel_ilp64 -lmkl_core -lmkl_intel_thread -lpthread -lm -ldl' CFLAGS=' -DMKL_ILP64 -qopenmp -I${MKLROOT}/include' CXXFLAGS=' -DMKL_ILP64 -qopenmp -I${MKLROOT}/include' CC=icc CXX=icpc 
+0

@ Агрим Патхак, с каким компилером ты пользуешься? gcc или icc? – kangshiyin

+0

Либо нормально. Я считаю, что gcc/g ++ является моим текущим значением по умолчанию. –

+0

Эти команды работают. Любая причина, почему Static MKL не работает? –

1

Ipopt необходимо связать с библиотекой LP64 Блас и LaPack, он использует 32-битовые целые индексы. Версия ILP64 MKL, которую вы пытались связать, построена для 64-битных целых индексов.

1

В ответ на ответ @kangshiyin: я нашел, что нужна библиотека -liomp5 и используйте целое число LP64 вместо ILP64. Я также определил компиляторы Fortran в F77 и FC. Команда конфигурирования выглядела как:

../configure --prefix=${YOUR_PREFIX} \ 
--with-blas=' -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_core \ 
-lmkl_intel_thread -liomp5 -lpthread -lm -ldl' \ 
CC=icc CXX=icpc FC=ifort F77=ifort \ 
CFLAGS=' -DMKL_LP64 -qopenmp -I${MKLROOT}/include' \ 
CXXFLAGS='-std=c++11 -DMKL_LP64 -qopenmp -I${MKLROOT}/include' \ 
OPT_CCFLAGS="-Ofast" OPT_CXXFLAGS="-Ofast" OPT_FCFLAGS="-Ofast" 

Это работало на установке Ubuntu 16.04.3 LTS, с 2017.0.2 версии компиляторов Intel и MKL. Версия Ipopt была 3.12.7.

Обновление: Я пробовал это также в MacOS «El Capitan» (OS X 10.11.6). Оказывается, что вы должны добавить следующие флаги компоновщика для вашего вызова из configure:

LDFLAGS="-Wl,-rpath,$MKLROOT/../compiler/lib -Wl,-rpath,$MKLROOT/lib" 

libiomp5.dylib иначе библиотека не будет найдена. Это, по-видимому, связано с измененной настройкой безопасности в «El Capitan», согласно некоторым сообщениям на Intel C++ compiler forum.