@@ -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,57 @@ 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+ 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+
75139if (ARM_COMPUTE_ENABLE_OPENMP)
76140 find_package (OpenMP REQUIRED)
77141endif ()
@@ -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
149221add_library (arm_compute_core OBJECT)
150222set_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
169245add_library (arm_compute_graph ${ARM_COMPUTE_LIB_BUILD_TYPE} )
170246set_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
189303foreach (TARGET IN ITEMS arm_compute arm_compute_graph)
@@ -197,7 +311,17 @@ foreach(TARGET IN ITEMS arm_compute arm_compute_graph)
197311endforeach ()
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
0 commit comments