Skip to content

Commit 8c6390c

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 8c6390c

File tree

4 files changed

+286
-60
lines changed

4 files changed

+286
-60
lines changed

CMakeLists.txt

Lines changed: 165 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,57 @@ 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+
if(ACL_ARCH_ISA STREQUAL "armv8-a" AND (ACL_MULTI_ISA OR ACL_BUILD_SVE OR ACL_BUILD_SVE2 OR ACL_BUILD_SME2))
89+
message(FATAL_ERROR
90+
"Invalid configuration: '${ACL_ARCH_ISA}' does not support requested features"
91+
)
92+
endif()
93+
94+
# * Print build configuration
95+
if(ACL_MULTI_ISA)
96+
message(STATUS "Multi-ISA build selected.")
97+
message(STATUS "Building ACL libraries: core, core_fp16, sve, sve2.")
98+
else()
99+
message(STATUS "Single-ISA build selected: ${ACL_ARCH_ISA}")
100+
if(NOT "${ACL_ARCH_FEATURES}" STREQUAL "")
101+
message(STATUS "Requested features: ${ACL_ARCH_FEATURES}")
102+
endif()
103+
set(libs "core")
104+
if(NOT (ACL_ARCH_ISA STREQUAL "armv8-a"))
105+
string(APPEND libs ", core_fp16")
106+
endif()
107+
if(ACL_BUILD_SVE)
108+
string(APPEND libs ", sve")
109+
endif()
110+
if(ACL_BUILD_SVE2)
111+
string(APPEND libs ", sve2")
112+
endif()
113+
message(STATUS "Building ACL libraries: ${libs}.")
114+
endif()
115+
116+
# * Set architecture.
117+
if(ACL_MULTI_ISA)
118+
set(ARM_COMPUTE_ARCH "-march=armv8-a")
119+
set(ARM_COMPUTE_CORE_FP16_ARCH "-march=armv8.2-a+fp16+dotprod")
120+
set(ARM_COMPUTE_SVE_ARCH "-march=armv8.2-a+sve+fp16+dotprod")
121+
set(ARM_COMPUTE_SVE2_ARCH "-march=armv8.6-a+sve2+fp16+dotprod+i8mm")
122+
else()
123+
set(ACL_MARCH "")
124+
if(ACL_BUILD_SME2 OR ACL_BUILD_SVE2)
125+
set(ACL_MARCH "+sve2+fp16+dotprod+i8mm")
126+
elseif(ACL_BUILD_SVE)
127+
set(ACL_MARCH "+sve+fp16+dotprod")
128+
elseif(ACL_ARCH_ISA STREQUAL "armv8.2-a" OR ACL_ARCH_ISA STREQUAL "armv8.6-a")
129+
set(ACL_MARCH "+fp16+dotprod")
130+
endif()
131+
132+
set(ARM_COMPUTE_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for core library.")
133+
set(ARM_COMPUTE_CORE_FP16_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for core library with fp16 support.")
134+
set(ARM_COMPUTE_SVE_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for SVE library.")
135+
set(ARM_COMPUTE_SVE2_ARCH "-march=${ACL_ARCH_ISA}${ACL_MARCH}" CACHE STRING "Architecture (march) for SVE2 library.")
136+
message(STATUS "Using arch: ${ARM_COMPUTE_ARCH}")
137+
endif()
138+
75139
if(ARM_COMPUTE_ENABLE_OPENMP)
76140
find_package(OpenMP REQUIRED)
77141
endif()
@@ -126,25 +190,33 @@ set(
126190
${CMAKE_CURRENT_LIST_DIR}/src/core/NEON/kernels/arm_gemm/merges
127191
)
128192

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-
)
193+
if(ACL_MULTI_ISA OR ACL_BUILD_SVE)
194+
add_library(arm_compute_sve OBJECT)
195+
set_target_properties(
196+
arm_compute_sve
197+
PROPERTIES
198+
COMPILE_OPTIONS "${ARM_COMPUTE_SVE_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
199+
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
200+
INCLUDE_DIRECTORIES "${ARM_COMPUTE_SVE_COMMON_INCLUDE}"
201+
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
202+
)
203+
else()
204+
add_library(arm_compute_sve OBJECT EXCLUDE_FROM_ALL)
205+
endif()
138206

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-
)
207+
if(ACL_MULTI_ISA OR ACL_BUILD_SVE2)
208+
add_library(arm_compute_sve2 OBJECT)
209+
set_target_properties(
210+
arm_compute_sve2
211+
PROPERTIES
212+
COMPILE_OPTIONS "${ARM_COMPUTE_SVE2_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
213+
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
214+
INCLUDE_DIRECTORIES "${ARM_COMPUTE_SVE_COMMON_INCLUDE}"
215+
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
216+
)
217+
else()
218+
add_library(arm_compute_sve2 OBJECT EXCLUDE_FROM_ALL)
219+
endif()
148220

149221
add_library(arm_compute_core OBJECT)
150222
set_target_properties(
@@ -156,15 +228,19 @@ set_target_properties(
156228
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
157229
)
158230

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-
)
231+
if(NOT (ACL_ARCH_ISA STREQUAL "armv8-a"))
232+
add_library(arm_compute_core_fp16 OBJECT)
233+
set_target_properties(
234+
arm_compute_core_fp16
235+
PROPERTIES
236+
COMPILE_OPTIONS "${ARM_COMPUTE_CORE_FP16_ARCH};${ARM_COMPUTE_COMMON_CCXX_FLAGS}"
237+
COMPILE_DEFINITIONS "${ARM_COMPUTE_DEFINES}"
238+
INCLUDE_DIRECTORIES "${ARM_COMPUTE_INCLUDE}"
239+
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}"
240+
)
241+
else()
242+
add_library(arm_compute_core_fp16 OBJECT EXCLUDE_FROM_ALL)
243+
endif()
168244

