Skip to content

Commit ba7b052

Browse files
committed
feat: Single ISA CMake build
Resolves: COMPMID-8547 Change-Id: I82d3e74b28284a4052a2042f47d2eff896cc9c38 Signed-off-by: Syed Wajahat Abbas Naqvi <syedwajahatabbas.naqvi@arm.com>
1 parent 8069f67 commit ba7b052

File tree

4 files changed

+265
-60
lines changed

4 files changed

+265
-60
lines changed

CMakeLists.txt

Lines changed: 144 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,24 @@ option(ARM_COMPUTE_ENABLE_CODE_COVERAGE "Enable code coverage." OFF)
4949
option(ARM_COMPUTE_ENABLE_SANITIZERS "Enable sanitizers." OFF)
5050
option(ARM_COMPUTE_USE_LIBCXX "Use libcxx instead of the default stdlib." OFF)
5151

52-
# * Set architecture.
53-
set(ARM_COMPUTE_ARCH armv8-a CACHE STRING "Architecture (march) for core library.")
54-
set(ARM_COMPUTE_CORE_FP16_ARCH armv8.2-a+fp16 CACHE STRING "Architecture (march) for core library that require fp16 support.")
55-
set(ARM_COMPUTE_SVE_ARCH armv8.2-a+sve+fp16+dotprod CACHE STRING "Architecture (march) for sve library.")
56-
set(ARM_COMPUTE_SVE2_ARCH armv8.6-a+sve2+fp16+dotprod CACHE STRING "Architecture (march) for sve2 library.")
52+
# * Build mode: multi-ISA (default) or single-ISA
53+
option(ACL_MULTI_ISA "Build Multi-ISA as default" ON)
54+
set(ACL_ARCH_ISA "armv8.6-a" CACHE STRING "Architecture (armv8-a, armv8.2-a, armv8.6-a)")
55+
set_property(CACHE ACL_ARCH_ISA PROPERTY STRINGS armv8-a armv8.2-a armv8.6-a)
56+
set(ACL_ARCH_FEATURES "" CACHE STRING "Comma separated features list (sve,sve2,sme2)")
57+
58+
# * Arch features
59+
option(ACL_BUILD_SVE "Enable SVE support" OFF)
60+
option(ACL_BUILD_SVE2 "Enable SVE2 support" OFF)
61+
option(ACL_BUILD_SME2 "Enable SME2 support" OFF)
62+
63+
# * Arch feature probing for single-ISA
64+
include(CheckCXXCompilerFlag)
65+
check_cxx_compiler_flag("-march=armv8-a" ACL_HAS_MARCH_V8A)
66+
check_cxx_compiler_flag("-march=armv8.2-a+fp16+dotprod" ACL_HAS_MARCH_V82_F16_DOT)
67+
check_cxx_compiler_flag("-march=armv8.6-a+sve+sve2+fp16+dotprod+i8mm" ACL_HAS_MARCH_V86_ALL)
68+
check_cxx_compiler_flag("-march=armv8.2-a" ACL_HAS_MARCH_V82_BASE)
69+
check_cxx_compiler_flag("-march=armv8.6-a" ACL_HAS_MARCH_V86_BASE)
5770

5871
# * Set variables.
5972
set(ARM_COMPUTE_C_STANDARD 99 CACHE STRING "C Standard to use for the library.")
@@ -72,6 +85,36 @@ include(${CMAKE_CURRENT_LIST_DIR}/cmake/configurations.cmake)
7285
include(${CMAKE_CURRENT_LIST_DIR}/cmake/compilers/setup.cmake)
7386
include(${CMAKE_CURRENT_LIST_DIR}/cmake/version.cmake)
7487

