所以我的代码希望在不同的 BLAS/LAPACK 供应商发生时包含不同的头文件。是否有任何预定义的宏或类似的东西让我检查它?
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 )
祝你好运。
(这是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()