3

我正在尝试将 Ipopt 与 Intel MKL(说明)链接起来。

英特尔的 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
4

3 回答 3

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

我可以通过单个动态 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
于 2016-06-26T12:58:34.580 回答
3

跟进@kangshiyin 的回答:我发现需要该-liomp5库并使用LP64整数表示而不是ILP64. 我还在 和 中定义了 Fortran 编译F77FC。配置命令看起来像:

../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将找不到该库。根据英特尔 C++ 编译器论坛上的一些帖子,这显然是由于“El Capitan”中更改了安全设置。

于 2017-08-17T15:29:36.430 回答
1

Ipopt 需要链接到一个 LP64 Blas 和 Lapack 库,它使用 32 位整数索引。您尝试链接的 MKL 的 ILP64 版本是为 64 位整数索引构建的。

于 2016-08-24T14:38:01.837 回答