88+
# * Set architecture.
89+
if(ACL_MULTI_ISA)
90+
set(ARM_COMPUTE_ARCH "-march=armv8-a")
91+
set(ARM_COMPUTE_CORE_FP16_ARCH "-march=armv8.2-a+fp16+dotprod")
92+
set(ARM_COMPUTE_SVE_ARCH "-march=armv8.2-a+sve+fp16+dotprod")
93+
set(ARM_COMPUTE_SVE2_ARCH "-march=armv8.6-a+sve2+fp16+dotprod+i8mm")
94+
message(STATUS "Multi-ISA selected, requested features list will be ignored.")
95+
else()
96+
set(ACL_MARCH "")
97+
if(ACL_BUILD_SME2 OR ACL_BUILD_SVE2)
98+
set(ACL_MARCH "+sve2+fp16+dotprod+i8mm")
99+
elseif(ACL_BUILD_SVE)
100+
set(ACL_MARCH "+sve+fp16+dotprod")
101+
elseif(ACL_ARCH_ISA STREQUAL "armv8.2-a" OR ACL_ARCH_ISA STREQUAL "armv8.6-a")
102+
set(ACL_MARCH "+fp16+dotprod")
103+
endif()
104+
105+
set(ARM_COMPUTE_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for core library.")
106+
set(ARM_COMPUTE_CORE_FP16_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for core library with fp16 support.")
107+
set(ARM_COMPUTE_SVE_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for SVE library.")
108+
set(ARM_COMPUTE_SVE2_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for SVE2 library.")
109+
message(STATUS "Using arch: ${ARM_COMPUTE_ARCH}")
110+
endif()
111+
112+
if(ACL_ARCH_ISA STREQUAL "armv8-a" AND (ACL_MULTI_ISA OR ACL_BUILD_SVE OR ACL_BUILD_SVE2 OR ACL_BUILD_SME2))
113+
message(FATAL_ERROR
114+
"Invalid configuration: '${ACL_ARCH_ISA}' does not support requested features"
115+
)
116+
endif()
117+
75118
if(ARM_COMPUTE_ENABLE_OPENMP)
76119
find_package(OpenMP REQUIRED)
77120
endif()
@@ -126,25 +169,33 @@ set(
126169
${CMAKE_CURRENT_LIST_DIR}/src/core/NEON/kernels/arm_gemm/merges
127170
)
128171

129-
add_library(arm_compute_sve OBJECT)
130-
set_target_properties(
131-
arm_compute_sve
132-
PROPERTIES
133-
COMPILE_OPTIONS "${ARM_COMPUTE_SVE_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
134-
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
135-
INCLUDE_DIRECTORIES "${ARM_COMPUTE_SVE_COMMON_INCLUDE}"
136-
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
137-
)
172+
if(ACL_MULTI_ISA OR ACL_BUILD_SVE)
173+
add_library(arm_compute_sve OBJECT)
174+
set_target_properties(
175+
arm_compute_sve
176+
PROPERTIES
177+
COMPILE_OPTIONS "${ARM_COMPUTE_SVE_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
178+
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
179+
INCLUDE_DIRECTORIES "${ARM_COMPUTE_SVE_COMMON_INCLUDE}"
180+
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
181+
)
182+
else()
183+
add_library(arm_compute_sve OBJECT EXCLUDE_FROM_ALL)
184+
endif()
138185

139-
add_library(arm_compute_sve2 OBJECT)
140-
set_target_properties(
141-
arm_compute_sve2
142-
PROPERTIES
143-
COMPILE_OPTIONS "${ARM_COMPUTE_SVE2_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
144-
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
145-
INCLUDE_DIRECTORIES "${ARM_COMPUTE_SVE_COMMON_INCLUDE}"
146-
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
147-
)
186+
if(ACL_MULTI_ISA OR ACL_BUILD_SVE2)
187+
add_library(arm_compute_sve2 OBJECT)
188+
set_target_properties(
189+
arm_compute_sve2
190+
PROPERTIES
191+
COMPILE_OPTIONS "${ARM_COMPUTE_SVE2_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
192+
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
193+
INCLUDE_DIRECTORIES "${ARM_COMPUTE_SVE_COMMON_INCLUDE}"
194+
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
195+
)
196+
else()
197+
add_library(arm_compute_sve2 OBJECT EXCLUDE_FROM_ALL)
198+
endif()
148199

149200
add_library(arm_compute_core OBJECT)
150201
set_target_properties(
@@ -156,15 +207,19 @@ set_target_properties(
156207
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
157208
)
158209

159-
add_library(arm_compute_core_fp16 OBJECT)
160-
set_target_properties(
161-
arm_compute_core_fp16
162-
PROPERTIES
163-
COMPILE_OPTIONS "${ARM_COMPUTE_CORE_FP16_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
164-
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
165-
INCLUDE_DIRECTORIES "${ARM_COMPUTE_INCLUDE}"
166-
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
167-
)
210+
if(NOT (ACL_ARCH_ISA STREQUAL "armv8-a"))
211+
add_library(arm_compute_core_fp16 OBJECT)
212+
set_target_properties(
213+
arm_compute_core_fp16
214+
PROPERTIES
215+
COMPILE_OPTIONS "${ARM_COMPUTE_CORE_FP16_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
216+
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
217+
INCLUDE_DIRECTORIES "${ARM_COMPUTE_INCLUDE}"
218+
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
219+
)
220+
else()
221+
add_library(arm_compute_core_fp16 OBJECT EXCLUDE_FROM_ALL)
222+
endif()
168223

169224
add_library(arm_compute_graph ${ARM_COMPUTE_LIB_BUILD_TYPE})
170225
set_target_properties(
@@ -176,14 +231,52 @@ set_target_properties(
176231
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}$<IF:$<PLATFORM_ID:Darwin>,;arm_compute,>"
177232
)
178233

179-
add_library(
180-
arm_compute
181-
${ARM_COMPUTE_LIB_BUILD_TYPE}
182-
$<TARGET_OBJECTS:arm_compute_core>
183-
$<TARGET_OBJECTS:arm_compute_core_fp16>
184-
$<TARGET_OBJECTS:arm_compute_sve>
185-
$<TARGET_OBJECTS:arm_compute_sve2>
186-
)
234+
if(ACL_MULTI_ISA)
235+
add_library(arm_compute ${ARM_COMPUTE_LIB_BUILD_TYPE}
236+
$<TARGET_OBJECTS:arm_compute_core>
237+
$<TARGET_OBJECTS:arm_compute_core_fp16>
238+
$<TARGET_OBJECTS:arm_compute_sve>
239+
$<TARGET_OBJECTS:arm_compute_sve2>
240+
)
241+
else()
242+
set(lib_objs $<TARGET_OBJECTS:arm_compute_core>)
243+
244+
if(ACL_ARCH_ISA STREQUAL "armv8-a")
245+
# base
246+
247+
elseif(ACL_ARCH_ISA STREQUAL "armv8.2-a")
248+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_core_fp16>)
249+
if(ACL_BUILD_SVE)
250+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve>)
251+
endif()
252+
if(ACL_BUILD_SVE2)
253+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve2>)
254+
endif()
255+
256+
elseif(ACL_ARCH_ISA STREQUAL "armv8.6-a")
257+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_core_fp16>)
258+
if(ACL_BUILD_SVE)
259+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve>)
260+
endif()
261+
if(ACL_BUILD_SVE2)
262+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve2>)
263+
endif()
264+
265+
else()
266+
message(FATAL_ERROR "Unsupported ACL_ARCH_ISA='${ACL_ARCH_ISA}'")
267+
endif()
268+
269+
add_library(arm_compute ${ARM_COMPUTE_LIB_BUILD_TYPE} ${lib_objs})
270+
set_target_properties(arm_compute PROPERTIES OUTPUT_NAME "arm_compute_${ACL_ARCH_ISA}")
271+
endif()
272+
273+
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
274+
target_compile_options(arm_compute_core PRIVATE -arch arm64)
275+
if(TARGET arm_compute_core_fp16)
276+
target_compile_options(arm_compute_core_fp16 PRIVATE -arch arm64)
277+
endif()
278+
endif()
279+
187280

