c++ 将Ipopt与“英特尔MKL”链接

lhcgjxsq  于 2023-01-06  发布在  其他
关注(0)|答案(3)|浏览(182)

我正在尝试将Ipopt与“英特尔MKL(instructions)”链接。
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
e0uiprwp

e0uiprwp1#

首先,您需要确保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链接行顾问,为什么不严格按照说明操作呢?我注意到您错过了OpenMP lib -liomp5 in link选项和整个编译选项。
我可以使用单个动态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
dbf7pr2w

dbf7pr2w2#

跟进@康时银的回答:我发现人们需要-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”中更改了安全设置。

vq8itlhq

vq8itlhq3#

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

相关问题