mirror of
https://gitlab.com/libeigen/eigen.git
synced 2026-01-18 17:31:19 +01:00
293 lines
8.9 KiB
CMake
293 lines
8.9 KiB
CMake
|
|
#
|
|
# This Source Code Form is subject to the terms of the Mozilla Public
|
|
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
|
|
#
|
|
# FindAOCL.cmake - CMake Module for AMD Optimizing CPU Libraries (AOCL)
|
|
#
|
|
# Copyright (c) 2025 Advanced Micro Devices, Inc. All rights reserved.
|
|
#
|
|
# Description:
|
|
# ------------
|
|
# This CMake module locates and configures AMD Optimizing CPU Libraries (AOCL)
|
|
# for high-performance mathematical computing on AMD processors. It searches for
|
|
# and sets up the following AOCL components:
|
|
#
|
|
# 1. AOCL MathLib (libamdlibm): Vector Math Library providing optimized
|
|
# transcendental functions (exp, sin, cos, sqrt, log, etc.) with VRDA
|
|
# (Vector Rapid Double-precision Arithmetic) support for SIMD acceleration
|
|
#
|
|
# 2. AOCL BLAS (BLIS): Basic Linear Algebra Subprograms optimized for AMD
|
|
# architectures, supporting both single-threaded (libblis) and multithreaded
|
|
# (libblis-mt) execution with OpenMP parallelization
|
|
#
|
|
# 3. AOCL LAPACK (libflame): Linear Algebra PACKage providing dense matrix
|
|
# factorizations, eigenvalue/eigenvector computations, and linear system
|
|
# solvers optimized for AMD processors
|
|
#
|
|
# The module automatically detects the appropriate library variants based on
|
|
# configuration flags and provides proper linking setup for optimal performance
|
|
# on Zen, Zen2, Zen3, Zen4, and Zen5 architectures.
|
|
#
|
|
# Variables Set:
|
|
# --------------
|
|
# AOCL_FOUND - True if AOCL libraries are found
|
|
# AOCL_LIBRARIES - List of AOCL libraries to link against
|
|
# AOCL_INCLUDE_DIRS - Include directories for AOCL headers
|
|
# AOCL_BLAS_TYPE - Type of BLIS library found ("multithreaded" or "single-threaded")
|
|
# AOCL_CORE_LIB - Path to core AOCL math library
|
|
# AOCL_BLAS_LIB - Path to AOCL BLAS library
|
|
# AOCL_LAPACK_LIB - Path to AOCL LAPACK library
|
|
#
|
|
# Configuration Options:
|
|
# ----------------------
|
|
# EIGEN_AOCL_BENCH_USE_MT - When ON, searches for multithreaded BLIS first
|
|
# When OFF, searches for single-threaded BLIS only
|
|
#
|
|
# # For multithreaded BLIS:
|
|
# cmake .. -DEIGEN_AOCL_BENCH_USE_MT=ON
|
|
#
|
|
# # For single-threaded BLIS:
|
|
# cmake .. -DEIGEN_AOCL_BENCH_USE_MT=OFF
|
|
#
|
|
# Library Search Paths:
|
|
# ---------------------
|
|
# The module searches for AOCL libraries in the following order:
|
|
# 1. ${AOCL_ROOT}/lib (or ${AOCL_ROOT}/lib32 for 32-bit)
|
|
# 2. /opt/amd/aocl/lib64 (or /opt/amd/aocl/lib32 for 32-bit)
|
|
# 3. ${LIB_INSTALL_DIR}
|
|
#
|
|
# Expected Library Names:
|
|
# -----------------------
|
|
# Core MathLib: amdlibm, alm, almfast
|
|
# BLAS Single: blis
|
|
# BLAS Multi: blis-mt
|
|
# LAPACK: flame
|
|
#
|
|
# Dependencies:
|
|
# -------------
|
|
# The module automatically links the following system libraries:
|
|
# - libm (standard math library)
|
|
# - libpthread (POSIX threads)
|
|
# - librt (real-time extensions)
|
|
#
|
|
# Architecture Support:
|
|
# ---------------------
|
|
# Optimized for AMD Zen family processors (Zen, Zen2, Zen3, Zen4, Zen5)
|
|
# with automatic architecture detection and SIMD instruction selection.
|
|
#
|
|
# Developer:
|
|
# ----------
|
|
# Name: Sharad Saurabh Bhaskar
|
|
# Email: shbhaska@amd.com
|
|
#
|
|
|
|
if(NOT DEFINED AOCL_ROOT)
|
|
if(DEFINED ENV{AOCL_ROOT})
|
|
set(AOCL_ROOT $ENV{AOCL_ROOT})
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(STATUS "AOCL_ROOT set from environment: ${AOCL_ROOT}")
|
|
endif()
|
|
else()
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(WARNING "AOCL_ROOT is not set. AOCL support will be disabled.")
|
|
endif()
|
|
set(AOCL_LIBRARIES "")
|
|
endif()
|
|
endif()
|
|
|
|
if(AOCL_LIBRARIES)
|
|
set(AOCL_FIND_QUIETLY TRUE)
|
|
endif()
|
|
|
|
# Determine default include directories
|
|
set(AOCL_INCLUDE_DIRS "")
|
|
if(AOCL_ROOT AND EXISTS "${AOCL_ROOT}/include")
|
|
list(APPEND AOCL_INCLUDE_DIRS "${AOCL_ROOT}/include")
|
|
endif()
|
|
if(EXISTS "/opt/amd/aocl/include")
|
|
list(APPEND AOCL_INCLUDE_DIRS "/opt/amd/aocl/include")
|
|
endif()
|
|
|
|
if(${CMAKE_HOST_SYSTEM_PROCESSOR} STREQUAL "x86_64")
|
|
# Search for the core AOCL math library.
|
|
find_library(AOCL_CORE_LIB
|
|
NAMES amdlibm alm almfast
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib64
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
if(AOCL_CORE_LIB)
|
|
message(STATUS "Found AOCL core library: ${AOCL_CORE_LIB}")
|
|
else()
|
|
message(WARNING "AOCL core library not found in ${AOCL_ROOT}/lib or default locations.")
|
|
endif()
|
|
endif()
|
|
|
|
# Conditional BLIS library search based on MT requirement
|
|
if(EIGEN_AOCL_BENCH_USE_MT)
|
|
# Search for multithreaded BLIS first
|
|
find_library(AOCL_BLAS_LIB
|
|
NAMES blis-mt
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib64
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if(AOCL_BLAS_LIB)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(STATUS "Found AOCL BLAS (MT) library: ${AOCL_BLAS_LIB}")
|
|
endif()
|
|
set(AOCL_BLAS_TYPE "multithreaded")
|
|
else()
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(WARNING "AOCL multithreaded BLAS library not found, falling back to single-threaded.")
|
|
endif()
|
|
find_library(AOCL_BLAS_LIB
|
|
NAMES blis
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib64
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
set(AOCL_BLAS_TYPE "single-threaded")
|
|
endif()
|
|
else()
|
|
# Search for single-threaded BLIS
|
|
find_library(AOCL_BLAS_LIB
|
|
NAMES blis
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib64
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if(AOCL_BLAS_LIB)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(STATUS "Found AOCL BLAS (ST) library: ${AOCL_BLAS_LIB}")
|
|
endif()
|
|
set(AOCL_BLAS_TYPE "single-threaded")
|
|
else()
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(WARNING "AOCL single-threaded BLAS library not found.")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# Now search for AOCL LAPACK library.
|
|
find_library(AOCL_LAPACK_LIB
|
|
NAMES flame
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib64
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
if(AOCL_LAPACK_LIB)
|
|
message(STATUS "Found AOCL LAPACK library: ${AOCL_LAPACK_LIB}")
|
|
else()
|
|
message(WARNING "AOCL LAPACK library not found in ${AOCL_ROOT}/lib or default locations.")
|
|
endif()
|
|
endif()
|
|
|
|
else()
|
|
# For 32-bit systems, similar search paths.
|
|
find_library(AOCL_CORE_LIB
|
|
NAMES amdlibm alm almfast
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib32
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
if(AOCL_CORE_LIB)
|
|
message(STATUS "Found AOCL core library: ${AOCL_CORE_LIB}")
|
|
else()
|
|
message(WARNING "AOCL core library not found in ${AOCL_ROOT}/lib or default locations.")
|
|
endif()
|
|
endif()
|
|
|
|
# Conditional BLIS library search for 32-bit
|
|
if(EIGEN_AOCL_BENCH_USE_MT)
|
|
find_library(AOCL_BLAS_LIB
|
|
NAMES blis-mt
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib32
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if(AOCL_BLAS_LIB)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(STATUS "Found AOCL BLAS (MT) library: ${AOCL_BLAS_LIB}")
|
|
endif()
|
|
set(AOCL_BLAS_TYPE "multithreaded")
|
|
else()
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(WARNING "AOCL multithreaded BLAS library not found, falling back to single-threaded.")
|
|
endif()
|
|
find_library(AOCL_BLAS_LIB
|
|
NAMES blis
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib32
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
set(AOCL_BLAS_TYPE "single-threaded")
|
|
endif()
|
|
else()
|
|
find_library(AOCL_BLAS_LIB
|
|
NAMES blis
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib32
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if(AOCL_BLAS_LIB)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(STATUS "Found AOCL BLAS (ST) library: ${AOCL_BLAS_LIB}")
|
|
endif()
|
|
set(AOCL_BLAS_TYPE "single-threaded")
|
|
else()
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
message(WARNING "AOCL single-threaded BLAS library not found.")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
find_library(AOCL_LAPACK_LIB
|
|
NAMES flame
|
|
PATHS
|
|
${AOCL_ROOT}/lib
|
|
/opt/amd/aocl/lib32
|
|
${LIB_INSTALL_DIR}
|
|
)
|
|
if (NOT AOCL_FIND_QUIETLY)
|
|
if(AOCL_LAPACK_LIB)
|
|
message(STATUS "Found AOCL LAPACK library: ${AOCL_LAPACK_LIB}")
|
|
else()
|
|
message(WARNING "AOCL LAPACK library not found in ${AOCL_ROOT}/lib or default locations.")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
# Combine the found libraries into one variable.
|
|
if(AOCL_CORE_LIB)
|
|
set(AOCL_LIBRARIES ${AOCL_CORE_LIB})
|
|
endif()
|
|
if(AOCL_BLAS_LIB)
|
|
list(APPEND AOCL_LIBRARIES ${AOCL_BLAS_LIB})
|
|
endif()
|
|
if(AOCL_LAPACK_LIB)
|
|
list(APPEND AOCL_LIBRARIES ${AOCL_LAPACK_LIB})
|
|
endif()
|
|
if(AOCL_LIBRARIES)
|
|
# Link against the standard math and pthread libraries as well as librt
|
|
list(APPEND AOCL_LIBRARIES m pthread rt)
|
|
endif()
|
|
|
|
include(FindPackageHandleStandardArgs)
|
|
find_package_handle_standard_args(AOCL DEFAULT_MSG AOCL_LIBRARIES AOCL_INCLUDE_DIRS)
|
|
mark_as_advanced(AOCL_LIBRARIES AOCL_INCLUDE_DIRS)
|