Я пытаюсь связать 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"
Это в конечном итоге не удается указать, что:
checking whether user supplied BLASLIB=[text above] does not work
Сначала вам нужно убедиться, что 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
Вы можете использовать следующую команду, чтобы проверить, готов ли MKL. Должен отображаться действительный установочный каталог MKL.
$ echo $MKLROOT
Если вы используете MKL link line advisor, почему бы вам точно не следовать инструкции? Я заметил, что вы скучаете по 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'
Но это не работает со статическим MKL.
Вышеуказанные настройки работают только с компилятором 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
В продолжение ответа @kangshiyin: я обнаружил, что нужно -liomp5
библиотека и использовать LP64
целочисленное представление вместо ILP64
, Я также определил компиляторы Фортрана в F77
а также FC
, Команда configure выглядела так:
../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 с версиями компиляторов Intel и MKL 2017.0.2. Версия 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 ++.
Ipopt должен быть связан с библиотекой LP64 Blas и Lapack, он использует 32-битные целочисленные индексы. Версия MKL ILP64, с которой вы пытались связать, создана для 64-битных целочисленных индексов.