我正在尝试将Ipopt与英特尔MKL(instructions)联系起来。
链接线:
lista
编译器选项:
-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
我尝试使用以下命令配置Ipopt:
-DMKL_ILP64 -qopenmp -I${MKLROOT}/include
这最终失败表明:
../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"
答案 0 :(得分: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
和整个编译选项。
我可以用
单动态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
答案 1 :(得分:2)
跟进@kangshiyin的回答:我发现需要-liomp5
库并使用LP64
整数表示而不是ILP64
。我还在F77
和FC
中定义了Fortran编译器。 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安装,以及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
库。根据{{3}}上的一些帖子,这显然是由于“El Capitan”的安全设置已经改变。
答案 2 :(得分:1)
Ipopt需要链接到LP64 Blas和Lapack库,它使用32位整数索引。您尝试链接的ILL64版MKL是为64位整数索引构建的。