You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
323 lines
11 KiB
323 lines
11 KiB
# Copyright (c) 2023 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 28.0.8
|
|
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
|
|
|
|
# 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 WERROR set
|
|
if(WERROR)
|
|
add_compile_options("-Werror")
|
|
endif()
|
|
|
|
# Compile with debug flags and define ARM_COMPUTE_ASSERTS_ENABLED if DEBUG set
|
|
if(DEBUG)
|
|
add_compile_options("-O0" "-g" "-gdwarf-2")
|
|
add_definitions(-DARM_COMPUTE_ASSERTS_ENABLED) # ARM_COMPUTE_DEBUG_ENABLED ??
|
|
endif()
|
|
|
|
# Compile with -fno-exceptions flag and define ARM_COMPUTE_EXCEPTIONS_DISABLED
|
|
# if DEBUG set
|
|
if(NOT EXCEPTIONS)
|
|
add_compile_options("-fno-exceptions")
|
|
add_definitions(-DARM_COMPUTE_EXCEPTIONS_DISABLED)
|
|
endif()
|
|
|
|
# Link OpenMP libraries if OPENMP flag on
|
|
if(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_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_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_core "")
|
|
target_compile_options(arm_compute_core PRIVATE "-march=armv8.2-a+fp16")
|
|
target_compile_definitions(arm_compute_core PRIVATE ARM_COMPUTE_ENABLE_BF16)
|
|
target_include_directories(
|
|
arm_compute_core
|
|
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/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_core PUBLIC ${COMMON_CXX_FLAGS})
|
|
|
|
add_library(ArmCompute::Core ALIAS arm_compute_core)
|
|
target_link_libraries(
|
|
arm_compute_core PUBLIC arm_compute_sve arm_compute_sve2)
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Graph Library
|
|
|
|
add_library(arm_compute_graph "")
|
|
target_compile_options(arm_compute_graph PRIVATE "-march=armv8.2-a+fp16")
|
|
# 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/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)
|
|
|
|
# ---------------------------------------------------------------------
|
|
# 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=armv8.2-a+fp16")
|
|
|
|
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_core arm_compute_graph)
|
|
|
|
# ---------------------------------------------------------------------
|
|
# Validation Binary
|
|
|
|
if(BUILD_TESTING)
|
|
|
|
add_executable(arm_compute_validation "")
|
|
target_compile_options(arm_compute_validation PRIVATE "-march=armv8.2-a+fp16")
|
|
if(ENABLE_BF16_VALIDATION)
|
|
target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_BF16)
|
|
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_core 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=armv8.2-a+fp16")
|
|
|
|
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_core arm_compute_graph
|
|
arm_compute_validation_framework)
|
|
|
|
endif() # BUILD_TESTING
|
|
# ---------------------------------------------------------------------
|
|
# Examples Binaries
|
|
|
|
if(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=armv8.2-a+fp16")
|
|
set_target_properties(
|
|
${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
|
|
"${CMAKE_BINARY_DIR}/examples")
|
|
target_link_libraries(${test_name} PUBLIC arm_compute_core
|
|
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=armv8.2-a+fp16")
|
|
set_target_properties(
|
|
${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
|
|
"${CMAKE_BINARY_DIR}/examples")
|
|
target_link_libraries(${test_name} PUBLIC arm_compute_core)
|
|
endforeach()
|
|
|
|
endif() # BUILD_EXAMPLES
|