运行 cmake 时 Linux 上的英特尔数学核心函数库 (MKL) 编译错误

Compiling error with the Intel Math Kernel Library (MKL) on Linux when running cmake

在我的 Linux Intel 机器(Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz)上安装 MKL 库后我遇到了一些问题。当我 运行 cmake 时,出现以下错误:

[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:90 ] _MKL_TEST_VERSIONS = 2011
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:92 ] MKL_ADDITIONAL_VERSIONS = 
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:94 ] MKL_USE_STATIC_LIBS = 
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:96 ] MKL_ROOT = /opt/intel/oneapi/mkl/2022.0.2
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:98 ] INTEL_ROOT = 
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:117 ] _MKL_ROOT_SEARCH_DIRS = /opt/intel/oneapi/mkl/2022.0.2;/opt/intel/composerxe-2011/mkl
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:130 ] location of mkl.h: /opt/intel/oneapi/mkl/2022.0.2/include/mkl.h
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:158 ] _INTEL_LIBRARY_DIR_SUFFIXES = lib;lib/intel64
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:160 ] _MKL_LIBRARY_SEARCH_DIRS = /opt/intel/oneapi/mkl/2022.0.2;/opt/intel/composerxe-2011/mkl;/opt/intel/oneapi/mkl/2022.0.2/include/..
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:205 ] Found mkl_rt: /opt/intel/oneapi/mkl/2022.0.2/lib/intel64/libmkl_rt.so
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:227 ] _INTEL_LIBRARY_SEARCH_DIRS = /compiler;/opt/intel/oneapi/mkl/2022.0.2/..;/opt/intel/oneapi/mkl/2022.0.2/../compiler;/opt/intel/composerxe-2011/mkl/..;/opt/intel/composerxe-2011/mkl/../compiler
[ /home/278926k/GSM/molecularGSM/cmake/FindMKL.cmake:313 ] MKL not found - the following libraries are missing: IOMP5;MATH

CMake Error at cmake/FindMKL.cmake:330 (message):
  Intel(R) MKL could not be found.
Call Stack (most recent call first):
  GSM/CMakeLists.txt:69 (find_package)

FindMKL.cmake中引用的部分:

set(MKL_FOUND TRUE)
if (NOT MKL_INCLUDE_DIR)
    set(MKL_FOUND FALSE)
    if (MKL_FIND_DEBUG)
        message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
                       "MKL not found - MKL_INCLUDE_DIR was empty")
    endif()
elseif (_MKL_MISSING_LIBRARIES)
    set(MKL_FOUND FALSE)
    if (MKL_FIND_DEBUG)
        message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] "
                       "MKL not found - the following libraries are missing: "
                       "${_MKL_MISSING_LIBRARIES}")
    endif()
endif()

if (MKL_FOUND)
    if (NOT MKL_FIND_QUIETLY OR MKL_FIND_DEBUG)
        message(STATUS
            "Intel(R) MKL was found:\n"
            "  MKL_INCLUDE_DIRS: ${MKL_INCLUDE_DIRS}\n"
            "  MKL_LIBRARY_DIRS: ${MKL_LIBRARY_DIRS}\n"
            "  MKL_LIBRARIES: ${MKL_LIBRARIES}"
        )
    endif()
else()
    if (MKL_FIND_REQUIRED)
        message(SEND_ERROR "Intel(R) MKL could not be found.")
    else()
        message(STATUS "Intel(R) MKL could not be found.")
    endif()
endif()

我缺少 IOMP5 和 MATH 库。这会是我这边的环境变量或安装问题吗(例如,我没有 select 正确的选项)。已经花了好几个小时,仍在阅读它,但在这里发帖是为了寻求那些有使用 MKL 经验的人的帮助。

感谢您提供详细信息。我已经尝试执行安装说明,并且可以重现您遇到的缺少库的问题,在我的情况下,它只是 MATH 库。我查看了 FindMKL.cmake 文件以了解导致问题的原因。我发现 “此脚本仅使用 Intel(R) Parallel Studio XE 2011 进行了测试”.

当我们使用 oneAPI 工具包中的 oneMKL 时,我们需要相应地设置环境变量。

我在FindMKL.cmake文件中找到了这段代码

## Find OpenMP, pthread and math libraries
set(_INTEL_LIBRARY_SEARCH_DIRS
  ${INTEL_ROOT}
  ${INTEL_ROOT}/compiler

并想到如下设置INTELROOT环境变量(这与我在评论部分提到的路径相同)。

export INTELROOT=/opt/intel/oneapi/compiler/2022.0.1/linux/compiler/lib/intel64_lin

另一点需要注意的是按照说明的第 2 步中所述加载英特尔编译器,这可以通过 运行 setvars 脚本完成并在 cmake 步骤中使用它们。

在这里我想澄清一下英特尔编译器的类型。

由于您提到您只安装了一个 API Base Toolkit,因此您将只获得一个 API C++/DPC++ 编译器,它们可以作为 icx 和 icpx(分别是 C 和 C++ 编译器)调用。

cmake -D GSM_ENABLE_QCHEM=1 -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx ../

如果您安装 oneAPI HPC 工具包(我也鼓励您安装它),您将获得英特尔经典编译器(icc 和 icpc)

cmake -D GSM_ENABLE_QCHEM=1 -DCMAKE_C_COMPILER=icc -DCMAKE_CXX_COMPILER=icpc ../

现在我可以看到构建成功,没有任何此类缺失库错误。

这里是屏幕截图(使用英特尔经典编译器 icc/icpc 完成,您也可以使用 icx/icpx 编译器,但我观察到只有一些警告,而 icc/icpc 则没有警告)供您参考。

cmake 步骤后的输出屏幕

make 步骤后的输出屏幕

因为它从我这边开始成功运作,我希望你也能发生同样的事情。