链接 Ipopt 与英特尔 MKL
Linking Ipopt with Intel MKL
我正在尝试 link 使用 Intel MKL (instructions) Ipopt。
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
。我还在 F77
和 FC
中定义了 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" 中更改的安全设置所致
我正在尝试 link 使用 Intel MKL (instructions) Ipopt。
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
。我还在 F77
和 FC
中定义了 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.