Skip to content

Commit aed2b29

Browse files
ckastnerMinh141120
authored andcommitted
Implement GGML_CPU_ALL_VARIANTS for ARM (ggml-org#14080)
* ggml-cpu: Factor out feature detection build from x86 * ggml-cpu: Add ARM feature detection and scoring This is analogous to cpu-feats-x86.cpp. However, to detect compile-time activation of features, we rely on GGML_USE_<FEAT> which need to be set in cmake, instead of GGML_<FEAT> that users would set for x86. This is because on ARM, users specify features with GGML_CPU_ARM_ARCH, rather than with individual flags. * ggml-cpu: Implement GGML_CPU_ALL_VARIANTS for ARM Like x86, however to pass around arch flags within cmake, we use GGML_INTERNAL_<FEAT> as we don't have GGML_<FEAT>. Some features are optional, so we may need to build multiple backends per arch version (armv8.2_1, armv8.2_2, ...), and let the scoring function sort out which one can be used. * ggml-cpu: Limit ARM GGML_CPU_ALL_VARIANTS to Linux for now The other platforms will need their own specific variants. This also fixes the bug that the the variant-building branch was always being executed as the else-branch of GGML_NATIVE=OFF. The branch is moved to an elseif-branch which restores the previous behavior.
1 parent f8590f2 commit aed2b29

File tree

2 files changed

+55
-97
lines changed

2 files changed

+55
-97
lines changed

ggml/src/CMakeLists.txt

Lines changed: 12 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,6 @@ function(ggml_add_cpu_backend_variant tag_name)
286286
foreach (feat ${ARGN})
287287
set(GGML_INTERNAL_${feat} ON)
288288
endforeach()
289-
elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
290-
foreach (feat ${ARGN})
291-
set(GGML_INTERNAL_${feat} ON)
292-
endforeach()
293289
endif()
294290

295291
ggml_add_cpu_backend_variant_impl(${tag_name})
@@ -315,45 +311,18 @@ if (GGML_CPU_ALL_VARIANTS)
315311
# MSVC doesn't support AMX
316312
ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C AVX2 BMI2 FMA AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8)
317313
endif()
318-
elseif(GGML_SYSTEM_ARCH STREQUAL "ARM")
319-
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
320-
# Many of these features are optional so we build versions with popular
321-
# combinations and name the backends based on the version they were
322-
# first released with
323-
ggml_add_cpu_backend_variant(armv8.0_1)
324-
ggml_add_cpu_backend_variant(armv8.2_1 DOTPROD)
325-
ggml_add_cpu_backend_variant(armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC)
326-
ggml_add_cpu_backend_variant(armv8.2_3 DOTPROD FP16_VECTOR_ARITHMETIC SVE)
327-
ggml_add_cpu_backend_variant(armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8)
328-
ggml_add_cpu_backend_variant(armv8.6_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2)
329-
ggml_add_cpu_backend_variant(armv9.2_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SME)
330-
ggml_add_cpu_backend_variant(armv9.2_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2 SME)
331-
elseif (CMAKE_SYSTEM_NAME MATCHES "Android")
332-
# Android-specific backends with SoC-compatible feature sets
333-
ggml_add_cpu_backend_variant(android_armv8.0_1)
334-
ggml_add_cpu_backend_variant(android_armv8.2_1 DOTPROD)
335-
ggml_add_cpu_backend_variant(android_armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC)
336-
ggml_add_cpu_backend_variant(android_armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC MATMUL_INT8)
337-
elseif (APPLE)
338-
ggml_add_cpu_backend_variant(apple_m1 DOTPROD)
339-
ggml_add_cpu_backend_variant(apple_m2_m3 DOTPROD MATMUL_INT8)
340-
ggml_add_cpu_backend_variant(apple_m4 DOTPROD MATMUL_INT8 NOSVE SME)
341-
else()
342-
message(FATAL_ERROR "Unsupported ARM target OS: ${CMAKE_SYSTEM_NAME}")
343-
endif()
344-
elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
345-
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
346-
ggml_add_cpu_backend_variant(power0)
347-
ggml_add_cpu_backend_variant(power7_1 POWER7)
348-
ggml_add_cpu_backend_variant(power7_2 POWER7 VSX)
349-
ggml_add_cpu_backend_variant(power8_1 POWER8)
350-
ggml_add_cpu_backend_variant(power8_2 POWER8 VSX)
351-
ggml_add_cpu_backend_variant(power9 POWER9 VSX)
352-
ggml_add_cpu_backend_variant(power10 POWER10 VSX)
353-
ggml_add_cpu_backend_variant(power11 POWER11 VSX)
354-
else()
355-
message(FATAL_ERROR "Unsupported PowerPC target OS: ${CMAKE_SYSTEM_NAME}")
356-
endif()
314+
elseif(GGML_SYSTEM_ARCH STREQUAL "ARM" AND CMAKE_SYSTEM_NAME MATCHES "Linux")
315+
# Many of these features are optional so we build versions with popular
316+
# combinations and name the backends based on the version they were
317+
# first released with
318+
ggml_add_cpu_backend_variant(armv8.0_1)
319+
ggml_add_cpu_backend_variant(armv8.2_1 DOTPROD)
320+
ggml_add_cpu_backend_variant(armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC)
321+
ggml_add_cpu_backend_variant(armv8.2_3 DOTPROD FP16_VECTOR_ARITHMETIC SVE)
322+
ggml_add_cpu_backend_variant(armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8)
323+
ggml_add_cpu_backend_variant(armv8.6_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2)
324+
ggml_add_cpu_backend_variant(armv9.2_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SME)
325+
ggml_add_cpu_backend_variant(armv9.2_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2 SME)
357326
else()
358327
message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS not yet supported with ${GGML_SYSTEM_ARCH} on ${CMAKE_SYSTEM_NAME}")
359328
endif()

