* UI: implement basic UI components
* util: implement performance monitor; wrap it with a viewmodel
* util: implement user preferences utility
* UI: implement core flow's screens
* UI: add a new MainActivity; update manifest
* [WIP] DI: implement simple local vm factory provider
* UI: disable triggering drawer via gesture; enable alert dialog on back navigation inside conversation and benchmark
* UI: allow drawer's gesture control only on Home and Settings screens; enable alert dialog on back navigation inside conversation and benchmark
* UI: split a nested parent settings screen into separate child settings screens
* UI: polish system prompt setup UI
* Deps: bump Kotlin plugin; introduce KSP; apply in :app subproject
* DB: setup Room database
* data: introduce repo for System Prompt; flow data from Room to VM
* bugfix: properly handle user's quitting conversation screen while tokens in generation
* UI: rename `ModeSelection` to `ModelLoading` for better clarity
* UI: update app name to be more Arm
* UI: polish conversation screen
* data: code polish
* UI: code polish
* bugfix: handle user quitting on model loading
* UI: locks user in alert dialog when model is unloading
* vm: replace token metrics stubs with actual implementation
* UI: refactor top app bars
* nit: combine temperatureMetrics and useFahrenheit
* DI: introduce Hilt plugin + processor + lib dependencies
* DI: make app Hilt injectable
* DI: make viewmodels Hilt injectable
* DI: replace manual DI with Hilt DI
* UI: optimize AppContent's composing
* bugfix: wait for model to load before navigating to benchmark screen; use NavigationActions instead of raw navController
* UI: navigation with more natural animated transitions
* DI: Optimize AppModule
* Feature: Introduce ModelRepository and ModelsManagementViewModel; update AppModule
* UI: polish UI for ModelsManagementScreen; inject ModelsManagementVieModel
* DI: abstract the protocol of SystemPromptRepository; update AppModule
* data: [WIP] prepare for ModelRepository refactor & impl
* data: introduce Model entity and DAO; update DI module
* UI: replace Models Management screen's stubbing with instrumentation
* UI: polish sort order menu
* data: import local model with file picker
* bugfix: use List instead of Collection for ModelDao's deletion
* data: add a util file for extracting file name & size and model metadata
* UI: enrich ModelManagementState; extract filename to show correct importing UI
* UI: implement multiple models deletion; update Models Management screen
* UI: handle back navigation when user is in multi-selection mode
* util: extract file size formatting into ModelUtils
* UI: add a confirmation step when user picks a file; refactor model import overlay into AlertDialog
* UI: extract a shared ModelCard component
* UI: replace model selection screen's data stubbing; add empty view
* nit: tidy SystemPromptViewModel
* Util: split FileUtils from ModelUtils; extract copy methods into FileUtils
* data: pass through getModelById from ModelDao into ModelRepository
* core: extract conversation and benchmark logics into InferenceManager; add logs and missing state updates in stub InferenceEngine
* vm: split mono MainViewModel into separate individual ViewModels
* vm: merge SystemPromptViewModel into ModelLoadingViewModel
* core: break down InferenceManager due to Interface Segregation Principle
* UI: show model card in Model Loading screen
* UI: show model card in Conversation screen
* UI: unify Model Card components
* core: swap in LLamaAndroid and mark stub engine for testing only
* data: allow canceling the ongoing model import
* UI: update UI ongoing model import's cancellation
* LLama: update engine state after handling the cancellation of sendUserPrompt
* VM: handle the cancellation of ongoing token generation
* LLama: refactor loadModel by splitting the system prompt setting into a separate method
* feature: check for available space before copying local model
* UI: centralize the AppScaffold and modularize its configs
* UI: refactor BottomBarConfig.ModelsManagement APIs
* UI: combine TopBarConfig and BottomBarConfig into each route's ScaffoldConfig
* UI: replace ugly optional as casts in AppScaffold with extension functions
* UI: fix the typo `totalGb` in `StorageMetrics`
* UI: remove code duplication in sort menu
* LLama: add ModelUnloadingState to engine State; add missing state checks in stub engine; fix instrumentation engine's error messages
* UI: refactor back handling by removing centralized BackHandlerSetup and UnloadModelConfirmationDialog from AppContent
* UI: implement BenchmarkScreen's individual back handling
* LLama: add a new Initializing state; ; add two extension properties; rename LibraryLoaded state to Initialized
* UI: Introduce an abstract ViewModel to handle additional model unloading logics
* UI: expose a single facade ModelUnloadDialogHandler; move UnloadModelState into ModelUnloadingViewModel.kt
* UI: migrate ModelLoadingScreen onto ModelLoadingViewModel; update & refine ModelLoadingScreen
* UI: migrate ConversationViewModel onto ModelLoadingViewModel; update & refine ConversationScreen
* nit: extract app name into a constant value; remove unused onBackPressed callbacks
* UI: update AppContent to pass in correct navigation callbacks
* nit: polish ModelLoadingScreen UI
* core: throw Exception instead of returning null if model fails to load
* navigation: sink model loading state management from AppContent down into ModelLoadingScreen; pass ModelLoadingMetrics to Benchmark and Conversation screens
* gguf: add GGUF metadata data holder and its corresponding extractor implementation
* DB: introduce Kotlin serialization extension's library and plugin; add Room runtime library
* GGUF: make GgufMetadata serializable in order to be compatible with Room
* nit: refactor data.local package structure
* nit: rename lastUsed field to dateLastUsed; add dateAdded field
* UI: refactor ModelCard UI to show GGUF metadata
* UI: update ModelSelectionScreen with a preselect mechanism
* UI: polish model card
* nit: allow deselect model on Model Selection screen
* nit: revert accidental committing of debug code
* UI: polish ModelLoading screen
* util: extract formatting helper functions from FileUtils into a new FormatUtils
* UI: polish model cards on Benchmark and Conversation screens to show model loading metrics
* UI: show a Snack bar to warn user that system prompt is not always supported
* UI: handle back press on Model Selection screen
* UI: finally support theme modes; remove hardcoded color schemes, default to dynamic color scheme implementation
* feature: support searching on Model Selection screen
* nit: move scaffold related UI components into a separate package
* UI: extract InfoView out into a separate file for reusability
* data: move Model related actions (query, filter, sort) into ModelInfo file
* UI: animate FAB on model preselection states
* feature: support filtering in Model Management screen
* ui: show empty models info in Model Management screen
* ui: add filter off icon to "Clear filters" menu item
* [WIP] ui: polish Benchmark screen; implement its bottom app bar
* ui: polish Benchmark screen; implement its bottom app bar's rerun and share
* nit: disable mode selection's radio buttons when loading model
* feature: implement Conversation screen's bottom app bar
* pkg: restructure BottomAppBars into separate files in a child package
* pkg: restructure TopBarApps into separate files in a child package
* pkg: restructure system metrics into a separate file
* UI: polish Conversation screen
* data: update system prompt presets
* UI: allow hide or show model card on Conversation & Benchmark screens; fix message arrangement
* data: update & enhance system prompt presets
* deps: introduce Retrofit2
* data: implement HuggingFace data model, data source with Retrofit API
* data: update Model data repository to support fetching HuggingFace models
* [WIP] UI: replace the HuggingFace stub in Model Management screen with actual API call
* UI: map language codes into country Emojis
* ui: add "clear results" action to Benchmark screen
* nit: print current pp & tg in llama-bench
* UI: disable landscape mode; prevent duplicated benchmark running
* llama: migrate C/CXX flags into CMakeList
* [WIP] llama: ABI split builds five .so artifacts.
However, all .so are performing on SVE level
* [WIP] llama: ABI split where five tiers are built sequentially.
* [WIP] llama: disable OpenMP in ABI split since most SoCs are big.LITTLE
* [WIP] llama: enable KleidiAI and disable tier 4 due to `+sve+sve2` bug caused by `ggml_add_cpu_backend_variant_impl` as explained below
```CMake
if (NOT SME_ENABLED MATCHES -1)
...
set(PRIVATE_ARCH_FLAGS "-fno-tree-vectorize;${PRIVATE_ARCH_FLAGS}+sve+sve2")
...
```
* core: add Google's cpu_features as a submodule
* core: implement cpu_detector native lib
* core: swap out hardcoded LlamaAndroid library loading
* core: add back OpenMP due to huge perf loss on TG128
* misc: reorg the pkg structure
* misc: rename LlamaAndroid related class to InferenceEngine prefixes
* [WIP] lib: move GgufMetadata into the lib submodule
* lib: expose GgufMetadataReader as interface only
* lib: replace the naive & plain SharedPreferences with DataStore implementation
* lib: hide the internal implementations, only expose a facade and interfaces
* lib: expose Arm features
* di: add a stub TierDetection; provide both actual impl and stub in AppModule
* UI: add visualizer UI for Arm features
* misc: UI polish
* lib: refactored InferenceEngineLoader; added a `NONE` Llama Tier
* UI: support `NONE` Llama Tier in general settings
* lib: optimize engine loader; always perform a fresh detection when cache is null
* remote: add HuggingFaceModelDetails data class
* remote: refine HuggingFaceModel data class
* nit: remove `trendingScore` field from HuggingFace model entities, weird...
* remote: refactor HuggingFaceApiService; implement download feature in HuggingFaceRemoteDataSource
* remote: fix the incorrect parse of HuggingFace's inconsistent & weird JSON response
* UI: scaffold Models Management screen and view model
* UI: implement a dialog UI to show fetched HuggingFace models.
* UI: use a broadcast receiver to listen for download complete events and show local import dialog.
* data: handle network exceptions elegantly
* pkg: restructure `data`'s packages
* data: extract local file info, copy and cleanup logics into LocalFileDataSource
* nit: minor UI patch; add missing comments
* bugfix: tapping "Home" in navigation drawer should simply close it without any navigation action.
* UI: improve autoscroll during token generation
* lib: tested on JFrog Artifactory for Maven publishing
* UI: show RAM warning if model too large
* UI: polish model management screen's error dialog
* util: add more items into the mapping table of ISO 639-1 language code to ISO 3166-1 country code
* llm: properly propagate error to UI upon failing to load selected model
* UI: avoid duplicated calculation of token metrics
* lib: read & validate the magic number from the picked source file before executing the import
* UI: add "Learn More" hyperlinks to Error dialog upon model import failures
* lib: refactor the GgufMetadataReader to take InputStream instead of absolute path as argument
* lib: fix the `SIMD` typo in Tier description
* core: verify model file path is readable
* lib: add UnsupportedArchitectureException for triaged error message
* util: split FormatUtils into multiple utils for better readability
* UI: change benchmark screen from raw markdown to table view
* bugfix: reset preselection upon running the preselected model
* misc: linter issue
* bugfix: fix the malfunctioning monitoring switch
* UI: update Arm features indicator; fix the broken hyperlinks
* UI: add quick action buttons to benchmark screen's result card
* UI: hide share fab after clearing all benchmark results
* UI: fix the model unload dialog message; elevate the model card and hide it by default on Conversation screen;
* UI: hide the stubbing actions in Conversation screen
* UI: add show/hide stats control to conversation screen's assistant message bubble; fix placeholder
* UI: add a info button to explain token metrics
* misc: remove the redundant `Companion` added due to refactoring
* UI: show corresponding system metrics detailed info upon tapping RAM / storage / temperature indicator
* UI: add info button to System Prompt switch; expand the model card by default
* UI: disable tag & language chips; add section headers to explain what they are
* misc: replace top bar indicator's spacer with padding
* UI: merge the Model Selection and Model Management into a unified Models screen
* UI: split the ModelsManagementViewModel from a unified ModelsViewModel due to huge complexity
* UI: add model loading in progress view; polish the empty model info view
* UI: polish the bottom bars and info view when no models found; show loading in progress while fetching models
* build: [BREAKING] bump the versions of libraries and plugins
* UI: fix the breaking build
* UI: add Tooltip on Import FAB for user onboarding
* UI: adds AppPreferences to track user onboarding status
* UI: tracks user's first success on importing a model
* data: add hand crafted rules to filter the models fetched from HuggingFace API
* UI: update app name & about; polish top bars' indicators & buttons
* UI: polish Hugging Face download dialog UI
* UX: implement onboarding tooltips for model import and onboarding
* misc: use sentence case for CTA button labels
* [WIP] UI: add Arm color palette from Philip.Watson3
* UI: address Rojin's UX feedbacks
* UI: address Rojin's UX feedbacks - part 2
* UI: update Arm color palette from Philip.Watson3
* data: make sure fetch preselected models in the same order of their IDs
* UI: fix UI issues in the generic settings screen and navigation drawer
* nit: address Rojin's feedbacks on model import message again
* nit: append `®` to all `Arm` labels
* UI: extract a reusable InfoAlertDialog
* core: support GGML_CPU_ALL_VARIANTS on Android!
* core: restructure Kleidi-Llama library
* core: organizing cmake arguments
* data: sort preselected models according to device's available RAM
* app: update adaptive + themed + legacy icons and app name
* UI: fix the font size auto scaling for ArmFeaturesVisualizer
* core: further improve the performance on native methods
* UI: minor color palette changes; emphasize the bottom bar FABs; fix Settings Screen menu item label
* UI: make more room for assistant message bubble's width
* UI: better usage of tertiary colors to highlight model cards but not for warnings
* UI: fix the layout issue on large font sizes
* lib: support x86-64 by dynamically set Arm related definitions
* lib: replace the factory pattern for deprecated tiered lib loading with single instance pattern
* llama: update the library name in JNI and CMake project
* llama: update the library's package name and namespace
* llama: update the app's package name and namespace
* app: bump ksp version
* app: remove deprecated SystemUIController from accompanist by migrating to EdgeToEdge
* app: extract AppContent from MainActivity to a separate file in ui package
* lib: add File version for GGUF Magic number verification
* lib: perform engine state check inclusively instead of exclusively
* lib: change `LlamaTier` to `ArmCpuTier`
* lib: remove kleidi-llama related namings
* cleanup: remove Arm AI Chat/Playground app source code; replace with the basic sample app from https://github.com/hanyin-arm/Arm-AI-Chat-Sample
Note: the full Google Play version of AI Chat app will be open will be open sourced in another repo soon, therefore didn't go through the trouble of pruning the history using `git filter-repo` here.
* [WIP] doc: update main and Android README docs; add self to code owners
* lib: revert System.load back to System.loadLibrary
* jni: introduce a logging util to filter different logging levels on different build types
* lib: enable app optimization
* doc: replace stub Google Play app URL with the actual link add screenshots; add my GitHub ID to maintainer list
* Remove cpu_features
* Fix linters issues in editorconfig-checker job
https://github.com/ggml-org/llama.cpp/actions/runs/19548770247/job/55974800633?pr=17413
* Remove unnecessary Android CMake flag
* purge include/cpu_features directory
---------
Co-authored-by: Han Yin <han.yin@arm.com>
477 lines
17 KiB
CMake
477 lines
17 KiB
CMake
include(CheckCXXCompilerFlag)
|
|
include("../cmake/common.cmake")
|
|
|
|
add_compile_definitions(GGML_SCHED_MAX_COPIES=${GGML_SCHED_MAX_COPIES})
|
|
|
|
# enable libstdc++ assertions for debug builds
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
add_compile_definitions($<$<CONFIG:Debug>:_GLIBCXX_ASSERTIONS>)
|
|
endif()
|
|
|
|
if (NOT MSVC)
|
|
if (GGML_SANITIZE_THREAD)
|
|
add_compile_options(-fsanitize=thread)
|
|
link_libraries (-fsanitize=thread)
|
|
endif()
|
|
|
|
if (GGML_SANITIZE_ADDRESS)
|
|
add_compile_options(-fsanitize=address -fno-omit-frame-pointer)
|
|
link_libraries (-fsanitize=address)
|
|
endif()
|
|
|
|
if (GGML_SANITIZE_UNDEFINED)
|
|
add_compile_options(-fsanitize=undefined)
|
|
link_libraries (-fsanitize=undefined)
|
|
endif()
|
|
endif()
|
|
|
|
if (GGML_FATAL_WARNINGS)
|
|
if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
list(APPEND C_FLAGS -Werror)
|
|
list(APPEND CXX_FLAGS -Werror)
|
|
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
|
|
add_compile_options(/WX)
|
|
endif()
|
|
endif()
|
|
|
|
if (GGML_ALL_WARNINGS)
|
|
if (NOT MSVC)
|
|
list(APPEND WARNING_FLAGS -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function)
|
|
list(APPEND C_FLAGS -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes
|
|
-Werror=implicit-int -Werror=implicit-function-declaration)
|
|
list(APPEND CXX_FLAGS -Wmissing-declarations -Wmissing-noreturn)
|
|
|
|
list(APPEND C_FLAGS ${WARNING_FLAGS})
|
|
list(APPEND CXX_FLAGS ${WARNING_FLAGS})
|
|
|
|
ggml_get_flags(${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION})
|
|
|
|
add_compile_options("$<$<COMPILE_LANGUAGE:C>:${C_FLAGS};${GF_C_FLAGS}>"
|
|
"$<$<COMPILE_LANGUAGE:CXX>:${CXX_FLAGS};${GF_CXX_FLAGS}>")
|
|
else()
|
|
# todo : msvc
|
|
set(C_FLAGS "")
|
|
set(CXX_FLAGS "")
|
|
endif()
|
|
endif()
|
|
|
|
if (GGML_LTO)
|
|
include(CheckIPOSupported)
|
|
check_ipo_supported(RESULT result OUTPUT output)
|
|
if (result)
|
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE)
|
|
else()
|
|
message(WARNING "IPO is not supported: ${output}")
|
|
endif()
|
|
endif()
|
|
|
|
if (GGML_CCACHE AND NOT CMAKE_C_COMPILER_LAUNCHER AND NOT CMAKE_CXX_COMPILER_LAUNCHER)
|
|
find_program(GGML_CCACHE_FOUND ccache)
|
|
find_program(GGML_SCCACHE_FOUND sccache)
|
|
|
|
if (GGML_CCACHE_FOUND OR GGML_SCCACHE_FOUND)
|
|
if(GGML_CCACHE_FOUND)
|
|
set(GGML_CCACHE_VARIANT ccache)
|
|
else()
|
|
set(GGML_CCACHE_VARIANT sccache)
|
|
endif()
|
|
# TODO: should not be set globally
|
|
if (GGML_SYCL AND GGML_CCACHE_FOUND AND WIN32)
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "ccache compiler_type=icl")
|
|
else ()
|
|
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${GGML_CCACHE_VARIANT}")
|
|
endif ()
|
|
set(ENV{CCACHE_SLOPPINESS} time_macros)
|
|
message(STATUS "${GGML_CCACHE_VARIANT} found, compilation results will be cached. Disable with GGML_CCACHE=OFF.")
|
|
else()
|
|
message(STATUS "Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF")
|
|
endif ()
|
|
endif()
|
|
|
|
# this version of Apple ld64 is buggy
|
|
execute_process(
|
|
COMMAND ${CMAKE_C_COMPILER} ${CMAKE_EXE_LINKER_FLAGS} -Wl,-v
|
|
ERROR_VARIABLE output
|
|
OUTPUT_QUIET
|
|
)
|
|
|
|
if (output MATCHES "dyld-1015\.7")
|
|
add_compile_definitions(HAVE_BUGGY_APPLE_LINKER)
|
|
endif()
|
|
|
|
# architecture specific
|
|
# TODO: probably these flags need to be tweaked on some architectures
|
|
# feel free to update the Makefile for your architecture and send a pull request or issue
|
|
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
|
|
if (MSVC)
|
|
string(TOLOWER "${CMAKE_GENERATOR_PLATFORM}" CMAKE_GENERATOR_PLATFORM_LWR)
|
|
message(STATUS "CMAKE_GENERATOR_PLATFORM: ${CMAKE_GENERATOR_PLATFORM}")
|
|
else ()
|
|
set(CMAKE_GENERATOR_PLATFORM_LWR "")
|
|
endif ()
|
|
ggml_get_system_arch()
|
|
message(STATUS "GGML_SYSTEM_ARCH: ${GGML_SYSTEM_ARCH}")
|
|
|
|
if (NOT MSVC)
|
|
if (GGML_STATIC)
|
|
if (UNIX AND NOT APPLE)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so")
|
|
endif()
|
|
add_link_options(-static)
|
|
if (MINGW)
|
|
add_link_options(-static-libgcc -static-libstdc++)
|
|
endif()
|
|
endif()
|
|
if (GGML_GPROF)
|
|
add_compile_options(-pg)
|
|
endif()
|
|
endif()
|
|
|
|
#
|
|
# POSIX conformance
|
|
#
|
|
|
|
# clock_gettime came in POSIX.1b (1993)
|
|
# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional
|
|
# posix_memalign came in POSIX.1-2001 / SUSv3
|
|
# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985)
|
|
|
|
# Somehow in OpenBSD whenever POSIX conformance is specified
|
|
# some string functions rely on locale_t availability,
|
|
# which was introduced in POSIX.1-2008, forcing us to go higher
|
|
if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
|
add_compile_definitions(_XOPEN_SOURCE=700)
|
|
elseif (CMAKE_SYSTEM_NAME MATCHES "AIX")
|
|
# Don't define _XOPEN_SOURCE. We need _ALL_SOURCE, which is the default,
|
|
# in order to define _SC_PHYS_PAGES.
|
|
else()
|
|
add_compile_definitions(_XOPEN_SOURCE=600)
|
|
endif()
|
|
|
|
# Data types, macros and functions related to controlling CPU affinity and
|
|
# some memory allocation are available on Linux through GNU extensions in libc
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux" OR CMAKE_SYSTEM_NAME MATCHES "Android")
|
|
add_compile_definitions(_GNU_SOURCE)
|
|
endif()
|
|
|
|
# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1,
|
|
# and on macOS its availability depends on enabling Darwin extensions
|
|
# similarly on DragonFly, enabling BSD extensions is necessary
|
|
if (
|
|
CMAKE_SYSTEM_NAME MATCHES "Darwin" OR
|
|
CMAKE_SYSTEM_NAME MATCHES "iOS" OR
|
|
CMAKE_SYSTEM_NAME MATCHES "tvOS" OR
|
|
CMAKE_SYSTEM_NAME MATCHES "DragonFly"
|
|
)
|
|
add_compile_definitions(_DARWIN_C_SOURCE)
|
|
endif()
|
|
|
|
# alloca is a non-standard interface that is not visible on BSDs when
|
|
# POSIX conformance is specified, but not all of them provide a clean way
|
|
# to enable it in such cases
|
|
if (CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
|
|
add_compile_definitions(__BSD_VISIBLE)
|
|
endif()
|
|
if (CMAKE_SYSTEM_NAME MATCHES "NetBSD")
|
|
add_compile_definitions(_NETBSD_SOURCE)
|
|
endif()
|
|
if (CMAKE_SYSTEM_NAME MATCHES "OpenBSD")
|
|
add_compile_definitions(_BSD_SOURCE)
|
|
endif()
|
|
|
|
if (WIN32)
|
|
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
|
|
endif()
|
|
|
|
# ggml
|
|
|
|
if (GGML_BACKEND_DL AND NOT BUILD_SHARED_LIBS)
|
|
message(FATAL_ERROR "GGML_BACKEND_DL requires BUILD_SHARED_LIBS")
|
|
endif()
|
|
|
|
add_library(ggml-base
|
|
../include/ggml.h
|
|
../include/ggml-alloc.h
|
|
../include/ggml-backend.h
|
|
../include/ggml-cpp.h
|
|
../include/ggml-opt.h
|
|
../include/gguf.h
|
|
ggml.c
|
|
ggml.cpp
|
|
ggml-alloc.c
|
|
ggml-backend.cpp
|
|
ggml-opt.cpp
|
|
ggml-threading.cpp
|
|
ggml-threading.h
|
|
ggml-quants.c
|
|
ggml-quants.h
|
|
gguf.cpp)
|
|
|
|
set_target_properties(ggml-base PROPERTIES
|
|
VERSION ${GGML_VERSION}
|
|
SOVERSION ${GGML_VERSION_MAJOR}
|
|
)
|
|
|
|
target_include_directories(ggml-base PRIVATE .)
|
|
if (GGML_BACKEND_DL)
|
|
target_compile_definitions(ggml-base PUBLIC GGML_BACKEND_DL)
|
|
endif()
|
|
|
|
if (GGML_SCHED_NO_REALLOC)
|
|
target_compile_definitions(ggml-base PUBLIC GGML_SCHED_NO_REALLOC)
|
|
endif()
|
|
|
|
add_library(ggml
|
|
ggml-backend-reg.cpp)
|
|
add_library(ggml::ggml ALIAS ggml)
|
|
|
|
set_target_properties(ggml PROPERTIES
|
|
VERSION ${GGML_VERSION}
|
|
SOVERSION ${GGML_VERSION_MAJOR}
|
|
)
|
|
|
|
if (GGML_BACKEND_DIR)
|
|
if (NOT GGML_BACKEND_DL)
|
|
message(FATAL_ERROR "GGML_BACKEND_DIR requires GGML_BACKEND_DL")
|
|
endif()
|
|
target_compile_definitions(ggml PUBLIC GGML_BACKEND_DIR="${GGML_BACKEND_DIR}")
|
|
endif()
|
|
|
|
target_link_libraries(ggml PUBLIC ggml-base)
|
|
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
target_link_libraries(ggml PRIVATE dl)
|
|
endif()
|
|
|
|
function(ggml_add_backend_library backend)
|
|
if (GGML_BACKEND_DL)
|
|
add_library(${backend} MODULE ${ARGN})
|
|
# write the shared library to the output directory
|
|
set_target_properties(${backend} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})
|
|
target_compile_definitions(${backend} PRIVATE GGML_BACKEND_DL)
|
|
add_dependencies(ggml ${backend})
|
|
if (GGML_BACKEND_DIR)
|
|
install(TARGETS ${backend} LIBRARY DESTINATION ${GGML_BACKEND_DIR})
|
|
else()
|
|
install(TARGETS ${backend} LIBRARY DESTINATION ${CMAKE_INSTALL_BINDIR})
|
|
endif()
|
|
else()
|
|
add_library(${backend} ${ARGN})
|
|
target_link_libraries(ggml PUBLIC ${backend})
|
|
install(TARGETS ${backend} LIBRARY)
|
|
endif()
|
|
|
|
target_link_libraries(${backend} PRIVATE ggml-base)
|
|
target_include_directories(${backend} PRIVATE ..)
|
|
|
|
if (${BUILD_SHARED_LIBS})
|
|
target_compile_definitions(${backend} PRIVATE GGML_BACKEND_BUILD)
|
|
target_compile_definitions(${backend} PUBLIC GGML_BACKEND_SHARED)
|
|
endif()
|
|
|
|
# Set versioning properties for all backend libraries
|
|
# Building a MODULE library with a version is not supported on macOS (https://gitlab.kitware.com/cmake/cmake/-/issues/20782)
|
|
if (NOT (APPLE AND GGML_BACKEND_DL))
|
|
set_target_properties(${backend} PROPERTIES
|
|
VERSION ${GGML_VERSION}
|
|
SOVERSION ${GGML_VERSION_MAJOR}
|
|
)
|
|
endif()
|
|
|
|
if(NOT GGML_AVAILABLE_BACKENDS)
|
|
set(GGML_AVAILABLE_BACKENDS "${backend}"
|
|
CACHE INTERNAL "List of backends for cmake package")
|
|
else()
|
|
list(FIND GGML_AVAILABLE_BACKENDS "${backend}" has_backend)
|
|
if(has_backend EQUAL -1)
|
|
set(GGML_AVAILABLE_BACKENDS "${GGML_AVAILABLE_BACKENDS};${backend}"
|
|
CACHE INTERNAL "List of backends for cmake package")
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
function(ggml_add_backend backend)
|
|
string(TOUPPER "GGML_${backend}" backend_id)
|
|
if (${backend_id})
|
|
string(TOLOWER "ggml-${backend}" backend_target)
|
|
add_subdirectory(${backend_target})
|
|
message(STATUS "Including ${backend} backend")
|
|
if (NOT GGML_BACKEND_DL)
|
|
string(TOUPPER "GGML_USE_${backend}" backend_use)
|
|
target_compile_definitions(ggml PUBLIC ${backend_use})
|
|
endif()
|
|
endif()
|
|
endfunction()
|
|
|
|
function(ggml_add_cpu_backend_variant tag_name)
|
|
set(GGML_CPU_TAG_NAME ${tag_name})
|
|
# other: OPENMP LLAMAFILE CPU_HBM
|
|
if (GGML_SYSTEM_ARCH STREQUAL "x86")
|
|
foreach (feat NATIVE
|
|
SSE42
|
|
AVX AVX2 BMI2 AVX_VNNI FMA F16C
|
|
AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16
|
|
AMX_TILE AMX_INT8 AMX_BF16)
|
|
set(GGML_${feat} OFF)
|
|
endforeach()
|
|
|
|
foreach (feat ${ARGN})
|
|
set(GGML_${feat} ON)
|
|
endforeach()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "ARM")
|
|
foreach (feat ${ARGN})
|
|
set(GGML_INTERNAL_${feat} ON)
|
|
endforeach()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
|
|
foreach (feat ${ARGN})
|
|
set(GGML_INTERNAL_${feat} ON)
|
|
endforeach()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "s390x")
|
|
foreach (feat VXE2 NNPA)
|
|
set(GGML_INTERNAL_${feat} OFF)
|
|
endforeach()
|
|
|
|
foreach (feat ${ARGN})
|
|
set(GGML_INTERNAL_${feat} ON)
|
|
endforeach()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "riscv64")
|
|
foreach (feat RVV)
|
|
set(GGML_INTERNAL_${feat} OFF)
|
|
endforeach()
|
|
|
|
foreach (feat ${ARGN})
|
|
set(GGML_INTERNAL_${feat} ON)
|
|
endforeach()
|
|
endif()
|
|
|
|
ggml_add_cpu_backend_variant_impl(${tag_name})
|
|
endfunction()
|
|
|
|
ggml_add_backend(CPU)
|
|
|
|
if (GGML_CPU_ALL_VARIANTS)
|
|
if (NOT GGML_BACKEND_DL)
|
|
message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS requires GGML_BACKEND_DL")
|
|
elseif (GGML_CPU_ARM_ARCH)
|
|
message(FATAL_ERROR "Cannot use both GGML_CPU_ARM_ARCH and GGML_CPU_ALL_VARIANTS")
|
|
endif()
|
|
if (GGML_SYSTEM_ARCH STREQUAL "x86")
|
|
ggml_add_cpu_backend_variant(x64)
|
|
ggml_add_cpu_backend_variant(sse42 SSE42)
|
|
ggml_add_cpu_backend_variant(sandybridge SSE42 AVX)
|
|
ggml_add_cpu_backend_variant(haswell SSE42 AVX F16C AVX2 BMI2 FMA)
|
|
ggml_add_cpu_backend_variant(skylakex SSE42 AVX F16C AVX2 BMI2 FMA AVX512)
|
|
ggml_add_cpu_backend_variant(icelake SSE42 AVX F16C AVX2 BMI2 FMA AVX512 AVX512_VBMI AVX512_VNNI)
|
|
ggml_add_cpu_backend_variant(alderlake SSE42 AVX F16C AVX2 BMI2 FMA AVX_VNNI)
|
|
if (NOT MSVC)
|
|
# MSVC doesn't support AMX
|
|
ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C AVX2 BMI2 FMA AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8)
|
|
endif()
|
|
elseif(GGML_SYSTEM_ARCH STREQUAL "ARM")
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
# Many of these features are optional so we build versions with popular
|
|
# combinations and name the backends based on the version they were
|
|
# first released with
|
|
ggml_add_cpu_backend_variant(armv8.0_1)
|
|
ggml_add_cpu_backend_variant(armv8.2_1 DOTPROD)
|
|
ggml_add_cpu_backend_variant(armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC)
|
|
ggml_add_cpu_backend_variant(armv8.2_3 DOTPROD FP16_VECTOR_ARITHMETIC SVE)
|
|
ggml_add_cpu_backend_variant(armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8)
|
|
ggml_add_cpu_backend_variant(armv8.6_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2)
|
|
ggml_add_cpu_backend_variant(armv9.2_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SME)
|
|
ggml_add_cpu_backend_variant(armv9.2_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2 SME)
|
|
elseif (CMAKE_SYSTEM_NAME MATCHES "Android")
|
|
# Android-specific backends with SoC-compatible feature sets
|
|
ggml_add_cpu_backend_variant(android_armv8.0_1)
|
|
ggml_add_cpu_backend_variant(android_armv8.2_1 DOTPROD)
|
|
ggml_add_cpu_backend_variant(android_armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC)
|
|
ggml_add_cpu_backend_variant(android_armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC MATMUL_INT8)
|
|
ggml_add_cpu_backend_variant(android_armv9.0_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE2)
|
|
ggml_add_cpu_backend_variant(android_armv9.2_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SME)
|
|
ggml_add_cpu_backend_variant(android_armv9.2_2 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SME)
|
|
elseif (APPLE)
|
|
ggml_add_cpu_backend_variant(apple_m1 DOTPROD)
|
|
ggml_add_cpu_backend_variant(apple_m2_m3 DOTPROD MATMUL_INT8)
|
|
ggml_add_cpu_backend_variant(apple_m4 DOTPROD MATMUL_INT8 NOSVE SME)
|
|
else()
|
|
message(FATAL_ERROR "Unsupported ARM target OS: ${CMAKE_SYSTEM_NAME}")
|
|
endif()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "PowerPC")
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
ggml_add_cpu_backend_variant(power0)
|
|
ggml_add_cpu_backend_variant(power7_1 POWER7)
|
|
ggml_add_cpu_backend_variant(power7_2 POWER7 VSX)
|
|
ggml_add_cpu_backend_variant(power8_1 POWER8)
|
|
ggml_add_cpu_backend_variant(power8_2 POWER8 VSX)
|
|
ggml_add_cpu_backend_variant(power9 POWER9 VSX)
|
|
ggml_add_cpu_backend_variant(power10 POWER10 VSX)
|
|
ggml_add_cpu_backend_variant(power11 POWER11 VSX)
|
|
else()
|
|
message(FATAL_ERROR "Unsupported PowerPC target OS: ${CMAKE_SYSTEM_NAME}")
|
|
endif()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "s390x")
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
ggml_add_cpu_backend_variant(z15 Z15 VXE2)
|
|
ggml_add_cpu_backend_variant(z16 Z16 VXE2 NNPA)
|
|
else()
|
|
message(FATAL_ERROR "Unsupported s390x target OS: ${CMAKE_SYSTEM_NAME}")
|
|
endif()
|
|
elseif (GGML_SYSTEM_ARCH STREQUAL "riscv64")
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Linux")
|
|
ggml_add_cpu_backend_variant(riscv64_0)
|
|
ggml_add_cpu_backend_variant(riscv64_v RVV)
|
|
else()
|
|
message(FATAL_ERROR "Unsupported RISC-V target OS: ${CMAKE_SYSTEM_NAME}")
|
|
endif()
|
|
else()
|
|
message(FATAL_ERROR "GGML_CPU_ALL_VARIANTS not yet supported with ${GGML_SYSTEM_ARCH} on ${CMAKE_SYSTEM_NAME}")
|
|
endif()
|
|
elseif (GGML_CPU)
|
|
ggml_add_cpu_backend_variant_impl("")
|
|
endif()
|
|
|
|
ggml_add_backend(BLAS)
|
|
ggml_add_backend(CANN)
|
|
ggml_add_backend(CUDA)
|
|
ggml_add_backend(HIP)
|
|
ggml_add_backend(METAL)
|
|
ggml_add_backend(MUSA)
|
|
ggml_add_backend(RPC)
|
|
ggml_add_backend(SYCL)
|
|
ggml_add_backend(Vulkan)
|
|
ggml_add_backend(WebGPU)
|
|
ggml_add_backend(zDNN)
|
|
ggml_add_backend(OpenCL)
|
|
ggml_add_backend(Hexagon)
|
|
ggml_add_backend(ZenDNN)
|
|
|
|
foreach (target ggml-base ggml)
|
|
target_include_directories(${target} PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../include> $<INSTALL_INTERFACE:include>)
|
|
target_compile_features (${target} PRIVATE c_std_11 cxx_std_17) # don't bump
|
|
endforeach()
|
|
|
|
target_link_libraries(ggml-base PRIVATE Threads::Threads)
|
|
|
|
find_library(MATH_LIBRARY m)
|
|
if (MATH_LIBRARY)
|
|
if (NOT WIN32 OR NOT DEFINED ENV{ONEAPI_ROOT})
|
|
target_link_libraries(ggml-base PRIVATE m)
|
|
endif()
|
|
endif()
|
|
|
|
if (CMAKE_SYSTEM_NAME MATCHES "Android")
|
|
target_link_libraries(ggml-base PRIVATE dl)
|
|
endif()
|
|
|
|
if(CMAKE_SYSTEM_NAME MATCHES "visionOS")
|
|
target_compile_definitions(ggml-base PUBLIC _DARWIN_C_SOURCE)
|
|
endif()
|
|
|
|
if (BUILD_SHARED_LIBS)
|
|
foreach (target ggml-base ggml)
|
|
set_target_properties(${target} PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
|
target_compile_definitions(${target} PRIVATE GGML_BUILD)
|
|
target_compile_definitions(${target} PUBLIC GGML_SHARED)
|
|
endforeach()
|
|
endif()
|