blob: c67479ce41c74486938d523f5f3142be38169f9a [file] [log] [blame]
Felix Thomasmathibalan3a704ae2024-01-18 09:11:13 +00001# Copyright (c) 2023-2024 Arm Limited.
David Svantessone0c42ef2022-12-15 16:25:57 +00002#
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
Michael Kozlov5057ce92024-04-17 14:34:46 +010031 VERSION 36.0.0
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
Jonathan Deakina668f9f2024-01-24 09:15:38 +000060set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g -gdwarf-2 -DARM_COMPUTE_ASSERTS_ENABLED -DARM_COMPUTE_DEBUG_ENABLED")
Jonathan Deakin277def42024-01-12 13:33:32 +000061set(CMAKE_CXX_FLAGS_RELEASE "-O3")
David Svantessone0c42ef2022-12-15 16:25:57 +000062# Default to Release Build
63if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
64 set(CMAKE_BUILD_TYPE
65 "Release"
66 CACHE
67 STRING
68 "Choose build type, available options are: Debug, Release, RelWithDebInfo"
69 FORCE)
70endif()
71
72# ---------------------------------------------------------------------
73# Information
74
75message(STATUS "Arm Compute Library ${PROJECT_VERSION}")
76
77message(VERBOSE "-----------------------------------------------------")
78message(VERBOSE "Build information:")
79list(APPEND CMAKE_MESSAGE_INDENT " ")
80message(VERBOSE "Host system: ${CMAKE_SYSTEM_NAME}")
81message(VERBOSE "Host processor: ${CMAKE_SYSTEM_PROCESSOR}")
82message(VERBOSE "Build path: ${CMAKE_CURRENT_BINARY_DIR}")
83message(VERBOSE "Enable OpenCL acceleration: ${ENABLE_OPENCL}")
84message(VERBOSE "Enable CPU acceleration: ${ENABLE_NEON}")
85list(POP_BACK CMAKE_MESSAGE_INDENT)
86message(VERBOSE "-----------------------------------------------------")
87
88# ---------------------------------------------------------------------
89# Compile options and features
90
91set(COMMON_CXX_FLAGS
92 -Wall
93 -DARCH_ARM
94 -Wextra
95 -Wdisabled-optimization
96 -Wformat=2
97 -Winit-self
98 -Wstrict-overflow=2
99 -Wswitch-default
100 -Woverloaded-virtual
101 -Wformat-security
102 -Wctor-dtor-privacy
103 -Wsign-promo
104 -Weffc++
105 -Wno-overlength-strings
David Svantesson45370892023-02-22 11:08:57 +0000106 -Wno-ignored-attributes
107 -Wlogical-op
108 -Wnoexcept
109 -Wstrict-null-sentinel
Jonathan Deakin277def42024-01-12 13:33:32 +0000110 -Wno-misleading-indentation)
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 Svantesson90d15b92023-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 Svantesson90d15b92023-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
Michael Tyler74921ee2023-04-12 17:43:17 +0100200 src/core/NEON/kernels/arm_gemm
David Svantessone0c42ef2022-12-15 16:25:57 +0000201 src/core/NEON/kernels/assembly
202 src/core/NEON/kernels/convolution/common
203 src/core/NEON/kernels/arm_conv/depthwise
204 src/core/NEON/kernels/convolution/winograd)
David Svantesson90d15b92023-06-08 10:05:59 +0000205target_compile_options(arm_compute PUBLIC ${COMMON_CXX_FLAGS})
David Svantessone0c42ef2022-12-15 16:25:57 +0000206
David Svantesson90d15b92023-06-08 10:05:59 +0000207add_library(ArmCompute::Core ALIAS arm_compute)
David Svantesson45370892023-02-22 11:08:57 +0000208target_link_libraries(
David Svantesson90d15b92023-06-08 10:05:59 +0000209 arm_compute PUBLIC arm_compute_sve arm_compute_sve2)
David Svantessone0c42ef2022-12-15 16:25:57 +0000210
211# ---------------------------------------------------------------------
212# Graph Library
213
214add_library(arm_compute_graph "")
David Svantesson90d15b92023-06-08 10:05:59 +0000215target_compile_options(arm_compute_graph PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantesson3b162e52023-03-28 14:13:32 +0000216target_compile_definitions(arm_compute_graph PRIVATE ENABLE_SVE)
217target_compile_definitions(arm_compute_graph PRIVATE ARM_COMPUTE_ENABLE_SVE)
David Svantessone0c42ef2022-12-15 16:25:57 +0000218# add_subdirectory(src/graph)
219
220target_include_directories(
221 arm_compute_graph
222 PUBLIC $<INSTALL_INTERFACE:include>
223 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
224 ${CMAKE_CURRENT_SOURCE_DIR}
225 PRIVATE src
226 src/cpu/kernels/assembly
Michael Tyler74921ee2023-04-12 17:43:17 +0100227 src/core/NEON/kernels/arm_gemm
David Svantessone0c42ef2022-12-15 16:25:57 +0000228 src/core/NEON/kernels/assembly
229 src/core/NEON/kernels/convolution/common
230 src/core/NEON/kernels/arm_conv/depthwise
231 src/core/NEON/kernels/convolution/winograd)
232target_compile_options(arm_compute_graph PUBLIC ${COMMON_CXX_FLAGS})
233
234add_library(ArmCompute::Graph ALIAS arm_compute_graph)
235
236# ---------------------------------------------------------------------
237# Library Target Sources
238add_subdirectory(src)
239
David Svantessonb5d6c282023-04-24 16:47:04 +0000240if(ARM_COMPUTE_BUILD_TESTING)
241 # ---------------------------------------------------------------------
242 # Validation Framework Library
243 add_library(arm_compute_validation_framework "")
244 # target_compile_options(arm_compute_validation_framework PRIVATE
245 # "-march=armv8.2-a")
246 target_compile_options(arm_compute_validation_framework
David Svantesson90d15b92023-06-08 10:05:59 +0000247 PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000248
David Svantessonb5d6c282023-04-24 16:47:04 +0000249 add_subdirectory(tests)
250 target_include_directories(
251 arm_compute_validation_framework
252 PUBLIC $<INSTALL_INTERFACE:include>
253 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
254 ${CMAKE_CURRENT_SOURCE_DIR})
255 target_compile_options(arm_compute_validation_framework
256 PUBLIC ${COMMON_CXX_FLAGS})
257 target_link_libraries(
258 arm_compute_validation_framework
David Svantesson90d15b92023-06-08 10:05:59 +0000259 PUBLIC arm_compute arm_compute_graph)
David Svantessone0c42ef2022-12-15 16:25:57 +0000260
David Svantessonb5d6c282023-04-24 16:47:04 +0000261 # ---------------------------------------------------------------------
262 # Validation Binary
David Svantessone0c42ef2022-12-15 16:25:57 +0000263
264 add_executable(arm_compute_validation "")
David Svantesson90d15b92023-06-08 10:05:59 +0000265 target_compile_options(arm_compute_validation PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessonb5d6c282023-04-24 16:47:04 +0000266 if(ARM_COMPUTE_ENABLE_BF16_VALIDATION)
David Svantesson45370892023-02-22 11:08:57 +0000267 target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_BF16)
268 endif()
David Svantessonb5d6c282023-04-24 16:47:04 +0000269 if(ARM_COMPUTE_ENABLE_SVE_VALIDATION)
David Svantesson3b162e52023-03-28 14:13:32 +0000270 target_compile_definitions(arm_compute_validation PRIVATE ENABLE_SVE)
271 target_compile_definitions(arm_compute_validation PRIVATE ARM_COMPUTE_ENABLE_SVE)
272 endif()
David Svantessone0c42ef2022-12-15 16:25:57 +0000273 add_subdirectory(tests/validation)
274 target_compile_options(arm_compute_validation PUBLIC ${COMMON_CXX_FLAGS})
275 set_target_properties(
276 arm_compute_validation PROPERTIES RUNTIME_OUTPUT_DIRECTORY
277 "${CMAKE_BINARY_DIR}/validation")
278 target_link_libraries(
279 arm_compute_validation
David Svantesson90d15b92023-06-08 10:05:59 +0000280 PUBLIC arm_compute arm_compute_graph arm_compute_validation_framework
David Svantessone0c42ef2022-12-15 16:25:57 +0000281 arm_compute_sve)
282 target_link_directories(arm_compute_validation PUBLIC tests)
283
284 # ---------------------------------------------------------------------
285 # Benchmark Binary
286
287 add_executable(arm_compute_benchmark)
David Svantesson90d15b92023-06-08 10:05:59 +0000288 target_compile_options(arm_compute_benchmark PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000289
290 add_subdirectory(tests/benchmark)
291 target_compile_options(arm_compute_benchmark PUBLIC ${COMMON_CXX_FLAGS})
292 set_target_properties(
293 arm_compute_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY
294 "${CMAKE_BINARY_DIR}/validation")
295 target_link_libraries(
David Svantesson90d15b92023-06-08 10:05:59 +0000296 arm_compute_benchmark PUBLIC arm_compute arm_compute_graph
David Svantessone0c42ef2022-12-15 16:25:57 +0000297 arm_compute_validation_framework)
298
David Svantessonb5d6c282023-04-24 16:47:04 +0000299endif() # ARM_COMPUTE_BUILD_TESTING
David Svantessone0c42ef2022-12-15 16:25:57 +0000300# ---------------------------------------------------------------------
301# Examples Binaries
302
David Svantessonb5d6c282023-04-24 16:47:04 +0000303if(ARM_COMPUTE_BUILD_EXAMPLES)
David Svantessone0c42ef2022-12-15 16:25:57 +0000304
305 add_subdirectory(examples)
306
307 # Graph Examples
308 foreach(test_name ${EXAMPLE_GRAPH_NAMES})
309 add_executable(
310 ${test_name} "examples/${test_name}.cpp" utils/Utils.cpp
311 utils/GraphUtils.cpp utils/CommonGraphOptions.cpp)
David Svantesson90d15b92023-06-08 10:05:59 +0000312 target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000313 set_target_properties(
314 ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
315 "${CMAKE_BINARY_DIR}/examples")
David Svantesson90d15b92023-06-08 10:05:59 +0000316 target_link_libraries(${test_name} PUBLIC arm_compute
David Svantessone0c42ef2022-12-15 16:25:57 +0000317 arm_compute_graph arm_compute_sve)
318 endforeach()
319
320 # NEON Examples
321 foreach(test_name ${EXAMPLE_NEON_NAMES})
322 add_executable(${test_name} "examples/${test_name}.cpp" utils/Utils.cpp)
David Svantesson90d15b92023-06-08 10:05:59 +0000323 target_compile_options(${test_name} PRIVATE "-march=${ARM_COMPUTE_ARCH}")
David Svantessone0c42ef2022-12-15 16:25:57 +0000324 set_target_properties(
325 ${test_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY
326 "${CMAKE_BINARY_DIR}/examples")
David Svantesson90d15b92023-06-08 10:05:59 +0000327 target_link_libraries(${test_name} PUBLIC arm_compute)
David Svantessone0c42ef2022-12-15 16:25:57 +0000328 endforeach()
329
David Svantessonb5d6c282023-04-24 16:47:04 +0000330endif() # ARM_COMPUTE_BUILD_EXAMPLES