blob: 8ab69f73115bc27bda220d6b77582a3d0a73f042 [file] [log] [blame]
David Svantessone0c42ef2022-12-15 16:25:57 +00001# 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
ramy.elgammal@arm.comcc4c2ca2023-06-28 16:04:04 +010031 VERSION 31.0.1
David Svantessone0c42ef2022-12-15 16:25:57 +000032 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
David Svantessonb5d6c282023-04-24 16:47:04 +000060set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -gdwarf-2 -DARM_COMPUTE_ASSERTS_ENABLED")
David Svantessone0c42ef2022-12-15 16:25:57 +000061# Default to Release Build
62if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
63 set(CMAKE_BUILD_TYPE
64 "Release"
65 CACHE
66 STRING
67 "Choose build type, available options are: Debug, Release, RelWithDebInfo"
68 FORCE)
69endif()
70
71# ---------------------------------------------------------------------
72# Information
73
74message(STATUS "Arm Compute Library ${PROJECT_VERSION}")
75
76message(VERBOSE "-----------------------------------------------------")
77message(VERBOSE "Build information:")
78list(APPEND CMAKE_MESSAGE_INDENT " ")
79message(VERBOSE "Host system: ${CMAKE_SYSTEM_NAME}")
80message(VERBOSE "Host processor: ${CMAKE_SYSTEM_PROCESSOR}")
81message(VERBOSE "Build path: ${CMAKE_CURRENT_BINARY_DIR}")
82message(VERBOSE "Enable OpenCL acceleration: ${ENABLE_OPENCL}")
83message(VERBOSE "Enable CPU acceleration: ${ENABLE_NEON}")
84list(POP_BACK CMAKE_MESSAGE_INDENT)
85message(VERBOSE "-----------------------------------------------------")
86
87# ---------------------------------------------------------------------
88# Compile options and features
89
90set(COMMON_CXX_FLAGS
91 -Wall
92 -DARCH_ARM
93 -Wextra
94 -Wdisabled-optimization
95 -Wformat=2
96 -Winit-self
97 -Wstrict-overflow=2
98 -Wswitch-default
99 -Woverloaded-virtual
100 -Wformat-security
101 -Wctor-dtor-privacy
102 -Wsign-promo
103 -Weffc++
104 -Wno-overlength-strings
David Svantesson45370892023-02-22 11:08:57 +0000105 -Wno-ignored-attributes
106 -Wlogical-op
107 -Wnoexcept
108 -Wstrict-null-sentinel
109 -Wno-misleading-indentation
110 -O3)
David Svantessone0c42ef2022-12-15 16:25:57 +0000111
112# Disable note popups on compiler ABI changes
113if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
114 add_compile_options("-Wno-psabi")
115endif()
116
David Svantessonb5d6c282023-04-24 16:47:04 +0000117# Compile with -Werror if ARM_COMPUTE_WERROR set
118if(ARM_COMPUTE_WERROR)
David Svantessone0c42ef2022-12-15 16:25:57 +0000119 add_compile_options("-Werror")
120endif()
121
David Svantessone0c42ef2022-12-15 16:25:57 +0000122# Compile with -fno-exceptions flag and define ARM_COMPUTE_EXCEPTIONS_DISABLED
David Svantessonb5d6c282023-04-24 16:47:04 +0000123# if ARM_COMPUTE_EXCEPTIONS not set
124if(NOT ARM_COMPUTE_EXCEPTIONS)
David Svantessone0c42ef2022-12-15 16:25:57 +0000125 add_compile_options("-fno-exceptions")
126 add_definitions(-DARM_COMPUTE_EXCEPTIONS_DISABLED)
127endif()
128
David Svantessonb5d6c282023-04-24 16:47:04 +0000129# Link OpenMP libraries if ARM_COMPUTE_OPENMP set
130if(ARM_COMPUTE_OPENMP)
David Svantessone0c42ef2022-12-15 16:25:57 +0000131 find_package(OpenMP)
132 if(OpenMP_CXX_FOUND)
133 link_libraries(OpenMP::OpenMP_CXX)
134 add_definitions(-DARM_COMPUTE_OPENMP_SCHEDULER)
135 else()
136 message(FATAL_ERROR "OPENMP was set but no OpenMP library was found!")
137 endif()
138endif()
139
140# ---------------------------------------------------------------------
141# SVE Library
142
143add_library(arm_compute_sve "")
144target_compile_options(arm_compute_sve
145 PRIVATE "-march=armv8.2-a+sve+fp16+dotprod")
David Svantesson45370892023-02-22 11:08:57 +0000146target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_BF16)
David Svantesson3b162e52023-03-28 14:13:32 +0000147target_compile_definitions(arm_compute_sve PRIVATE ENABLE_SVE)
148target_compile_definitions(arm_compute_sve PRIVATE ARM_COMPUTE_ENABLE_SVE)
David Svantessone0c42ef2022-12-15 16:25:57 +0000149target_include_directories(
150 arm_compute_sve
151 PUBLIC $<INSTALL_INTERFACE:include>
152 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
153 ${CMAKE_CURRENT_SOURCE_DIR}
154 PUBLIC src
155 src/core/NEON/kernels/arm_conv
156 src/core/NEON/kernels/arm_gemm
157 src/core/NEON/kernels/assembly
158 src/core/cpu/kernels/assembly
159 src/cpu/kernels/assembly
160 src/core/NEON/kernels/arm_gemm/merges)
161
162# ---------------------------------------------------------------------
163# SVE2 Library
164
165add_library(arm_compute_sve2 "")
166target_compile_options(arm_compute_sve2
167 PRIVATE "-march=armv8.6-a+sve2+fp16+dotprod")
David Svantessone0c42ef2022-12-15 16:25:57 +0000168target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE2)
David Svantesson45370892023-02-22 11:08:57 +0000169target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_BF16)
David Svantesson3b162e52023-03-28 14:13:32 +0000170target_compile_definitions(arm_compute_sve2 PRIVATE ENABLE_SVE)
171target_compile_definitions(arm_compute_sve2 PRIVATE ARM_COMPUTE_ENABLE_SVE)
David Svantessone0c42ef2022-12-15 16:25:57 +0000172target_include_directories(
173 arm_compute_sve2
174 PUBLIC $<INSTALL_INTERFACE:include>
175 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
176 ${CMAKE_CURRENT_SOURCE_DIR}
177 PUBLIC src
178 src/core/NEON/kernels/arm_conv
179 src/core/NEON/kernels/arm_gemm
180 src/core/NEON/kernels/assembly
181 src/core/cpu/kernels/assembly
182 src/cpu/kernels/assembly
183 src/core/NEON/kernels/arm_gemm/merges)
184
185# ---------------------------------------------------------------------
186# Core Library
187
David Svantesson604a35b2023-06-08 10:05:59 +0000188add_library(arm_compute "")
189target_compile_options(arm_compute PRIVATE "-march=${ARM_COMPUTE_ARCH}")
190target_compile_definitions(arm_compute PRIVATE ARM_COMPUTE_ENABLE_BF16)
191target_compile_definitions(arm_compute PRIVATE ENABLE_SVE)
192target_compile_definitions(arm_compute PRIVATE ARM_COMPUTE_ENABLE_SVE)
David Svantessone0c42ef2022-12-15 16:25:57 +0000193target_include_directories(
David Svantesson604a35b2023-06-08 10:05:59 +0000194 arm_compute
David Svantessone0c42ef2022-12-15 16:25:57 +0000195 PUBLIC $<INSTALL_INTERFACE:include>
196 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
197 ${CMAKE_CURRENT_SOURCE_DIR}
198 PRIVATE src
199 src/cpu/kernels/assembly
200 src/core/NEON/kernels/assembly
201 src/core/NEON/kernels/convolution/common
202 src/core/NEON/kernels/arm_conv/depthwise
203 src/core/NEON/kernels/convolution/winograd)
David Svantesson604a35b2023-06-08 10:05:59 +0000204target_compile_options(arm_compute PUBLIC ${COMMON_CXX_FLAGS})
David Svantessone0c42ef2022-12-15 16:25:57 +0000205
David Svantesson604a35b2023-06-08 10:05:59 +0000206add_library(ArmCompute::Core ALIAS arm_compute)
David Svantesson45370892023-02-22 11:08:57 +0000207target_link_libraries(
David Svantesson604a35b2023-06-08 10:05:59 +0000208 arm_compute PUBLIC arm_compute_sve arm_compute_sve2)
David Svantessone0c42ef2022-12-15 16:25:57 +0000209
210# ---------------------------------------------------------------------
211# Graph Library
212
213add_library(arm_compute_graph "")
David Svantesson604a35b2023-06-08 10:05:59 +0000214target_compile_options(arm_compute_graph PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantesson3b162e52023-03-28 14:13:32 +0000215target_compile_definitions(arm_compute_graph PRIVATE ENABLE_SVE)
216target_compile_definitions(arm_compute_graph PRIVATE ARM_COMPUTE_ENABLE_SVE)
David Svantessone0c42ef2022-12-15 16:25:57 +0000217# add_subdirectory(src/graph)
218
219target_include_directories(
220 arm_compute_graph
221 PUBLIC $<INSTALL_INTERFACE:include>
222 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
223 ${CMAKE_CURRENT_SOURCE_DIR}
224 PRIVATE src
225 src/cpu/kernels/assembly
226 src/core/NEON/kernels/assembly
227 src/core/NEON/kernels/convolution/common
228 src/core/NEON/kernels/arm_conv/depthwise
229 src/core/NEON/kernels/convolution/winograd)
230target_compile_options(arm_compute_graph PUBLIC ${COMMON_CXX_FLAGS})
231
232add_library(ArmCompute::Graph ALIAS arm_compute_graph)
233
234# ---------------------------------------------------------------------
235# Library Target Sources
236add_subdirectory(src)
237
David Svantessonb5d6c282023-04-24 16:47:04 +0000238if(ARM_COMPUTE_BUILD_TESTING)
239 # ---------------------------------------------------------------------
240 # Validation Framework Library
241 add_library(arm_compute_validation_framework "")
242 # target_compile_options(arm_compute_validation_framework PRIVATE
243 # "-march=armv8.2-a")
244 target_compile_options(arm_compute_validation_framework
David Svantesson604a35b2023-06-08 10:05:59 +0000245 PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000246
David Svantessonb5d6c282023-04-24 16:47:04 +0000247 add_subdirectory(tests)
248 target_include_directories(
249 arm_compute_validation_framework
250 PUBLIC $<INSTALL_INTERFACE:include>
251 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
252 ${CMAKE_CURRENT_SOURCE_DIR})
253 target_compile_options(arm_compute_validation_framework
254 PUBLIC ${COMMON_CXX_FLAGS})
255 target_link_libraries(
256 arm_compute_validation_framework
David Svantesson604a35b2023-06-08 10:05:59 +0000257 PUBLIC arm_compute arm_compute_graph)
David Svantessone0c42ef2022-12-15 16:25:57 +0000258
David Svantessonb5d6c282023-04-24 16:47:04 +0000259 # ---------------------------------------------------------------------
260 # Validation Binary
David Svantessone0c42ef2022-12-15 16:25:57 +0000261
262 add_executable(arm_compute_validation "")
David Svantesson604a35b2023-06-08 10:05:59 +0000263 target_compile_options(arm_compute_validation PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessonb5d6c282023-04-24 16:47:04 +0000264 if(ARM_COMPUTE_ENABLE_BF16_VALIDATION)
David Svantesson45370892023-02-22 11:08:57 +0000265 target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_BF16)
266 endif()
David Svantessonb5d6c282023-04-24 16:47:04 +0000267 if(ARM_COMPUTE_ENABLE_SVE_VALIDATION)
David Svantesson3b162e52023-03-28 14:13:32 +0000268 target_compile_definitions(arm_compute_validation PRIVATE ENABLE_SVE)
269 target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_SVE)
270 endif()
David Svantessone0c42ef2022-12-15 16:25:57 +0000271 add_subdirectory(tests/validation)
272 target_compile_options(arm_compute_validation PUBLIC ${COMMON_CXX_FLAGS})
273 set_target_properties(
274 arm_compute_validation PROPERTIES RUNTIME_OUTPUT_DIRECTORY
275 "${CMAKE_BINARY_DIR}/validation")
276 target_link_libraries(
277 arm_compute_validation
David Svantesson604a35b2023-06-08 10:05:59 +0000278 PUBLIC arm_compute arm_compute_graph arm_compute_validation_framework
David Svantessone0c42ef2022-12-15 16:25:57 +0000279 arm_compute_sve)
280 target_link_directories(arm_compute_validation PUBLIC tests)
281
282 # ---------------------------------------------------------------------
283 # Benchmark Binary
284
285 add_executable(arm_compute_benchmark)
David Svantesson604a35b2023-06-08 10:05:59 +0000286 target_compile_options(arm_compute_benchmark PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000287
288 add_subdirectory(tests/benchmark)
289 target_compile_options(arm_compute_benchmark PUBLIC ${COMMON_CXX_FLAGS})
290 set_target_properties(
291 arm_compute_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY
292 "${CMAKE_BINARY_DIR}/validation")
293 target_link_libraries(
David Svantesson604a35b2023-06-08 10:05:59 +0000294 arm_compute_benchmark PUBLIC arm_compute arm_compute_graph
David Svantessone0c42ef2022-12-15 16:25:57 +0000295 arm_compute_validation_framework)
296
David Svantessonb5d6c282023-04-24 16:47:04 +0000297endif() # ARM_COMPUTE_BUILD_TESTING
David Svantessone0c42ef2022-12-15 16:25:57 +0000298# ---------------------------------------------------------------------
299# Examples Binaries
300
David Svantessonb5d6c282023-04-24 16:47:04 +0000301if(ARM_COMPUTE_BUILD_EXAMPLES)
David Svantessone0c42ef2022-12-15 16:25:57 +0000302
303 add_subdirectory(examples)
304
305 # Graph Examples
306 foreach(test_name ${EXAMPLE_GRAPH_NAMES})
307 add_executable(
308 ${test_name} "examples/${test_name}.cpp" utils/Utils.cpp
309 utils/GraphUtils.cpp utils/CommonGraphOptions.cpp)
David Svantesson604a35b2023-06-08 10:05:59 +0000310 target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000311 set_target_properties(
312 ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
313 "${CMAKE_BINARY_DIR}/examples")
David Svantesson604a35b2023-06-08 10:05:59 +0000314 target_link_libraries(${test_name} PUBLIC arm_compute
David Svantessone0c42ef2022-12-15 16:25:57 +0000315 arm_compute_graph arm_compute_sve)
316 endforeach()
317
318 # NEON Examples
319 foreach(test_name ${EXAMPLE_NEON_NAMES})
320 add_executable(${test_name} "examples/${test_name}.cpp" utils/Utils.cpp)
David Svantesson604a35b2023-06-08 10:05:59 +0000321 target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000322 set_target_properties(
323 ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
324 "${CMAKE_BINARY_DIR}/examples")
David Svantesson604a35b2023-06-08 10:05:59 +0000325 target_link_libraries(${test_name} PUBLIC arm_compute)
David Svantessone0c42ef2022-12-15 16:25:57 +0000326 endforeach()
327
David Svantessonb5d6c282023-04-24 16:47:04 +0000328endif() # ARM_COMPUTE_BUILD_EXAMPLES