| |
| # |
| # 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) |