# 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 36.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 -DARM_COMPUTE_DEBUG_ENABLED") set(CMAKE_CXX_FLAGS_RELEASE "-O3") # 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) # 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 $ $ ${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 $ $ ${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 $ $ ${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 $ $ ${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 $ $ ${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