链接 Ipopt 与英特尔 MKL

Linking Ipopt with Intel MKL

我正在尝试 link 使用 Intel MKL (instructions) Ipopt。

Intel's Link Advisor 建议:

Link行:

 -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 线路顾问,为什么不严格按照说明进行操作呢?我注意到您在 link 选项中错过了 OpenMP lib -liomp5,以及整个编译选项。

我可以通过

使用单个动态 MKL 构建 Ipopt
$ 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 编译器。


带 icc 编译器的动态 MKL 也适用于以下设置。

$ 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

Ipopt 需要 link 针对 LP64 Blas 和 Lapack 库,它使用 32 位整数索引。您尝试 link 反对的 MKL 的 ILP64 版本是为 64 位整数索引构建的。

跟进@kangshiyin 的回答:我发现需要 -liomp5 库并使用 LP64 整数表示而不是 ILP64。我还在 F77FC 中定义了 Fortran 编译器。配置命令如下所示:

../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 版本的英特尔编译器和 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 库。根据 Intel C++ compiler forum.

上的一些帖子,这显然是由于 "El Capitan" 中更改的安全设置所致