169245
add_library(arm_compute_graph ${ARM_COMPUTE_LIB_BUILD_TYPE})
170246
set_target_properties(
@@ -176,14 +252,52 @@ set_target_properties(
176252
LINK_LIBRARIES "${ARM_COMPUTE_LINK_LIBS}$<IF:$<PLATFORM_ID:Darwin>,;arm_compute,>"
177253
)
178254

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-
)
255+
if(ACL_MULTI_ISA)
256+
add_library(arm_compute ${ARM_COMPUTE_LIB_BUILD_TYPE}
257+
$<TARGET_OBJECTS:arm_compute_core>
258+
$<TARGET_OBJECTS:arm_compute_core_fp16>
259+
$<TARGET_OBJECTS:arm_compute_sve>
260+
$<TARGET_OBJECTS:arm_compute_sve2>
261+
)
262+
else()
263+
set(lib_objs $<TARGET_OBJECTS:arm_compute_core>)
264+
265+
if(ACL_ARCH_ISA STREQUAL "armv8-a")
266+
# base
267+
268+
elseif(ACL_ARCH_ISA STREQUAL "armv8.2-a")
269+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_core_fp16>)
270+
if(ACL_BUILD_SVE)
271+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve>)
272+
endif()
273+
if(ACL_BUILD_SVE2)
274+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve2>)
275+
endif()
276+
277+
elseif(ACL_ARCH_ISA STREQUAL "armv8.6-a")
278+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_core_fp16>)
279+
if(ACL_BUILD_SVE)
280+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve>)
281+
endif()
282+
if(ACL_BUILD_SVE2)
283+
list(APPEND lib_objs $<TARGET_OBJECTS:arm_compute_sve2>)
284+
endif()
285+
286+
else()
287+
message(FATAL_ERROR "Unsupported ACL_ARCH_ISA='${ACL_ARCH_ISA}'")
288+
endif()
289+
290+
add_library(arm_compute ${ARM_COMPUTE_LIB_BUILD_TYPE} ${lib_objs})
291+
set_target_properties(arm_compute PROPERTIES OUTPUT_NAME "arm_compute_${ACL_ARCH_ISA}")
292+
endif()
293+
294+
if(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
295+
target_compile_options(arm_compute_core PRIVATE -arch arm64)
296+
if(TARGET arm_compute_core_fp16)
297+
target_compile_options(arm_compute_core_fp16 PRIVATE -arch arm64)
298+
endif()
299+
endif()
300+
187301

188302
# Linking to arm_compute[_graph] should automatically bring includes and dependent libs with it
189303
foreach(TARGET IN ITEMS arm_compute arm_compute_graph)
@@ -197,7 +311,17 @@ foreach(TARGET IN ITEMS arm_compute arm_compute_graph)
197311
endforeach()
198312

199313
# 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)
314+
set(ARM_COMPUTE_TARGETS arm_compute arm_compute_graph arm_compute_core)
315+
316+
if(TARGET arm_compute_core_fp16)
317+
list(APPEND ARM_COMPUTE_TARGETS arm_compute_core_fp16)
318+
endif()
319+
if(TARGET arm_compute_sve)
320+
list(APPEND ARM_COMPUTE_TARGETS arm_compute_sve)
321+
endif()
322+
if(TARGET arm_compute_sve2)
323+
list(APPEND ARM_COMPUTE_TARGETS arm_compute_sve2)
324+
endif()
201325

202326
# Create an alias targets so that a user can download ArmCompute via FetchContent and
203327
# 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)