Skip to content

Commit 0a9ae27

Browse files
committed
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.
1 parent 180a83d commit 0a9ae27

File tree

2 files changed

+73
-11
lines changed

2 files changed

+73
-11
lines changed

ggml/src/CMakeLists.txt

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -269,17 +269,23 @@ endfunction()
269269
function(ggml_add_cpu_backend_variant tag_name)
270270
set(GGML_CPU_TAG_NAME ${tag_name})
271271
# other: OPENMP LLAMAFILE CPU_HBM
272-
foreach (feat NATIVE
273-
SSE42
274-
AVX AVX2 BMI2 AVX_VNNI FMA F16C
275-
AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16
276-
AMX_TILE AMX_INT8 AMX_BF16)
277-
set(GGML_${feat} OFF)
278-
endforeach()
279-
280-
foreach (feat ${ARGN})
281-
set(GGML_${feat} ON)
282-
endforeach()
272+
if (GGML_SYSTEM_ARCH STREQUAL "x86")
273+
foreach (feat NATIVE
274+
SSE42
275+
AVX AVX2 BMI2 AVX_VNNI FMA F16C
276+
AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16
277+
AMX_TILE AMX_INT8 AMX_BF16)
278+
set(GGML_${feat} OFF)
279+
endforeach()
280+
281+
foreach (feat ${ARGN})
282+
set(GGML_${feat} ON)
283+
endforeach()
284+
elseif (GGML_SYSTEM_ARCH STREQUAL "ARM")
285+
foreach (feat ${ARGN})
286+
set(GGML_INTERNAL_${feat} ON)
287+
endforeach()
288+
endif()
283289

284290
ggml_add_cpu_backend_variant_impl(${tag_name})
285291
endfunction()
@@ -302,6 +308,21 @@ if (GGML_CPU_ALL_VARIANTS)
302308
# MSVC doesn't support AMX
303309
ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C AVX2 BMI2 FMA AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8)
304310
endif()
311+
elseif(GGML_SYSTEM_ARCH STREQUAL "ARM")
312+
if (GGML_CPU_ARM_ARCH)
313+
message(FATAL_ERROR "Cannot use both GGML_CPU_ARM_ARCH and GGML_CPU_ALL_VARIANTS")
314+
endif()
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)
305326
else()
306327
message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS not yet supported on ${GGML_SYSTEM_ARCH}")
307328
endif()

ggml/src/ggml-cpu/CMakeLists.txt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,47 @@ function(ggml_add_cpu_backend_variant_impl tag_name)
152152
else()
153153
if (GGML_CPU_ARM_ARCH)
154154
list(APPEND ARCH_FLAGS -march=${GGML_CPU_ARM_ARCH})
155+
else()
156+
# Begin with the lowest baseline
157+
set(ARM_MCPU "armv8-a")
158+
set(ARCH_TAGS "")
159+
set(ARCH_DEFINITIONS "")
160+
161+
# When a feature is selected, bump the MCPU to the first
162+
# version that supported it
163+
if (GGML_INTERNAL_DOTPROD)
164+
set(ARM_MCPU "armv8.2-a")
165+
set(ARCH_TAGS "${ARCH_TAGS}+dotprod")
166+
list(APPEND ARCH_DEFINITIONS GGML_USE_DOTPROD)
167+
endif()
168+
if (GGML_INTERNAL_FP16_VECTOR_ARITHMETIC)
169+
set(ARM_MCPU "armv8.2-a")
170+
set(ARCH_TAGS "${ARCH_TAGS}+fp16")
171+
list(APPEND ARCH_DEFINITIONS GGML_USE_FP16_VECTOR_ARITHMETIC)
172+
endif()
173+
if (GGML_INTERNAL_SVE)
174+
set(ARM_MCPU "armv8.2-a")
175+
set(ARCH_TAGS "${ARCH_TAGS}+sve")
176+
list(APPEND ARCH_DEFINITIONS GGML_USE_SVE)
177+
endif()
178+
if (GGML_INTERNAL_MATMUL_INT8)
179+
set(ARM_MCPU "armv8.6-a")
180+
set(ARCH_TAGS "${ARCH_TAGS}+i8mm")
181+
list(APPEND ARCH_DEFINITIONS GGML_USE_MATMUL_INT8)
182+
endif()
183+
if (GGML_INTERNAL_SVE2)
184+
set(ARM_MCPU "armv8.6-a")
185+
set(ARCH_TAGS "${ARCH_TAGS}+sve2")
186+
list(APPEND ARCH_DEFINITIONS GGML_USE_SVE2)
187+
endif()
188+
if (GGML_INTERNAL_SME)
189+
set(ARM_MCPU "armv9.2-a")
190+
set(ARCH_TAGS "${ARCH_TAGS}+sme")
191+
list(APPEND ARCH_DEFINITIONS GGML_USE_SME)
192+
endif()
193+
194+
list(APPEND ARCH_FLAGS "-march=${ARM_MCPU}${ARCH_TAGS}")
195+
ggml_add_cpu_backend_features(${GGML_CPU_NAME} aarch64 ${ARCH_DEFINITIONS})
155196
endif()
156197
endif()
157198

0 commit comments

Comments
 (0)