blob: 5e4983525b7b0b5b507dbbbf51b7ead1eef85680 [file] [log] [blame] [edit]
#
# 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)