188281
# Linking to arm_compute[_graph] should automatically bring includes and dependent libs with it
189282
foreach(TARGET IN ITEMS arm_compute arm_compute_graph)
@@ -197,7 +290,17 @@ foreach(TARGET IN ITEMS arm_compute arm_compute_graph)
197290
endforeach()
198291

199292
# Linking to this target should automatically bring includes and dependent libs with it.
200-
list(APPEND ARM_COMPUTE_TARGETS arm_compute arm_compute_graph arm_compute_core arm_compute_core_fp16 arm_compute_sve arm_compute_sve2)
293+
set(ARM_COMPUTE_TARGETS arm_compute arm_compute_graph arm_compute_core)
294+
295+
if(TARGET arm_compute_core_fp16)
296+
list(APPEND ARM_COMPUTE_TARGETS arm_compute_core_fp16)
297+
endif()
298+
if(TARGET arm_compute_sve)
299+
list(APPEND ARM_COMPUTE_TARGETS arm_compute_sve)
300+
endif()
301+
if(TARGET arm_compute_sve2)
302+
list(APPEND ARM_COMPUTE_TARGETS arm_compute_sve2)
303+
endif()
201304

202305
# Create an alias targets so that a user can download ArmCompute via FetchContent and
203306
# still link to ArmCompute::Core and ArmCompute::Graph. Otherwise these targets would not

CMakePresets.json

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,20 @@
2222
"ARM_COMPUTE_BUILD_TESTING": "ON"
2323
}
2424
},
25+
{
26+
"name": "single-isa-v86",
27+
"generator": "Ninja Multi-Config",
28+
"displayName": "Single ISA armv8.6-a",
29+
"description": "Builds only the armv8.6-a arch without sve/sve2",
30+
"binaryDir": "${sourceDir}/build/${presetName}",
31+
"cacheVariables": {
32+
"ACL_MULTI_ISA": "OFF",
33+
"ACL_ARCH_ISA": "armv8.6-a",
34+
"ACL_ARCH_FEATURES": "",
35+
"ARM_COMPUTE_BUILD_SHARED_LIB": "ON",
36+
"ARM_COMPUTE_ENABLE_OPENMP": "ON"
37+
}
38+
},
2539
{
2640
"name": "release",
2741
"generator": "Ninja Multi-Config",
@@ -38,6 +52,13 @@
3852
"configuration": "Release",
3953
"description": "Builds the CI configuration."
4054
},
55+
{
56+
"name": "single-isa-v86",
57+
"displayName": "Build Single ISA armv8.6-a",
58+
"configurePreset": "single-isa-v86",
59+
"configuration": "Release",
60+
"description": "Builds armv8.6-a configuration without sve/sve2."
61+
},
4162
{
4263
"name": "release",
4364
"displayName": "Release Build",
@@ -60,6 +81,19 @@
6081
}
6182
]
6283
},
84+
{
85+
"name": "single-isa-v86",
86+
"steps": [
87+
{
88+
"type": "configure",
89+
"name": "single-isa-v86"
90+
},
91+
{
92+
"type": "build",
93+
"name": "single-isa-v86"
94+
}
95+
]
96+
},
6397
{
6498
"name": "release",
6599
"steps": [

0 commit comments

Comments
 (0)