@@ -49,11 +49,24 @@ option(ARM_COMPUTE_ENABLE_CODE_COVERAGE "Enable code coverage." OFF)
4949option (ARM_COMPUTE_ENABLE_SANITIZERS "Enable sanitizers." OFF )
5050option (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.
5972set (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)
7285include (${CMAKE_CURRENT_LIST_DIR} /cmake/compilers/setup.cmake)
7386include (${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+
75118if (ARM_COMPUTE_ENABLE_OPENMP)
76119 find_package (OpenMP REQUIRED)
77120endif ()
@@ -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
149200add_library (arm_compute_core OBJECT)
150201set_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
169224add_library (arm_compute_graph ${ARM_COMPUTE_LIB_BUILD_TYPE} )
170225set_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
189282foreach (TARGET IN ITEMS arm_compute arm_compute_graph)
@@ -197,7 +290,17 @@ foreach(TARGET IN ITEMS arm_compute arm_compute_graph)
197290endforeach ()
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
0 commit comments