char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
86b351fd6
char/aliceai-t5-moe
1include ( CheckCXXCompilerFlag ) 2include ( "../cmake/common.cmake" ) 3 4add_compile_definitions ( GGML_SCHED_MAX_COPIES= ${ GGML_SCHED_MAX_COPIES }) 5 6# enable libstdc++ assertions for debug builds 7if ( CMAKE_SYSTEM_NAMEMATCHES "Linux" ) 8add_compile_definitions ( $< $ <CONFIG:Debug>:_GLIBCXX_ASSERTIONS> ) 9endif () 10 11if ( NOT MSVC) 12if ( GGML_SANITIZE_THREAD) 13add_compile_options ( -fsanitize=thread ) 14link_libraries ( -fsanitize=thread ) 15endif () 16 17if ( GGML_SANITIZE_ADDRESS) 18add_compile_options ( -fsanitize=address -fno-omit-frame-pointer ) 19link_libraries ( -fsanitize=address ) 20endif () 21 22if ( GGML_SANITIZE_UNDEFINED) 23add_compile_options ( -fsanitize=undefined ) 24link_libraries ( -fsanitize=undefined ) 25endif () 26endif () 27 28if ( GGML_FATAL_WARNINGS) 29if ( CMAKE_CXX_COMPILER_IDMATCHES "GNU" OR CMAKE_CXX_COMPILER_IDMATCHES "Clang" ) 30list ( APPEND C_FLAGS -Werror ) 31list ( APPEND CXX_FLAGS -Werror ) 32elseif ( CMAKE_CXX_COMPILER_IDSTREQUAL "MSVC" ) 33add_compile_options ( /WX ) 34endif () 35endif () 36 37if ( GGML_ALL_WARNINGS) 38if ( NOT MSVC) 39list ( APPEND WARNING_FLAGS -Wall -Wextra -Wpedantic -Wcast-qual -Wno-unused-function ) 40list ( APPEND C_FLAGS -Wshadow -Wstrict-prototypes -Wpointer-arith -Wmissing-prototypes 41-Werror=implicit-int -Werror=implicit-function-declaration ) 42list ( APPEND CXX_FLAGS -Wmissing-declarations -Wmissing-noreturn ) 43 44list ( APPEND C_FLAGS ${ WARNING_FLAGS }) 45list ( APPEND CXX_FLAGS ${ WARNING_FLAGS }) 46 47ggml_get_flags ( $ { CMAKE_CXX_COMPILER_ID } ${ CMAKE_CXX_COMPILER_VERSION }) 48 49add_compile_options ( " $ < $ <COMPILE_LANGUAGE:C>: ${ C_FLAGS } ; ${ GF_C_FLAGS } >" 50" $ < $ <COMPILE_LANGUAGE:CXX>: ${ CXX_FLAGS } ; ${ GF_CXX_FLAGS } >" ) 51else () 52# todo : msvc 53set ( C_FLAGS "" ) 54set ( CXX_FLAGS "" ) 55endif () 56endif () 57 58if ( GGML_LTO) 59include ( CheckIPOSupported ) 60check_ipo_supported ( RESULT result OUTPUT output ) 61if ( result) 62set ( CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE ) 63else () 64message ( WARNING "IPO is not supported: ${ output } " ) 65endif () 66endif () 67 68if ( GGML_CCACHEAND NOT CMAKE_C_COMPILER_LAUNCHERAND NOT CMAKE_CXX_COMPILER_LAUNCHER) 69find_program ( GGML_CCACHE_FOUND ccache ) 70find_program ( GGML_SCCACHE_FOUND sccache ) 71 72if ( GGML_CCACHE_FOUNDOR GGML_SCCACHE_FOUND) 73if ( GGML_CCACHE_FOUND) 74set ( GGML_CCACHE_VARIANT ccache ) 75else () 76set ( GGML_CCACHE_VARIANT sccache ) 77endif () 78# TODO: should not be set globally 79if ( GGML_SYCLAND GGML_CCACHE_FOUNDAND WIN32) 80set_property ( GLOBAL PROPERTY RULE_LAUNCH_COMPILE "ccache compiler_type=icl" ) 81else () 82set_property ( GLOBAL PROPERTY RULE_LAUNCH_COMPILE " ${ GGML_CCACHE_VARIANT } " ) 83endif () 84set ( ENV{CCACHE_SLOPPINESS} time_macros ) 85message ( STATUS " ${ GGML_CCACHE_VARIANT } found, compilation results will be cached. Disable with GGML_CCACHE=OFF." ) 86else () 87message ( STATUS "Warning: ccache not found - consider installing it for faster compilation or disable this warning with GGML_CCACHE=OFF" ) 88endif () 89endif () 90 91# this version of Apple ld64 is buggy 92execute_process ( 93COMMAND ${ CMAKE_C_COMPILER } ${ CMAKE_EXE_LINKER_FLAGS } -Wl,-v 94ERROR_VARIABLE output 95OUTPUT_QUIET 96) 97 98if ( outputMATCHES "dyld-1015\.7" ) 99add_compile_definitions ( HAVE_BUGGY_APPLE_LINKER ) 100endif () 101 102# architecture specific 103# TODO: probably these flags need to be tweaked on some architectures 104# feel free to update the Makefile for your architecture and send a pull request or issue 105message ( STATUS "CMAKE_SYSTEM_PROCESSOR: ${ CMAKE_SYSTEM_PROCESSOR } " ) 106if ( MSVC) 107string ( TOLOWER " ${ CMAKE_GENERATOR_PLATFORM } " CMAKE_GENERATOR_PLATFORM_LWR ) 108message ( STATUS "CMAKE_GENERATOR_PLATFORM: ${ CMAKE_GENERATOR_PLATFORM } " ) 109else () 110set ( CMAKE_GENERATOR_PLATFORM_LWR "" ) 111endif () 112ggml_get_system_arch () 113message ( STATUS "GGML_SYSTEM_ARCH: ${ GGML_SYSTEM_ARCH } " ) 114 115if ( NOT MSVC) 116if ( GGML_STATIC) 117if ( UNIXAND NOT APPLE) 118set ( CMAKE_FIND_LIBRARY_SUFFIXES ".a;.so" ) 119endif () 120add_link_options ( -static ) 121if ( MINGW) 122add_link_options ( -static-libgcc -static-libstdc++ ) 123endif () 124endif () 125if ( GGML_GPROF) 126add_compile_options ( -pg ) 127endif () 128endif () 129 130# 131# POSIX conformance 132# 133 134# clock_gettime came in POSIX.1b (1993) 135# CLOCK_MONOTONIC came in POSIX.1-2001 / SUSv3 as optional 136# posix_memalign came in POSIX.1-2001 / SUSv3 137# M_PI is an XSI extension since POSIX.1-2001 / SUSv3, came in XPG1 (1985) 138 139# Somehow in OpenBSD whenever POSIX conformance is specified 140# some string functions rely on locale_t availability, 141# which was introduced in POSIX.1-2008, forcing us to go higher 142if ( CMAKE_SYSTEM_NAMEMATCHES "OpenBSD" ) 143add_compile_definitions ( _XOPEN_SOURCE=700 ) 144elseif ( CMAKE_SYSTEM_NAMEMATCHES "AIX" ) 145# Don't define _XOPEN_SOURCE. We need _ALL_SOURCE, which is the default, 146# in order to define _SC_PHYS_PAGES. 147else () 148add_compile_definitions ( _XOPEN_SOURCE=600 ) 149endif () 150 151# Data types, macros and functions related to controlling CPU affinity and 152# some memory allocation are available on Linux through GNU extensions in libc 153if ( CMAKE_SYSTEM_NAMEMATCHES "Linux" OR CMAKE_SYSTEM_NAMEMATCHES "Android" ) 154add_compile_definitions ( _GNU_SOURCE ) 155endif () 156 157# RLIMIT_MEMLOCK came in BSD, is not specified in POSIX.1, 158# and on macOS its availability depends on enabling Darwin extensions 159# similarly on DragonFly, enabling BSD extensions is necessary 160if ( 161 CMAKE_SYSTEM_NAMEMATCHES "Darwin" OR 162 CMAKE_SYSTEM_NAMEMATCHES "iOS" OR 163 CMAKE_SYSTEM_NAMEMATCHES "tvOS" OR 164 CMAKE_SYSTEM_NAMEMATCHES "DragonFly" 165) 166add_compile_definitions ( _DARWIN_C_SOURCE ) 167endif () 168 169# alloca is a non-standard interface that is not visible on BSDs when 170# POSIX conformance is specified, but not all of them provide a clean way 171# to enable it in such cases 172if ( CMAKE_SYSTEM_NAMEMATCHES "FreeBSD" ) 173add_compile_definitions ( __BSD_VISIBLE ) 174endif () 175if ( CMAKE_SYSTEM_NAMEMATCHES "NetBSD" ) 176add_compile_definitions ( _NETBSD_SOURCE ) 177endif () 178if ( CMAKE_SYSTEM_NAMEMATCHES "OpenBSD" ) 179add_compile_definitions ( _BSD_SOURCE ) 180endif () 181 182if ( WIN32) 183add_compile_definitions ( _CRT_SECURE_NO_WARNINGS ) 184endif () 185 186# ggml 187 188if ( GGML_BACKEND_DLAND NOT BUILD_SHARED_LIBS) 189message ( FATAL_ERROR "GGML_BACKEND_DL requires BUILD_SHARED_LIBS" ) 190endif () 191 192add_library ( ggml-base 193../include/ggml.h 194../include/ggml-alloc.h 195../include/ggml-backend.h 196../include/ggml-cpp.h 197../include/ggml-opt.h 198../include/gguf.h 199ggml.c 200ggml.cpp 201ggml-alloc.c 202ggml-backend.cpp 203ggml-backend-meta.cpp 204ggml-opt.cpp 205ggml-threading.cpp 206ggml-threading.h 207ggml-quants.c 208ggml-quants.h 209gguf.cpp ) 210 211set_target_properties ( ggml-base PROPERTIES 212VERSION ${ GGML_VERSION } 213SOVERSION ${ GGML_VERSION_MAJOR } 214) 215 216configure_file ( ggml-version.h.in ${ CMAKE_CURRENT_BINARY_DIR } /ggml-version.h @ONLY ) 217 218target_include_directories ( ggml-base PRIVATE . ${ CMAKE_CURRENT_BINARY_DIR }) 219if ( GGML_BACKEND_DL) 220target_compile_definitions ( ggml-base PUBLIC GGML_BACKEND_DL ) 221endif () 222 223if ( GGML_SCHED_NO_REALLOC) 224target_compile_definitions ( ggml-base PUBLIC GGML_SCHED_NO_REALLOC ) 225endif () 226 227if ( GGML_OPENMP_FETCH) 228if ( NOT GGML_OPENMP) 229message ( FATAL_ERROR "GGML_OPENMP_FETCH requires GGML_OPENMP" ) 230elseif ( NOT WIN32OR NOT ( CMAKE_C_COMPILER_IDMATCHES "Clang" )) 231message ( FATAL_ERROR "GGML_OPENMP_FETCH currently requires Clang on Windows" ) 232endif () 233 234set ( GGML_OPENMP_LLVM_VERSION "20.1.8" ) 235string ( REGEX MATCH "^[0-9]+" GGML_OPENMP_LLVM_VERSION_MAJOR " ${ GGML_OPENMP_LLVM_VERSION } " ) 236string ( REGEX MATCH "^[0-9]+" GGML_OPENMP_COMPILER_VERSION_MAJOR " ${ CMAKE_C_COMPILER_VERSION } " ) 237if ( NOT GGML_OPENMP_COMPILER_VERSION_MAJORSTREQUAL GGML_OPENMP_LLVM_VERSION_MAJOR) 238message ( FATAL_ERROR "LLVM OpenMP ${ GGML_OPENMP_LLVM_VERSION } requires Clang ${ GGML_OPENMP_LLVM_VERSION_MAJOR } .x" ) 239endif () 240 241string ( TOLOWER " ${ CMAKE_SYSTEM_PROCESSOR } " GGML_OPENMP_SYSTEM_PROCESSOR ) 242if ( GGML_OPENMP_SYSTEM_PROCESSORMATCHES "^(amd64|x86_64) $ " ) 243set ( GGML_OPENMP_ARCH "x64" ) 244set ( GGML_OPENMP_INSTALLER_SUFFIX "win64" ) 245set ( GGML_OPENMP_INSTALLER_SHA256 "3197846a2b19063687dd56e93e34cd941e3548d907f23a6131571321bdf9fe7b" ) 246elseif ( GGML_OPENMP_SYSTEM_PROCESSORMATCHES "^(aarch64|arm64) $ " ) 247set ( GGML_OPENMP_ARCH "arm64" ) 248set ( GGML_OPENMP_INSTALLER_SUFFIX "woa64" ) 249set ( GGML_OPENMP_INSTALLER_SHA256 "7c4ac97eb2ae6b960ca5f9caf3ff6124c8d2a18cc07a7840a4d2ea15537bad8e" ) 250else () 251message ( FATAL_ERROR "GGML_OPENMP_FETCH does not support ${ CMAKE_SYSTEM_PROCESSOR } " ) 252endif () 253 254set ( GGML_OPENMP_CACHE_DIR " ${ CMAKE_BINARY_DIR } /_deps" ) 255set ( GGML_OPENMP_ROOT " ${ GGML_OPENMP_CACHE_DIR } /llvm-openmp- ${ GGML_OPENMP_LLVM_VERSION } - ${ GGML_OPENMP_ARCH } " ) 256set ( GGML_OPENMP_LIBRARY " ${ GGML_OPENMP_ROOT } /lib/libomp.lib" ) 257set ( GGML_OPENMP_RUNTIME " ${ GGML_OPENMP_ROOT } /bin/libomp.dll" ) 258set ( GGML_OPENMP_HEADER " ${ GGML_OPENMP_ROOT } /include/omp.h" ) 259set ( GGML_OPENMP_LICENSE " ${ GGML_OPENMP_ROOT } /LICENSE.TXT" ) 260set ( GGML_OPENMP_LICENSE_SHA256 "fdad1758a9e1f9d5a81e18879b3406772115edc92c24bfa36b70c654f325e8e4" ) 261 262if ( NOT EXISTS " ${ GGML_OPENMP_LIBRARY } " OR NOT EXISTS " ${ GGML_OPENMP_RUNTIME } " OR NOT EXISTS " ${ GGML_OPENMP_HEADER } " ) 263find_program ( GGML_OPENMP_7Z NAMES 7z 7zz 7za ) 264if ( NOT GGML_OPENMP_7Z) 265message ( FATAL_ERROR "GGML_OPENMP_FETCH requires 7-Zip to extract the LLVM installer" ) 266endif () 267 268set ( GGML_OPENMP_INSTALLER " ${ GGML_OPENMP_ROOT } /LLVM- ${ GGML_OPENMP_LLVM_VERSION } - ${ GGML_OPENMP_INSTALLER_SUFFIX } .exe" ) 269set ( GGML_OPENMP_EXTRACT_DIR " ${ GGML_OPENMP_ROOT } /extract" ) 270set ( GGML_OPENMP_INSTALLER_URL "https://github.com/llvm/llvm-project/releases/download/llvmorg- ${ GGML_OPENMP_LLVM_VERSION } /LLVM- ${ GGML_OPENMP_LLVM_VERSION } - ${ GGML_OPENMP_INSTALLER_SUFFIX } .exe" ) 271 272file ( MAKE_DIRECTORY " ${ GGML_OPENMP_EXTRACT_DIR } " ) 273file ( DOWNLOAD " ${ GGML_OPENMP_INSTALLER_URL } " " ${ GGML_OPENMP_INSTALLER } " 274EXPECTED_HASH "SHA256= ${ GGML_OPENMP_INSTALLER_SHA256 } " 275SHOW_PROGRESS 276STATUS GGML_OPENMP_DOWNLOAD_STATUS ) 277list ( GET GGML_OPENMP_DOWNLOAD_STATUS 0 GGML_OPENMP_DOWNLOAD_RESULT ) 278if ( NOT GGML_OPENMP_DOWNLOAD_RESULTEQUAL 0 ) 279list ( GET GGML_OPENMP_DOWNLOAD_STATUS 1 GGML_OPENMP_DOWNLOAD_ERROR ) 280message ( FATAL_ERROR "Failed to download LLVM OpenMP: ${ GGML_OPENMP_DOWNLOAD_ERROR } " ) 281endif () 282 283execute_process ( 284COMMAND " ${ GGML_OPENMP_7Z } " e -y "-o ${ GGML_OPENMP_EXTRACT_DIR } " " ${ GGML_OPENMP_INSTALLER } " -r libomp.lib libomp.dll omp.h 285RESULT_VARIABLE GGML_OPENMP_EXTRACT_RESULT 286OUTPUT_QUIET ) 287if ( NOT GGML_OPENMP_EXTRACT_RESULTEQUAL 0 OR 288NOT EXISTS " ${ GGML_OPENMP_EXTRACT_DIR } /libomp.lib" OR 289NOT EXISTS " ${ GGML_OPENMP_EXTRACT_DIR } /libomp.dll" OR 290NOT EXISTS " ${ GGML_OPENMP_EXTRACT_DIR } /omp.h" ) 291message ( FATAL_ERROR "Failed to extract libomp from ${ GGML_OPENMP_INSTALLER } " ) 292endif () 293 294file ( MAKE_DIRECTORY " ${ GGML_OPENMP_ROOT } /lib" " ${ GGML_OPENMP_ROOT } /bin" " ${ GGML_OPENMP_ROOT } /include" ) 295file ( COPY " ${ GGML_OPENMP_EXTRACT_DIR } /libomp.lib" DESTINATION " ${ GGML_OPENMP_ROOT } /lib" ) 296file ( COPY " ${ GGML_OPENMP_EXTRACT_DIR } /libomp.dll" DESTINATION " ${ GGML_OPENMP_ROOT } /bin" ) 297file ( COPY " ${ GGML_OPENMP_EXTRACT_DIR } /omp.h" DESTINATION " ${ GGML_OPENMP_ROOT } /include" ) 298file ( REMOVE_RECURSE " ${ GGML_OPENMP_INSTALLER } " " ${ GGML_OPENMP_EXTRACT_DIR } " ) 299endif () 300 301# The NSIS installer embeds LLVM's general license in its UI but does not install it as a file; use OpenMP's license to include its additional notices. 302if ( EXISTS " ${ GGML_OPENMP_LICENSE } " ) 303file ( SHA256 " ${ GGML_OPENMP_LICENSE } " GGML_OPENMP_LICENSE_ACTUAL_SHA256 ) 304endif () 305if ( NOT GGML_OPENMP_LICENSE_ACTUAL_SHA256STREQUAL GGML_OPENMP_LICENSE_SHA256) 306file ( DOWNLOAD "https://raw.githubusercontent.com/llvm/llvm-project/llvmorg- ${ GGML_OPENMP_LLVM_VERSION } /openmp/LICENSE.TXT" " ${ GGML_OPENMP_LICENSE } " 307EXPECTED_HASH "SHA256= ${ GGML_OPENMP_LICENSE_SHA256 } " ) 308endif () 309 310if ( COMMAND license_add_file) 311license_add_file ( "LLVM OpenMP" " ${ GGML_OPENMP_LICENSE } " ) 312endif () 313 314add_library ( ggml-openmp-c INTERFACE ) 315target_compile_options ( ggml-openmp-c INTERFACE " $ < $ <COMPILE_LANGUAGE:C>:-fopenmp=libomp>" ) 316target_include_directories ( ggml-openmp-c SYSTEM INTERFACE " ${ GGML_OPENMP_ROOT } /include" ) 317target_link_libraries ( ggml-openmp-c INTERFACE " ${ GGML_OPENMP_LIBRARY } " ) 318 319add_library ( ggml-openmp-cxx INTERFACE ) 320target_compile_options ( ggml-openmp-cxx INTERFACE " $ < $ <COMPILE_LANGUAGE:CXX>:-fopenmp=libomp>" ) 321target_include_directories ( ggml-openmp-cxx SYSTEM INTERFACE " ${ GGML_OPENMP_ROOT } /include" ) 322target_link_libraries ( ggml-openmp-cxx INTERFACE " ${ GGML_OPENMP_LIBRARY } " ) 323 324set ( GGML_OPENMP_RUNTIME_OUTPUT_DIR " ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY } " ) 325if ( CMAKE_CONFIGURATION_TYPES) 326string ( APPEND GGML_OPENMP_RUNTIME_OUTPUT_DIR "/ $ <CONFIG>" ) 327endif () 328add_custom_target ( ggml-openmp-runtime ALL 329COMMAND ${ CMAKE_COMMAND } -E make_directory " ${ GGML_OPENMP_RUNTIME_OUTPUT_DIR } " 330COMMAND ${ CMAKE_COMMAND } -E copy_if_different " ${ GGML_OPENMP_RUNTIME } " " ${ GGML_OPENMP_RUNTIME_OUTPUT_DIR } /libomp.dll" 331COMMAND ${ CMAKE_COMMAND } -E copy_if_different " ${ GGML_OPENMP_LICENSE } " " ${ GGML_OPENMP_RUNTIME_OUTPUT_DIR } /LICENSE-LLVM-OpenMP" ) 332add_dependencies ( ggml-base ggml-openmp-runtime ) 333install ( FILES " ${ GGML_OPENMP_RUNTIME } " DESTINATION ${ CMAKE_INSTALL_BINDIR }) 334install ( FILES " ${ GGML_OPENMP_LICENSE } " DESTINATION ${ CMAKE_INSTALL_BINDIR } RENAME LICENSE-LLVM-OpenMP ) 335 336set ( GGML_OPENMP_TARGET_C ggml-openmp-c ) 337set ( GGML_OPENMP_TARGET_CXX ggml-openmp-cxx ) 338set ( GGML_OPENMP_ENABLED "ON" CACHE INTERNAL "" ) 339elseif ( GGML_OPENMP) 340find_package ( OpenMP ) 341if ( OpenMP_FOUND) 342set ( GGML_OPENMP_TARGET_C OpenMP::OpenMP_C ) 343set ( GGML_OPENMP_TARGET_CXX OpenMP::OpenMP_CXX ) 344set ( GGML_OPENMP_ENABLED "ON" CACHE INTERNAL "" ) 345else () 346set ( GGML_OPENMP_ENABLED "OFF" CACHE INTERNAL "" ) 347message ( WARNING "OpenMP not found" ) 348endif () 349else () 350set ( GGML_OPENMP_ENABLED "OFF" CACHE INTERNAL "" ) 351endif () 352 353if ( GGML_OPENMP_ENABLED) 354target_compile_definitions ( ggml-base PRIVATE GGML_USE_OPENMP ) 355target_link_libraries ( ggml-base PRIVATE ${ GGML_OPENMP_TARGET_C } ${ GGML_OPENMP_TARGET_CXX }) 356endif () 357 358add_library ( ggml 359ggml-backend-dl.cpp 360ggml-backend-reg.cpp ) 361add_library ( ggml::ggml ALIAS ggml ) 362 363set_target_properties ( ggml PROPERTIES 364VERSION ${ GGML_VERSION } 365SOVERSION ${ GGML_VERSION_MAJOR } 366) 367 368if ( GGML_BACKEND_DIR) 369if ( NOT GGML_BACKEND_DL) 370message ( FATAL_ERROR "GGML_BACKEND_DIR requires GGML_BACKEND_DL" ) 371endif () 372target_compile_definitions ( ggml PUBLIC GGML_BACKEND_DIR= " ${ GGML_BACKEND_DIR } " ) 373endif () 374 375target_link_libraries ( ggml PUBLIC ggml-base ) 376 377if ( CMAKE_SYSTEM_NAMEMATCHES "Linux" ) 378target_link_libraries ( ggml PRIVATE dl ) 379endif () 380 381function ( ggml_add_backend_library backend ) 382if ( GGML_BACKEND_DL) 383add_library ( $ { backend } MODULE ${ ARGN }) 384# write the shared library to the output directory 385set_target_properties ( $ { backend } PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${ CMAKE_RUNTIME_OUTPUT_DIRECTORY }) 386target_compile_definitions ( $ { backend } PRIVATE GGML_BACKEND_DL ) 387add_dependencies ( ggml ${ backend }) 388if ( GGML_BACKEND_DIR) 389install ( TARGETS ${ backend } LIBRARY DESTINATION ${ GGML_BACKEND_DIR }) 390else () 391install ( TARGETS ${ backend } LIBRARY DESTINATION ${ CMAKE_INSTALL_BINDIR }) 392endif () 393else () 394add_library ( $ { backend } ${ ARGN }) 395target_link_libraries ( ggml PUBLIC ${ backend }) 396install ( TARGETS ${ backend } LIBRARY ) 397endif () 398 399target_link_libraries ( $ { backend } PRIVATE ggml-base ) 400target_include_directories ( $ { backend } PRIVATE .. ) 401 402if (${ BUILD_SHARED_LIBS }) 403target_compile_definitions ( $ { backend } PRIVATE GGML_BACKEND_BUILD ) 404target_compile_definitions ( $ { backend } PUBLIC GGML_BACKEND_SHARED ) 405endif () 406 407# Set versioning properties for all backend libraries 408# Building a MODULE library with a version is not supported on macOS (https://gitlab.kitware.com/cmake/cmake/-/issues/20782) 409if ( NOT ( APPLEAND GGML_BACKEND_DL)) 410set_target_properties ( $ { backend } PROPERTIES 411VERSION ${ GGML_VERSION } 412SOVERSION ${ GGML_VERSION_MAJOR } 413) 414endif () 415 416if ( NOT GGML_AVAILABLE_BACKENDS) 417set ( GGML_AVAILABLE_BACKENDS " ${ backend } " 418CACHE INTERNAL "List of backends for cmake package" ) 419else () 420list ( FIND GGML_AVAILABLE_BACKENDS " ${ backend } " has_backend ) 421if ( has_backendEQUAL -1) 422set ( GGML_AVAILABLE_BACKENDS " ${ GGML_AVAILABLE_BACKENDS } ; ${ backend } " 423CACHE INTERNAL "List of backends for cmake package" ) 424endif () 425endif () 426endfunction () 427 428function ( ggml_add_backend backend ) 429string ( TOUPPER "GGML_ ${ backend } " backend_id ) 430if (${ backend_id }) 431string ( TOLOWER "ggml- ${ backend } " backend_target ) 432add_subdirectory ( $ { backend_target }) 433message ( STATUS "Including ${ backend } backend" ) 434if ( NOT GGML_BACKEND_DL) 435string ( TOUPPER "GGML_USE_ ${ backend } " backend_use ) 436target_compile_definitions ( ggml PUBLIC ${ backend_use }) 437endif () 438endif () 439endfunction () 440 441function ( ggml_add_cpu_backend_variant tag_name ) 442set ( GGML_CPU_TAG_NAME ${ tag_name }) 443# other: OPENMP LLAMAFILE CPU_HBM 444if ( GGML_SYSTEM_ARCHSTREQUAL "x86" ) 445foreach ( feat NATIVE 446 SSE42 447 AVX AVX2 BMI2 AVX_VNNI FMA F16C 448 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 449 AMX_TILE AMX_INT8 AMX_BF16) 450set ( GGML_ ${ feat } OFF ) 451endforeach () 452 453foreach ( feat${ ARGN }) 454set ( GGML_ ${ feat } ON ) 455endforeach () 456elseif ( GGML_SYSTEM_ARCHSTREQUAL "ARM" ) 457foreach ( feat${ ARGN }) 458set ( GGML_INTERNAL_ ${ feat } ON ) 459endforeach () 460elseif ( GGML_SYSTEM_ARCHSTREQUAL "PowerPC" ) 461foreach ( feat${ ARGN }) 462set ( GGML_INTERNAL_ ${ feat } ON ) 463endforeach () 464elseif ( GGML_SYSTEM_ARCHSTREQUAL "s390x" ) 465foreach ( feat VXE2 NNPA) 466set ( GGML_INTERNAL_ ${ feat } OFF ) 467endforeach () 468 469foreach ( feat${ ARGN }) 470set ( GGML_INTERNAL_ ${ feat } ON ) 471endforeach () 472elseif ( GGML_SYSTEM_ARCHSTREQUAL "riscv64" ) 473foreach ( feat RVV) 474set ( GGML_INTERNAL_ ${ feat } OFF ) 475endforeach () 476 477foreach ( feat${ ARGN }) 478set ( GGML_INTERNAL_ ${ feat } ON ) 479endforeach () 480endif () 481 482ggml_add_cpu_backend_variant_impl ( $ { tag_name }) 483endfunction () 484 485ggml_add_backend ( CPU ) 486 487if ( GGML_CPU_ALL_VARIANTS) 488if ( NOT GGML_BACKEND_DL) 489message ( FATAL_ERROR "GGML_CPU_ALL_VARIANTS requires GGML_BACKEND_DL" ) 490elseif ( GGML_CPU_ARM_ARCH) 491message ( FATAL_ERROR "Cannot use both GGML_CPU_ARM_ARCH and GGML_CPU_ALL_VARIANTS" ) 492endif () 493if ( GGML_SYSTEM_ARCHSTREQUAL "x86" ) 494ggml_add_cpu_backend_variant ( x64 ) 495ggml_add_cpu_backend_variant ( sse42 SSE42 ) 496ggml_add_cpu_backend_variant ( sandybridge SSE42 AVX ) 497if ( NOT MSVC) 498# __FMA__ and __F16C__ are not defined in MSVC, however they are implied with AVX2/AVX512 499ggml_add_cpu_backend_variant ( ivybridge SSE42 AVX F16C ) 500ggml_add_cpu_backend_variant ( piledriver SSE42 AVX F16C FMA ) 501endif () 502ggml_add_cpu_backend_variant ( haswell SSE42 AVX F16C FMA AVX2 BMI2 ) 503ggml_add_cpu_backend_variant ( skylakex SSE42 AVX F16C FMA AVX2 BMI2 AVX512 ) 504ggml_add_cpu_backend_variant ( cannonlake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI ) 505ggml_add_cpu_backend_variant ( cascadelake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI ) 506ggml_add_cpu_backend_variant ( icelake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI ) 507if ( NOT MSVC) 508# MSVC 2022 doesn't support BF16 intrinsics without `/arch:AVX10.1` ?! 509# https://learn.microsoft.com/en-us/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-170 510# https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170 511ggml_add_cpu_backend_variant ( cooperlake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI AVX512_BF16 ) 512ggml_add_cpu_backend_variant ( zen4 SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 ) 513endif () 514ggml_add_cpu_backend_variant ( alderlake SSE42 AVX F16C FMA AVX2 BMI2 AVX_VNNI ) 515if ( NOT MSVC) 516# MSVC doesn't support AMX 517ggml_add_cpu_backend_variant ( sapphirerapids SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16 AMX_TILE AMX_INT8 ) 518endif () 519elseif ( GGML_SYSTEM_ARCHSTREQUAL "ARM" ) 520if ( CMAKE_SYSTEM_NAMEMATCHES "Linux" ) 521# Many of these features are optional so we build versions with popular 522# combinations and name the backends based on the version they were 523# first released with 524ggml_add_cpu_backend_variant ( armv8.0_1 ) 525ggml_add_cpu_backend_variant ( armv8.2_1 DOTPROD ) 526ggml_add_cpu_backend_variant ( armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC ) 527ggml_add_cpu_backend_variant ( armv8.2_3 DOTPROD FP16_VECTOR_ARITHMETIC SVE ) 528ggml_add_cpu_backend_variant ( armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 ) 529ggml_add_cpu_backend_variant ( armv8.6_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2 ) 530ggml_add_cpu_backend_variant ( armv9.2_1 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SME ) 531ggml_add_cpu_backend_variant ( armv9.2_2 DOTPROD FP16_VECTOR_ARITHMETIC SVE MATMUL_INT8 SVE2 SME ) 532elseif ( CMAKE_SYSTEM_NAMEMATCHES "Android" ) 533# Android-specific backends with SoC-compatible feature sets 534ggml_add_cpu_backend_variant ( android_armv8.0_1 ) 535ggml_add_cpu_backend_variant ( android_armv8.2_1 DOTPROD ) 536ggml_add_cpu_backend_variant ( android_armv8.2_2 DOTPROD FP16_VECTOR_ARITHMETIC ) 537ggml_add_cpu_backend_variant ( android_armv8.6_1 DOTPROD FP16_VECTOR_ARITHMETIC MATMUL_INT8 ) 538ggml_add_cpu_backend_variant ( android_armv9.0_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE2 ) 539ggml_add_cpu_backend_variant ( android_armv9.2_1 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SME ) 540ggml_add_cpu_backend_variant ( android_armv9.2_2 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SVE2 SME ) 541elseif ( APPLE) 542ggml_add_cpu_backend_variant ( apple_m1 DOTPROD ) 543ggml_add_cpu_backend_variant ( apple_m2_m3 DOTPROD MATMUL_INT8 ) 544ggml_add_cpu_backend_variant ( apple_m4 DOTPROD MATMUL_INT8 NOSVE SME ) 545else () 546message ( FATAL_ERROR "Unsupported ARM target OS: ${ CMAKE_SYSTEM_NAME } " ) 547endif () 548elseif ( GGML_SYSTEM_ARCHSTREQUAL "PowerPC" ) 549if ( CMAKE_SYSTEM_NAMEMATCHES "Linux|AIX" ) 550ggml_add_cpu_backend_variant ( power0 ) 551ggml_add_cpu_backend_variant ( power7_1 POWER7 ) 552ggml_add_cpu_backend_variant ( power7_2 POWER7 VSX ) 553ggml_add_cpu_backend_variant ( power8_1 POWER8 ) 554ggml_add_cpu_backend_variant ( power8_2 POWER8 VSX ) 555ggml_add_cpu_backend_variant ( power9 POWER9 VSX ) 556ggml_add_cpu_backend_variant ( power10 POWER10 VSX ) 557# POWER11 backend: only if compiler supports -mcpu=power11 558check_cxx_compiler_flag ( "-mcpu=power11" GGML_CXX_SUPPORTS_POWER11 ) 559if ( GGML_CXX_SUPPORTS_POWER11) 560message ( STATUS "Compiler supports -mcpu=power11, enabling POWER11 backend" ) 561ggml_add_cpu_backend_variant ( power11 POWER11 VSX ) 562else () 563message ( STATUS "Skipping POWER11 backend: compiler does not support -mcpu=power11" ) 564endif () 565else () 566message ( FATAL_ERROR "Unsupported PowerPC target OS: ${ CMAKE_SYSTEM_NAME } " ) 567endif () 568elseif ( GGML_SYSTEM_ARCHSTREQUAL "s390x" ) 569if ( CMAKE_SYSTEM_NAMEMATCHES "Linux" ) 570ggml_add_cpu_backend_variant ( z15 Z15 VXE2 ) 571ggml_add_cpu_backend_variant ( z16 Z16 VXE2 NNPA ) 572else () 573message ( FATAL_ERROR "Unsupported s390x target OS: ${ CMAKE_SYSTEM_NAME } " ) 574endif () 575elseif ( GGML_SYSTEM_ARCHSTREQUAL "riscv64" ) 576if ( CMAKE_SYSTEM_NAMEMATCHES "Linux" ) 577ggml_add_cpu_backend_variant ( riscv64_0 ) 578ggml_add_cpu_backend_variant ( riscv64_v RVV ) 579else () 580message ( FATAL_ERROR "Unsupported RISC-V target OS: ${ CMAKE_SYSTEM_NAME } " ) 581endif () 582else () 583message ( FATAL_ERROR "GGML_CPU_ALL_VARIANTS not yet supported with ${ GGML_SYSTEM_ARCH } on ${ CMAKE_SYSTEM_NAME } " ) 584endif () 585elseif ( GGML_CPU) 586ggml_add_cpu_backend_variant_impl ( "" ) 587endif () 588 589ggml_add_backend ( BLAS ) 590ggml_add_backend ( CANN ) 591ggml_add_backend ( CUDA ) 592ggml_add_backend ( ET ) 593ggml_add_backend ( HIP ) 594ggml_add_backend ( METAL ) 595ggml_add_backend ( MUSA ) 596ggml_add_backend ( RPC ) 597ggml_add_backend ( VirtGPU ) 598ggml_add_backend ( SYCL ) 599ggml_add_backend ( Vulkan ) 600ggml_add_backend ( WebGPU ) 601ggml_add_backend ( zDNN ) 602ggml_add_backend ( OpenCL ) 603ggml_add_backend ( Hexagon ) 604ggml_add_backend ( ZenDNN ) 605ggml_add_backend ( OPENVINO ) 606 607foreach ( target ggml-base ggml) 608target_include_directories ( $ { target } PUBLIC $ <BUILD_INTERFACE: ${ CMAKE_CURRENT_SOURCE_DIR } /../include> $ <INSTALL_INTERFACE:include> ) 609target_compile_features ( $ { target } PRIVATE c_std_11 cxx_std_17 ) # don't bump 610endforeach () 611 612target_link_libraries ( ggml-base PRIVATE Threads::Threads ) 613 614if ( DEFINED MATH_LIBRARY) 615target_link_libraries ( ggml-base PRIVATE ${ MATH_LIBRARY }) 616elseif ( NOT WIN32AND NOT DEFINED ENV{ONEAPI_ROOT}) 617target_link_libraries ( ggml-base PRIVATE m ) 618endif () 619 620if ( CMAKE_SYSTEM_NAMEMATCHES "Android" ) 621target_link_libraries ( ggml-base PRIVATE dl ) 622endif () 623 624if ( CMAKE_SYSTEM_NAMEMATCHES "visionOS" ) 625target_compile_definitions ( ggml-base PUBLIC _DARWIN_C_SOURCE ) 626endif () 627 628if ( BUILD_SHARED_LIBS) 629foreach ( target ggml-base ggml) 630set_target_properties ( $ { target } PROPERTIES POSITION_INDEPENDENT_CODE ON ) 631target_compile_definitions ( $ { target } PRIVATE GGML_BUILD ) 632target_compile_definitions ( $ { target } PUBLIC GGML_SHARED ) 633endforeach () 634endif ()