使用 CMake 检测 BLAS/LAPACK 供应商

问题描述 投票:0回答:2

所以我的代码希望在不同的 BLAS/LAPACK 供应商发生时包含不同的头文件。是否有任何预定义的宏或类似的东西让我检查它?

cmake lapack blas
2个回答
4
投票

CMake 2.8+ 附带 FindBLAS.cmake FindLAPACK.cmake。您可能需要查看本地 cmake 安装中的文件中的注释:cmake-2.8.5/share/cmake/Modules/FindBLAS.cmake。该模块支持各种 BLAS 和 LAPACK 实现。例如:

set( ENV{BLA_VENDOR} "ATLAS" )
find_package( BLAS REQUIRED )

祝你好运。


0
投票

(这是CMake 3.x时代的答案)

我曾经做过一个类似于其他答案的复杂工作流程,其中我尝试与不同的显式供应商一起检测 BLAS 发行版。

这样做的问题是你必须尝试很多可能性,逻辑就会变得复杂。 如果这是从命令行进行的,那么您还将覆盖供应商的选择。

所以,我现在要做的是检查输出变量并设置变量或采取任何特定操作:

find_package(BLAS)
if(BLAS_FOUND)
    message("Some BLAS found: linker flags ${BLAS_LINKER_FLAGS}, libs ${BLAS_LIBRARIES}, libs95 ${BLAS95_LIBRARIES}")
    foreach(lib ${BLAS_LIBRARIES})
        if(${lib} MATCHES "mkl")
            message("Some BLAS found matches MKL")
            add_definitions(-DBLAS_DOT_RETURNS_VOID)
            # in some systems with MKL, regular BLAS headers need to be found for it to work
            SET(CMAKE_SKIP_BUILD_RPATH  FALSE)
            SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
            SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
            SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
            SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib64")
        endif()
        if(${lib} MATCHES "hpc_sdk")
            message("Some BLAS found matches hpc_sdk (nvhpc)")
            add_definitions(-DBLAS_DOT_RETURNS_VOID)
        endif()
        ... do this for Apple Accelerate, ATLAS, etc
    endforeach()
endif()
© www.soinside.com 2019 - 2024. All rights reserved.