Связывание Ipopt с Intel MKL

Я пытаюсь связать 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

1

Решение

Сначала вам нужно убедиться, что 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
3

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

В продолжение ответа @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 ++.

2

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

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