ggml/src/ggml-cpu/CMakeLists.txt

Lines changed: 43 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ function(ggml_add_cpu_backend_features cpu_name arch)
55
# build, using set_source_files_properties() to set the arch flags is not possible
66
set(GGML_CPU_FEATS_NAME ${cpu_name}-feats)
77
add_library(${GGML_CPU_FEATS_NAME} OBJECT ggml-cpu/arch/${arch}/cpu-feats.cpp)
8-
target_include_directories(${GGML_CPU_FEATS_NAME} PRIVATE . ../include)
8+
target_include_directories(${GGML_CPU_FEATS_NAME} PRIVATE . .. ../include)
99
target_compile_definitions(${GGML_CPU_FEATS_NAME} PRIVATE ${ARGN})
1010
target_compile_definitions(${GGML_CPU_FEATS_NAME} PRIVATE GGML_BACKEND_DL GGML_BACKEND_BUILD GGML_BACKEND_SHARED)
1111
set_target_properties(${GGML_CPU_FEATS_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
@@ -158,48 +158,48 @@ function(ggml_add_cpu_backend_variant_impl tag_name)
158158
if (GGML_CPU_ARM_ARCH)
159159
list(APPEND ARCH_FLAGS -march=${GGML_CPU_ARM_ARCH})
160160
elseif(GGML_CPU_ALL_VARIANTS)
161-
# Begin with the lowest baseline
162-
set(ARM_MCPU "armv8-a")
163-
set(ARCH_TAGS "")
164-
set(ARCH_DEFINITIONS "")
165-
166-
# When a feature is selected, bump the MCPU to the first
167-
# version that supported it
168-
if (GGML_INTERNAL_DOTPROD)
169-
set(ARM_MCPU "armv8.2-a")
170-
set(ARCH_TAGS "${ARCH_TAGS}+dotprod")
171-
list(APPEND ARCH_DEFINITIONS GGML_USE_DOTPROD)
172-
endif()
173-
if (GGML_INTERNAL_FP16_VECTOR_ARITHMETIC)
174-
set(ARM_MCPU "armv8.2-a")
175-
set(ARCH_TAGS "${ARCH_TAGS}+fp16")
176-
list(APPEND ARCH_DEFINITIONS GGML_USE_FP16_VECTOR_ARITHMETIC)
177-
endif()
178-
if (GGML_INTERNAL_SVE)
179-
set(ARM_MCPU "armv8.2-a")
180-
set(ARCH_TAGS "${ARCH_TAGS}+sve")
181-
list(APPEND ARCH_DEFINITIONS GGML_USE_SVE)
182-
endif()
183-
if (GGML_INTERNAL_MATMUL_INT8)
184-
set(ARM_MCPU "armv8.6-a")
185-
set(ARCH_TAGS "${ARCH_TAGS}+i8mm")
186-
list(APPEND ARCH_DEFINITIONS GGML_USE_MATMUL_INT8)
187-
endif()
188-
if (GGML_INTERNAL_SVE2)
189-
set(ARM_MCPU "armv8.6-a")
190-
set(ARCH_TAGS "${ARCH_TAGS}+sve2")
191-
list(APPEND ARCH_DEFINITIONS GGML_USE_SVE2)
192-
endif()
193-
if (GGML_INTERNAL_NOSVE)
194-
set(ARCH_TAGS "${ARCH_TAGS}+nosve")
195-
endif()
196-
if (GGML_INTERNAL_SME)
197-
set(ARM_MCPU "armv9.2-a")
198-
set(ARCH_TAGS "${ARCH_TAGS}+sme")
199-
list(APPEND ARCH_DEFINITIONS GGML_USE_SME)
161+
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
162+
# Begin with the lowest baseline
163+
set(ARM_MCPU "armv8-a")
164+
set(ARCH_TAGS "")
165+
set(ARCH_DEFINITIONS "")
166+
167+
# When a feature is selected, bump the MCPU to the first
168+
# version that supported it
169+
if (GGML_INTERNAL_DOTPROD)
170+
set(ARM_MCPU "armv8.2-a")
171+
set(ARCH_TAGS "${ARCH_TAGS}+dotprod")
172+
list(APPEND ARCH_DEFINITIONS GGML_USE_DOTPROD)
173+
endif()
174+
if (GGML_INTERNAL_FP16_VECTOR_ARITHMETIC)
175+
set(ARM_MCPU "armv8.2-a")
176+
set(ARCH_TAGS "${ARCH_TAGS}+fp16")
177+
list(APPEND ARCH_DEFINITIONS GGML_USE_FP16_VECTOR_ARITHMETIC)
178+
endif()
179+
if (GGML_INTERNAL_SVE)
180+
set(ARM_MCPU "armv8.2-a")
181+
set(ARCH_TAGS "${ARCH_TAGS}+sve")
182+
list(APPEND ARCH_DEFINITIONS GGML_USE_SVE)
183+
endif()
184+
if (GGML_INTERNAL_MATMUL_INT8)
185+
set(ARM_MCPU "armv8.6-a")
186+
set(ARCH_TAGS "${ARCH_TAGS}+i8mm")
187+
list(APPEND ARCH_DEFINITIONS GGML_USE_MATMUL_INT8)
188+
endif()
189+
if (GGML_INTERNAL_SVE2)
190+
set(ARM_MCPU "armv8.6-a")
191+
set(ARCH_TAGS "${ARCH_TAGS}+sve2")
192+
list(APPEND ARCH_DEFINITIONS GGML_USE_SVE2)
193+
endif()
194+
if (GGML_INTERNAL_SME)
195+
set(ARM_MCPU "armv9.2-a")
196+
set(ARCH_TAGS "${ARCH_TAGS}+sme")
197+
list(APPEND ARCH_DEFINITIONS GGML_USE_SME)
198+
endif()
199+
200+
list(APPEND ARCH_FLAGS "-march=${ARM_MCPU}${ARCH_TAGS}")
201+
ggml_add_cpu_backend_features(${GGML_CPU_NAME} arm ${ARCH_DEFINITIONS})
200202
endif()
201-
list(APPEND ARCH_FLAGS "-march=${ARM_MCPU}${ARCH_TAGS}")
202-
ggml_add_cpu_backend_features(${GGML_CPU_NAME} arm ${ARCH_DEFINITIONS})
203203
endif()
204204
endif()
205205

@@ -363,18 +363,7 @@ function(ggml_add_cpu_backend_variant_impl tag_name)
363363
# the feature check relies on ARCH_DEFINITIONS, but it is not set with GGML_NATIVE
364364
message(FATAL_ERROR "GGML_NATIVE is not compatible with GGML_BACKEND_DL, consider using GGML_CPU_ALL_VARIANTS")
365365
endif()
366-
367-
# The feature detection code is compiled as a separate target so that
368-
# it can be built without the architecture flags
369-
# Since multiple variants of the CPU backend may be included in the same
370-
# build, using set_source_files_properties() to set the arch flags is not possible
371-
set(GGML_CPU_FEATS_NAME ${GGML_CPU_NAME}-feats)
372-
add_library(${GGML_CPU_FEATS_NAME} OBJECT ggml-cpu/arch/x86/cpu-feats.cpp)
373-
target_include_directories(${GGML_CPU_FEATS_NAME} PRIVATE . .. ../include)
374-
target_compile_definitions(${GGML_CPU_FEATS_NAME} PRIVATE ${ARCH_DEFINITIONS})
375-
target_compile_definitions(${GGML_CPU_FEATS_NAME} PRIVATE GGML_BACKEND_DL GGML_BACKEND_BUILD GGML_BACKEND_SHARED)
376-
set_target_properties(${GGML_CPU_FEATS_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
377-
target_link_libraries(${GGML_CPU_NAME} PRIVATE ${GGML_CPU_FEATS_NAME})
366+
ggml_add_cpu_backend_features(${GGML_CPU_NAME} x86 ${ARCH_DEFINITIONS})
378367
endif()
379368
elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
380369
message(STATUS "PowerPC detected")

0 commit comments

Comments
 (0)