我正在尝试将 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
最佳答案
首先,您需要确保 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
关于c++ - 将 Ipopt 与英特尔 MKL 连接起来,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38038444/