xref: /aosp_15_r20/external/ComputeLibrary/CMakeLists.txt (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1# Copyright (c) 2023 Arm Limited.
2#
3# SPDX-License-Identifier: MIT
4#
5# Permission is hereby granted, free of charge, to any person obtaining a copy
6# of this software and associated documentation files (the "Software"), to
7# deal in the Software without restriction, including without limitation the
8# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9# sell copies of the Software, and to permit persons to whom the Software is
10# furnished to do so, subject to the following conditions:
11#
12# The above copyright notice and this permission notice shall be included in all
13# copies or substantial portions of the Software.
14#
15# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21# SOFTWARE.
22
23cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
24
25# ---------------------------------------------------------------------
26# Project ArmCompute
27
28list(APPEND CMAKE_MESSAGE_CONTEXT ArmCompute)
29project(
30  ArmCompute
31  VERSION 28.0.8
32  DESCRIPTION
33    "The Arm Compute Library is a collection of low-level machine learning functions optimized for Arm® Cortex®-A CPU and Arm® Mali™ GPU architectures"
34  LANGUAGES C CXX ASM)
35
36include(GNUInstallDirs)
37
38set(CMAKE_C_STANDARD 99)
39set(CMAKE_C_STANDARD_REQUIRED ON)
40set(CMAKE_C_EXTENSIONS OFF)
41
42set(CMAKE_CXX_STANDARD 14)
43set(CMAKE_CXX_STANDARD_REQUIRED ON)
44set(CMAKE_CXX_EXTENSIONS OFF)
45
46list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
47include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Options.cmake)
48include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/Version.cmake)
49
50# Require at least gcc/g++ 11) CMAKE_CXX_COMPILER_VERSION OR
51if(CMAKE_C_COMPILER_VERSION VERSION_LESS 10.2 OR CMAKE_CXX_COMPILER_VERSION
52                                                 VERSION_LESS 10.2)
53  message(
54    FATAL_ERROR "gcc and g++ version => 10.2 is required for building project!")
55endif()
56
57# ---------------------------------------------------------------------
58# Configuration
59
60# Default to Release Build
61if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
62  set(CMAKE_BUILD_TYPE
63      "Release"
64      CACHE
65        STRING
66        "Choose build type, available options are: Debug, Release, RelWithDebInfo"
67        FORCE)
68endif()
69
70# ---------------------------------------------------------------------
71# Information
72
73message(STATUS "Arm Compute Library ${PROJECT_VERSION}")
74
75message(VERBOSE "-----------------------------------------------------")
76message(VERBOSE "Build information:")
77list(APPEND CMAKE_MESSAGE_INDENT "  ")
78message(VERBOSE "Host system: ${CMAKE_SYSTEM_NAME}")
79message(VERBOSE "Host processor: ${CMAKE_SYSTEM_PROCESSOR}")
80message(VERBOSE "Build path: ${CMAKE_CURRENT_BINARY_DIR}")
81message(VERBOSE "Enable OpenCL acceleration: ${ENABLE_OPENCL}")
82message(VERBOSE "Enable CPU acceleration: ${ENABLE_NEON}")
83list(POP_BACK CMAKE_MESSAGE_INDENT)
84message(VERBOSE "-----------------------------------------------------")
85
86# ---------------------------------------------------------------------
87# Compile options and features
88
89set(COMMON_CXX_FLAGS
90    -Wall
91    -DARCH_ARM
92    -Wextra
93    -Wdisabled-optimization
94    -Wformat=2
95    -Winit-self
96    -Wstrict-overflow=2
97    -Wswitch-default
98    -Woverloaded-virtual
99    -Wformat-security
100    -Wctor-dtor-privacy
101    -Wsign-promo
102    -Weffc++
103    -Wno-overlength-strings
104    -Wno-ignored-attributes
105    -Wlogical-op
106    -Wnoexcept
107    -Wstrict-null-sentinel
108    -Wno-misleading-indentation
109    -O3)
110
111# Disable note popups on compiler ABI changes
112if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
113  add_compile_options("-Wno-psabi")
114endif()
115
116# Compile with -Werror if WERROR set
117if(WERROR)
118  add_compile_options("-Werror")
119endif()
120
121# Compile with debug flags and define ARM_COMPUTE_ASSERTS_ENABLED if DEBUG set
122if(DEBUG)
123  add_compile_options("-O0" "-g" "-gdwarf-2")
124  add_definitions(-DARM_COMPUTE_ASSERTS_ENABLED) # ARM_COMPUTE_DEBUG_ENABLED ??
125endif()
126
127# Compile with -fno-exceptions flag and define ARM_COMPUTE_EXCEPTIONS_DISABLED
128# if DEBUG set
129if(NOT EXCEPTIONS)
130  add_compile_options("-fno-exceptions")
131  add_definitions(-DARM_COMPUTE_EXCEPTIONS_DISABLED)
132endif()
133
134# Link OpenMP libraries if OPENMP flag on
135if(OPENMP)
136  find_package(OpenMP)
137  if(OpenMP_CXX_FOUND)
138    link_libraries(OpenMP::OpenMP_CXX)
139    add_definitions(-DARM_COMPUTE_OPENMP_SCHEDULER)
140  else()
141    message(FATAL_ERROR "OPENMP was set but no OpenMP library was found!")
142  endif()
143endif()
144
145# ---------------------------------------------------------------------
146# SVE Library
147
148add_library(arm_compute_sve "")
149target_compile_options(arm_compute_sve
150                       PRIVATE "-march=armv8.2-a+sve+fp16+dotprod")
151target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_BF16)
152target_include_directories(
153  arm_compute_sve
154  PUBLIC $<INSTALL_INTERFACE:include>
155         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
156         ${CMAKE_CURRENT_SOURCE_DIR}
157  PUBLIC src
158         src/core/NEON/kernels/arm_conv
159         src/core/NEON/kernels/arm_gemm
160         src/core/NEON/kernels/assembly
161         src/core/cpu/kernels/assembly
162         src/cpu/kernels/assembly
163         src/core/NEON/kernels/arm_gemm/merges)
164
165# ---------------------------------------------------------------------
166# SVE2 Library
167
168add_library(arm_compute_sve2 "")
169target_compile_options(arm_compute_sve2
170                       PRIVATE "-march=armv8.6-a+sve2+fp16+dotprod")
171target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE2)
172target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_BF16)
173target_include_directories(
174  arm_compute_sve2
175  PUBLIC $<INSTALL_INTERFACE:include>
176         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
177         ${CMAKE_CURRENT_SOURCE_DIR}
178  PUBLIC src
179         src/core/NEON/kernels/arm_conv
180         src/core/NEON/kernels/arm_gemm
181         src/core/NEON/kernels/assembly
182         src/core/cpu/kernels/assembly
183         src/cpu/kernels/assembly
184         src/core/NEON/kernels/arm_gemm/merges)
185
186# ---------------------------------------------------------------------
187# Core Library
188
189add_library(arm_compute_core "")
190target_compile_options(arm_compute_core PRIVATE "-march=armv8.2-a+fp16")
191target_compile_definitions(arm_compute_core PRIVATE ARM_COMPUTE_ENABLE_BF16)
192target_include_directories(
193  arm_compute_core
194  PUBLIC $<INSTALL_INTERFACE:include>
195         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
196         ${CMAKE_CURRENT_SOURCE_DIR}
197  PRIVATE src
198          src/cpu/kernels/assembly
199          src/core/NEON/kernels/assembly
200          src/core/NEON/kernels/convolution/common
201          src/core/NEON/kernels/arm_conv/depthwise
202          src/core/NEON/kernels/convolution/winograd)
203target_compile_options(arm_compute_core PUBLIC ${COMMON_CXX_FLAGS})
204
205add_library(ArmCompute::Core ALIAS arm_compute_core)
206target_link_libraries(
207  arm_compute_core PUBLIC arm_compute_sve arm_compute_sve2)
208
209# ---------------------------------------------------------------------
210# Graph Library
211
212add_library(arm_compute_graph "")
213target_compile_options(arm_compute_graph PRIVATE "-march=armv8.2-a+fp16")
214# add_subdirectory(src/graph)
215
216target_include_directories(
217  arm_compute_graph
218  PUBLIC $<INSTALL_INTERFACE:include>
219         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
220         ${CMAKE_CURRENT_SOURCE_DIR}
221  PRIVATE src
222          src/cpu/kernels/assembly
223          src/core/NEON/kernels/assembly
224          src/core/NEON/kernels/convolution/common
225          src/core/NEON/kernels/arm_conv/depthwise
226          src/core/NEON/kernels/convolution/winograd)
227target_compile_options(arm_compute_graph PUBLIC ${COMMON_CXX_FLAGS})
228
229add_library(ArmCompute::Graph ALIAS arm_compute_graph)
230
231# ---------------------------------------------------------------------
232# Library Target Sources
233add_subdirectory(src)
234
235# ---------------------------------------------------------------------
236# Validation Framework Library
237add_library(arm_compute_validation_framework "")
238# target_compile_options(arm_compute_validation_framework PRIVATE
239# "-march=armv8.2-a")
240target_compile_options(arm_compute_validation_framework
241                       PRIVATE "-march=armv8.2-a+fp16")
242
243add_subdirectory(tests)
244target_include_directories(
245  arm_compute_validation_framework
246  PUBLIC $<INSTALL_INTERFACE:include>
247         $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
248         ${CMAKE_CURRENT_SOURCE_DIR})
249target_compile_options(arm_compute_validation_framework
250                       PUBLIC ${COMMON_CXX_FLAGS})
251                       target_link_libraries(
252                        arm_compute_validation_framework
253    PUBLIC arm_compute_core arm_compute_graph)
254
255# ---------------------------------------------------------------------
256# Validation Binary
257
258if(BUILD_TESTING)
259
260  add_executable(arm_compute_validation "")
261  target_compile_options(arm_compute_validation PRIVATE "-march=armv8.2-a+fp16")
262  if(ENABLE_BF16_VALIDATION)
263    target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_BF16)
264  endif()
265  add_subdirectory(tests/validation)
266  target_compile_options(arm_compute_validation PUBLIC ${COMMON_CXX_FLAGS})
267  set_target_properties(
268    arm_compute_validation PROPERTIES RUNTIME_OUTPUT_DIRECTORY
269                                      "${CMAKE_BINARY_DIR}/validation")
270  target_link_libraries(
271    arm_compute_validation
272    PUBLIC arm_compute_core arm_compute_graph arm_compute_validation_framework
273           arm_compute_sve)
274  target_link_directories(arm_compute_validation PUBLIC tests)
275
276  # ---------------------------------------------------------------------
277  # Benchmark Binary
278
279  add_executable(arm_compute_benchmark)
280  target_compile_options(arm_compute_benchmark PRIVATE "-march=armv8.2-a+fp16")
281
282  add_subdirectory(tests/benchmark)
283  target_compile_options(arm_compute_benchmark PUBLIC ${COMMON_CXX_FLAGS})
284  set_target_properties(
285    arm_compute_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY
286                                     "${CMAKE_BINARY_DIR}/validation")
287  target_link_libraries(
288    arm_compute_benchmark PUBLIC arm_compute_core arm_compute_graph
289                                 arm_compute_validation_framework)
290
291endif() # BUILD_TESTING
292# ---------------------------------------------------------------------
293# Examples Binaries
294
295if(BUILD_EXAMPLES)
296
297  add_subdirectory(examples)
298
299  # Graph Examples
300  foreach(test_name ${EXAMPLE_GRAPH_NAMES})
301    add_executable(
302      ${test_name} "examples/${test_name}.cpp" utils/Utils.cpp
303                   utils/GraphUtils.cpp utils/CommonGraphOptions.cpp)
304    target_compile_options(${test_name} PRIVATE "-march=armv8.2-a+fp16")
305    set_target_properties(
306      ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
307                              "${CMAKE_BINARY_DIR}/examples")
308    target_link_libraries(${test_name} PUBLIC arm_compute_core
309                                              arm_compute_graph arm_compute_sve)
310  endforeach()
311
312  # NEON Examples
313  foreach(test_name ${EXAMPLE_NEON_NAMES})
314    add_executable(${test_name} "examples/${test_name}.cpp" utils/Utils.cpp)
315    target_compile_options(${test_name} PRIVATE "-march=armv8.2-a+fp16")
316    set_target_properties(
317      ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
318                              "${CMAKE_BINARY_DIR}/examples")
319    target_link_libraries(${test_name} PUBLIC arm_compute_core)
320  endforeach()
321
322endif() # BUILD_EXAMPLES
323