blob: 35b6ca2b7fa15d56d32e0144a303253c25cee220 [file] [log] [blame]
# Copyright (c) 2023-2024 Arm Limited.
#
# SPDX-License-Identifier: MIT
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
# ---------------------------------------------------------------------
# Project ArmCompute
list(APPEND CMAKE_MESSAGE_CONTEXT ArmCompute)
project(
ArmCompute
VERSION 34.0.0
DESCRIPTION
"The Arm Compute Library is a collection of low-level machine learning functions optimized for Arm® Cortex®-A CPU and Arm® Mali™ GPU architectures"
LANGUAGES C CXX ASM)
include(GNUInstallDirs)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_C_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Options.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.cmake)
# Require at least gcc/g++ 11) CMAKE_CXX_COMPILER_VERSION OR
if(CMAKE_C_COMPILER_VERSION VERSION_LESS 10.2 OR CMAKE_CXX_COMPILER_VERSION
VERSION_LESS 10.2)
message(
FATAL_ERROR "gcc and g++ version => 10.2 is required for building project!")
endif()
# ---------------------------------------------------------------------
# Configuration
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -gdwarf-2 -DARM_COMPUTE_ASSERTS_ENABLED")
# Default to Release Build
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE
"Release"
CACHE
STRING
"Choose build type, available options are: Debug, Release, RelWithDebInfo"
FORCE)
endif()
# ---------------------------------------------------------------------
# Information
message(STATUS "Arm Compute Library ${PROJECT_VERSION}")
message(VERBOSE "-----------------------------------------------------")
message(VERBOSE "Build information:")
list(APPEND CMAKE_MESSAGE_INDENT " ")
message(VERBOSE "Host system: ${CMAKE_SYSTEM_NAME}")
message(VERBOSE "Host processor: ${CMAKE_SYSTEM_PROCESSOR}")
message(VERBOSE "Build path: ${CMAKE_CURRENT_BINARY_DIR}")
message(VERBOSE "Enable OpenCL acceleration: ${ENABLE_OPENCL}")
message(VERBOSE "Enable CPU acceleration: ${ENABLE_NEON}")
list(POP_BACK CMAKE_MESSAGE_INDENT)
message(VERBOSE "-----------------------------------------------------")
# ---------------------------------------------------------------------
# Compile options and features
set(COMMON_CXX_FLAGS
-Wall
-DARCH_ARM
-Wextra
-Wdisabled-optimization
-Wformat=2
-Winit-self
-Wstrict-overflow=2
-Wswitch-default
-Woverloaded-virtual
-Wformat-security
-Wctor-dtor-privacy
-Wsign-promo
-Weffc++
-Wno-overlength-strings
-Wno-ignored-attributes
-Wlogical-op
-Wnoexcept
-Wstrict-null-sentinel
-Wno-misleading-indentation
-O3)
# Disable note popups on compiler ABI changes
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
add_compile_options("-Wno-psabi")
endif()
# Compile with -Werror if ARM_COMPUTE_WERROR set
if(ARM_COMPUTE_WERROR)
add_compile_options("-Werror")
endif()
# Compile with -fno-exceptions flag and define ARM_COMPUTE_EXCEPTIONS_DISABLED
# if ARM_COMPUTE_EXCEPTIONS not set
if(NOT ARM_COMPUTE_EXCEPTIONS)
add_compile_options("-fno-exceptions")
add_definitions(-DARM_COMPUTE_EXCEPTIONS_DISABLED)
endif()
# Link OpenMP libraries if ARM_COMPUTE_OPENMP set
if(ARM_COMPUTE_OPENMP)
find_package(OpenMP)
if(OpenMP_CXX_FOUND)
link_libraries(OpenMP::OpenMP_CXX)
add_definitions(-DARM_COMPUTE_OPENMP_SCHEDULER)
else()
message(FATAL_ERROR "OPENMP was set but no OpenMP library was found!")
endif()
endif()
# ---------------------------------------------------------------------
# SVE Library
add_library(arm_compute_sve "")
target_compile_options(arm_compute_sve
PRIVATE "-march=armv8.2-a+sve+fp16+dotprod")
target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_BF16)
target_compile_definitions(arm_compute_sve PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_SVE)
target_include_directories(
arm_compute_sve
PUBLIC $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC src
src/core/NEON/kernels/arm_conv
src/core/NEON/kernels/arm_gemm
src/core/NEON/kernels/assembly
src/core/cpu/kernels/assembly
src/cpu/kernels/assembly
src/core/NEON/kernels/arm_gemm/merges)
# ---------------------------------------------------------------------
# SVE2 Library
add_library(arm_compute_sve2 "")
target_compile_options(arm_compute_sve2
PRIVATE "-march=armv8.6-a+sve2+fp16+dotprod")
target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE2)
target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_BF16)
target_compile_definitions(arm_compute_sve2 PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE)
target_include_directories(
arm_compute_sve2
PUBLIC $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
${CMAKE_CURRENT_SOURCE_DIR}
PUBLIC src
src/core/NEON/kernels/arm_conv
src/core/NEON/kernels/arm_gemm
src/core/NEON/kernels/assembly
src/core/cpu/kernels/assembly
src/cpu/kernels/assembly
src/core/NEON/kernels/arm_gemm/merges)
# ---------------------------------------------------------------------
# Core Library
add_library(arm_compute "")
target_compile_options(arm_compute PRIVATE "-march=${ARM_COMPUTE_ARCH}")
target_compile_definitions(arm_compute PRIVATE ARM_COMPUTE_ENABLE_BF16)
target_compile_definitions(arm_compute PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute PRIVATE ARM_COMPUTE_ENABLE_SVE)
target_include_directories(
arm_compute
PUBLIC $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE src
src/cpu/kernels/assembly
src/core/NEON/kernels/arm_gemm
src/core/NEON/kernels/assembly
src/core/NEON/kernels/convolution/common
src/core/NEON/kernels/arm_conv/depthwise
src/core/NEON/kernels/convolution/winograd)
target_compile_options(arm_compute PUBLIC ${COMMON_CXX_FLAGS})
add_library(ArmCompute::Core ALIAS arm_compute)
target_link_libraries(
arm_compute PUBLIC arm_compute_sve arm_compute_sve2)
# ---------------------------------------------------------------------
# Graph Library
add_library(arm_compute_graph "")
target_compile_options(arm_compute_graph PRIVATE "-march=${ARM_COMPUTE_ARCH}")
target_compile_definitions(arm_compute_graph PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_graph PRIVATE ARM_COMPUTE_ENABLE_SVE)
# add_subdirectory(src/graph)
target_include_directories(
arm_compute_graph
PUBLIC $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE src
src/cpu/kernels/assembly
src/core/NEON/kernels/arm_gemm
src/core/NEON/kernels/assembly
src/core/NEON/kernels/convolution/common
src/core/NEON/kernels/arm_conv/depthwise
src/core/NEON/kernels/convolution/winograd)
target_compile_options(arm_compute_graph PUBLIC ${COMMON_CXX_FLAGS})
add_library(ArmCompute::Graph ALIAS arm_compute_graph)
# ---------------------------------------------------------------------
# Library Target Sources
add_subdirectory(src)
if(ARM_COMPUTE_BUILD_TESTING)
# ---------------------------------------------------------------------
# Validation Framework Library
add_library(arm_compute_validation_framework "")
# target_compile_options(arm_compute_validation_framework PRIVATE
# "-march=armv8.2-a")
target_compile_options(arm_compute_validation_framework
PRIVATE "-march=${ARM_COMPUTE_ARCH}")
add_subdirectory(tests)
target_include_directories(
arm_compute_validation_framework
PUBLIC $<INSTALL_INTERFACE:include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
${CMAKE_CURRENT_SOURCE_DIR})
target_compile_options(arm_compute_validation_framework
PUBLIC ${COMMON_CXX_FLAGS})
target_link_libraries(
arm_compute_validation_framework
PUBLIC arm_compute arm_compute_graph)
# ---------------------------------------------------------------------
# Validation Binary
add_executable(arm_compute_validation "")
target_compile_options(arm_compute_validation PRIVATE "-march=${ARM_COMPUTE_ARCH}")
if(ARM_COMPUTE_ENABLE_BF16_VALIDATION)
target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_BF16)
endif()
if(ARM_COMPUTE_ENABLE_SVE_VALIDATION)
target_compile_definitions(arm_compute_validation PRIVATE ENABLE_SVE)
target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_SVE)
endif()
add_subdirectory(tests/validation)
target_compile_options(arm_compute_validation PUBLIC ${COMMON_CXX_FLAGS})
set_target_properties(
arm_compute_validation PROPERTIES RUNTIME_OUTPUT_DIRECTORY
"${CMAKE_BINARY_DIR}/validation")
target_link_libraries(
arm_compute_validation
PUBLIC arm_compute arm_compute_graph arm_compute_validation_framework
arm_compute_sve)
target_link_directories(arm_compute_validation PUBLIC tests)
# ---------------------------------------------------------------------
# Benchmark Binary
add_executable(arm_compute_benchmark)
target_compile_options(arm_compute_benchmark PRIVATE "-march=${ARM_COMPUTE_ARCH}")
add_subdirectory(tests/benchmark)
target_compile_options(arm_compute_benchmark PUBLIC ${COMMON_CXX_FLAGS})
set_target_properties(
arm_compute_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY
"${CMAKE_BINARY_DIR}/validation")
target_link_libraries(
arm_compute_benchmark PUBLIC arm_compute arm_compute_graph
arm_compute_validation_framework)
endif() # ARM_COMPUTE_BUILD_TESTING
# ---------------------------------------------------------------------
# Examples Binaries
if(ARM_COMPUTE_BUILD_EXAMPLES)
add_subdirectory(examples)
# Graph Examples
foreach(test_name ${EXAMPLE_GRAPH_NAMES})
add_executable(
${test_name} "examples/${test_name}.cpp" utils/Utils.cpp
utils/GraphUtils.cpp utils/CommonGraphOptions.cpp)
target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
set_target_properties(
${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
"${CMAKE_BINARY_DIR}/examples")
target_link_libraries(${test_name} PUBLIC arm_compute
arm_compute_graph arm_compute_sve)
endforeach()
# NEON Examples
foreach(test_name ${EXAMPLE_NEON_NAMES})
add_executable(${test_name} "examples/${test_name}.cpp" utils/Utils.cpp)
target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
set_target_properties(
${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
"${CMAKE_BINARY_DIR}/examples")
target_link_libraries(${test_name} PUBLIC arm_compute)
endforeach()
endif() # ARM_COMPUTE_BUILD_EXAMPLES