9789c4ecdc
* Update build doc * Add cgraph tensor output name to OV op name * Update openvino build instructions * Add initial NPU support * draft NPU support version 2: prefill + kvcache * NPU support version 2: prefill + kvcache * Change due to ggml cgraph changes, not correct yet * Change due to ggml cgraph changes, llama-3.2 CPU work * Add AMD64 to CMakeLists * Change due to ggml cgraph changes, all device work * Refactor: clean, fix warning * Update clang-format * Statful transformation for CPU GPU * Add SwiGLU * Fuse to SDPA * Replace Concat with Broadcast in MulMat for GQA * Pull out indices creation for kv cache update * Refactor: remove past_token_len from extra_inputs * Fix Phi3 SwiGLU and SoftMax * Pull out sin cos from rope * Reduce memory: free ov weights node after graph conversion * Fix CPY due to cgraph change * Added OpenVINO CI/CD. Updated docs * Fix llama-cli * Fix Phi3 ROPE; Add test-backend-ops * Fix NPU * Fix llama-bench; Clang-format * Fix llama-perplexity * temp. changes for mark decomp * matmul in fp32 * mulmat input conversion fix * mulmat type conversion update * add mark decomp pass * Revert changes in fuse_to_sdpa * Update build.md * Fix test-backend-ops * Skip test-thread-safety; Run ctest only in ci/run.sh * Use CiD for NPU * Optimize tensor conversion, improve TTFT * Support op SET_ROWS * Fix NPU * Remove CPY * Fix test-backend-ops * Minor updates for raising PR * Perf: RMS fused to OV internal RMS op * Fix after rebasing - Layout of cache k and cache v are unified: [seq, n_head, head_size] - Add CPY and FLASH_ATTN_EXT, flash attn is not used yet - Skip test-backend-ops due to flash attn test crash - Add mutex around graph conversion to avoid test-thread-safety fali in the future - Update NPU config - Update GPU config to disable SDPA opt to make phi-3 run * Change openvino device_type to GPU; Enable flash_attn * Update supports_buft and supports_op for quantized models * Add quant weight conversion functions from genai gguf reader * Quant models run with accuracy issue * Fix accuracy: disable cpu_repack * Fix CI; Disable test-backend-ops * Fix Q4_1 * Fix test-backend-ops: Treat quantized tensors as weights * Add NPU Q4_0 support * NPU perf: eliminate zp * Dequantize q4_1 q4_k q6_k for NPU * Add custom quant type: q8_1_c, q4_0_128 * Set m_is_static=false as default in decoder * Simpilfy translation of get_rows * Fix after rebasing * Improve debug util; Eliminate nop ReshapeReshape * STYLE: make get_types_to_requant a function * Support BF16 model * Fix NPU compile * WA for npu 1st token acc issue * Apply EliminateZP only for npu * Add GeGLU * Fix Hunyuan * Support iSWA * Fix NPU accuracy * Fix ROPE accuracy when freq_scale != 1 * Minor: not add attention_size_swa for non-swa model * Minor refactor * Add Q5_K to support phi-3-q4_k_m * Requantize Q6_K (gs16) to gs32 on GPU * Fix after rebasing * Always apply Eliminate_ZP to fix GPU compile issue on some platforms * kvcachefusion support * env variable GGML_OPENVINO_DISABLE_SDPA_OPTIMIZATION added * Fix for Phi3 * Fix llama-cli (need to run with --no-warmup) * Fix add_sliced_mask; Revert mulmat, softmax; Remove input attention_size, iSWA model not working * fix after rebasing * Fix llama-3-8b and phi3-mini q4_0 NPU * Update to OV-2025.3 and CMakeLists.txt * Add OV CI cache * Apply CISC review and update CI to OV2025.3 * Update CI to run OV dep install before build * Update OV dockerfile to use OV2025.3 and update build docs * Style: use switch in supports_ops * Style: middle ptr and ref align, omit optional struct keyword * NPU Unify PD (#14) * Stateless. Fix llama-cli llama-server * Simplify broadcast op in attention * Replace get_output_tensor+memcpy with set_output_tensor * NPU unify PD. Unify dynamic and static dims * Clean placeholders in ggml-openvino.cpp * NPU unify PD (handled internally) * change graph to 4d, support multi sequences * Fix llama-bench * Fix NPU * Update ggml-decoder.cpp Hitting error while compiling on windows: error C3861: 'unsetenv': identifier not found Reason: unsetenv() is a POSIX function; it doesn’t exist on Windows. Visual Studio (MSVC) won’t recognize it. Proposed fix: Use _putenv_s() (Windows equivalent) This is supported by MSVC and achieves the same effect: it removes the environment variable from the process environment. This keeps cross-platform compatibility. * Update ggml-decoder.cpp * Update ggml-decoder.cpp * Update ggml-decoder.cpp * Update ggml-decoder.cpp * Update ggml-decoder.cpp * Remove the second decoder for node. Moving the function into the model decoder * Fix error for naive * NPU prefill chunking * NPU fix llama-bench * fallback naive run with accuracy issue * NPU support llma-perplexity -b 512 --no-warmup * Refactor: split ov_graph_compute for dynamic and static * remove unused API GgmlOvDecoder::get_output_stride(const std::string & name) * minor update due to ov 2025.4 * remove unused API GgmlOvDecoder::get_output_names() * remove unused API get_output_shape(const std::string & name) * Modified API GgmlOvDecoder::get_output_type(const std::string & name) * Removed API GgmlOvDecoder::get_output_op_params(const std::string & name) * Removed API get_output_ggml_tensor(const std::string & name) * Removed API m_outputs * Removed m_output_names * Removed API GgmlOvDecoder::get_input_names() * Removed API GgmlOvDecoder::get_input_stride(const std::string& name) * Removed API get_input_type * Removed API get_input_type * Removed API GgmlOvDecoder::get_input_shape(const std::string & name) * Removed API GgmlOvDecoder::get_input_op_params(const std::string & name) * Fix error for decoder cache * Reuse cached decoder * GPU remove Q6_K requantization * NPU fix wrong model output shape * NPU fix q4 perf regression * Remove unused variable nodes * Fix decoder can_reuse for llama-bench * Update build.md for Windows * backend buffer: allocate on host * Use shared_buffer for GPU NPU; Refactor * Add ov_backend_host_buffer; Use cached remote context * Put kvcache on GPU * Use ggml_aligned_malloc * only use remote tensor for kvcache * only use remote tensor for kvcache for GPU * FIX: use remote tensor from singleton * Update build.md to include OpenCL * NPU always requant to q4_0_128 * Optimize symmetric quant weight extraction: use single zp * Use Q8_0_C in token embd, lm_head, and for 5 and 6 bits quant * Update build.md * Support -ctk f32 * Initial stateful graph support * Update ggml/src/ggml-openvino/ggml-decoder.cpp Co-authored-by: Yamini Nimmagadda <yamini.nimmagadda@intel.com> * code cleanup * npu perf fix * requant to f16 for Q6 embed on NPU * Update ggml/src/ggml-openvino/ggml-decoder.cpp * Update ggml/src/ggml-openvino/ggml-openvino-extra.cpp * Create OPENVINO.md in llama.cpp backend docs * Update OPENVINO.md * Update OPENVINO.md * Update OPENVINO.md * Update build.md * Update OPENVINO.md * Update OPENVINO.md * Update OPENVINO.md * kq_mask naming fix * Syntax correction for workflows build file * Change ov backend buffer is_host to false * Fix llama-bench -p -n where p<=256 * Fix --direct-io 0 * Don't put kvcache on GPU in stateful mode * Remove hardcode names * Fix stateful shapes * Simplification for stateful and update output shape processing * Remove hardcode names * Avoid re-compilation in llama-bench * Extract zp directly instead of bias * Refactor weight tensor processing * create_weight_node accept non-ov backend buffer * remove changes in llama-graph.cpp * stateful masking fix (#38) Fix for stateful accuracy issues and cl_out_of_resources error in stateful GPU with larger context sizes. * Fix test-backend-ops crash glu, get_rows, scale, rms_norm, add * hardcoded name handling for rope_freqs.weight * Suppress logging and add error handling to allow test-backend-ops to complete * Fix MUL_MAT with broadcast; Add unsupported MUL_MAT FLASH_ATTN cases * Use bias instead of zp in test-backend-ops * Update OV in CI, Add OV CI Tests in GH Actions * Temp fix for multithreading bug * Update OV CI, fix review suggestions. * fix editorconfig-checker, update docs * Fix tabs to spaces for editorconfig-checker * fix editorconfig-checker * Update docs * updated model link to be GGUF model links * Remove GGML_CPU_REPACK=OFF * Skip permuted ADD and MUL * Removed static variables from utils.cpp * Removed initializing non-existing variable * Remove unused structs * Fix test-backend-ops for OV GPU * unify api calling * Update utils.cpp * When the dim is dynamic, throw an error, need to is stastic forst * Add interface compute_model_outputs(), which get the model output through computing the node use count & status in the cgraph to avoid the flag using * No need to return * Fix test-backend-ops for OV GPU LNL * Fix test-thread-safety * use the shape from infer request of output tensor create to avoid issue * fix dynamic output shape issue * fix issue for the unused node in tests * Remove unused lock * Add comment * Update openvino docs * update to OV release version 2026.0 * add ci ov-gpu self hosted runner * fix editorconfig * Fix perplexity * Rewrite the model inputs finding mechanism (#54) * Rewrite the model inputs finding logistic * Put stateful shape handle in get input shape * Put the iteration logistic in func * Added ggml-ci-intel-openvino-gpu and doc update * .hpp files converted to .h * fix ggml-ci-x64-intel-openvino-gpu * Fix for stateful execution bug in llama-bench * Minor updates after stateful llama-bench fix * Update ggml/src/ggml-openvino/utils.cpp Co-authored-by: Yamini Nimmagadda <yamini.nimmagadda@intel.com> * Remove multiple get_shape calls * Bring back mutex into compute * Fix VIEW op, which slice the input node * Added token_len_per_seq existence check before slicing masks and moved node retrieval inside guarded block to prevent missing-key access * Temp. fix for test requant errors * Update to OV ggml-ci to low-perf * ci : temporary disable "test-llama-archs" * ci : cache v4 -> v5, checkout v4 -> v6, fix runner tag * docs : update url * Fix OV link in docker and Update docs --------- Co-authored-by: Ravi Panchumarthy <ravi.panchumarthy@intel.com> Co-authored-by: Cavus Mustafa <mustafa.cavus@intel.com> Co-authored-by: Arshath <arshath.ramzan@intel.com> Co-authored-by: XuejunZhai <Xuejun.Zhai@intel.com> Co-authored-by: Yamini Nimmagadda <yamini.nimmagadda@intel.com> Co-authored-by: Xuejun Zhai <Xuejun.Zhai@intel> Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
494 lines
19 KiB
CMake
494 lines
19 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-dl.cpp
|
|
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)
|
|
if (NOT MSVC)
|
|
# __FMA__ and __F16C__ are not defined in MSVC, however they are implied with AVX2/AVX512
|
|
ggml_add_cpu_backend_variant(ivybridge SSE42 AVX F16C)
|
|
ggml_add_cpu_backend_variant(piledriver SSE42 AVX F16C FMA)
|
|
endif()
|
|
ggml_add_cpu_backend_variant(haswell SSE42 AVX F16C FMA AVX2 BMI2)
|
|
ggml_add_cpu_backend_variant(skylakex SSE42 AVX F16C FMA AVX2 BMI2 AVX512)
|
|
ggml_add_cpu_backend_variant(cannonlake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI)
|
|
ggml_add_cpu_backend_variant(cascadelake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI)
|
|
ggml_add_cpu_backend_variant(icelake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI)
|
|
if (NOT MSVC)
|
|
# MSVC 2022 doesn't support BF16 intrinsics without `/arch:AVX10.1` ?!
|
|
# https://learn.microsoft.com/en-us/cpp/intrinsics/x64-amd64-intrinsics-list?view=msvc-170
|
|
# https://learn.microsoft.com/en-us/cpp/build/reference/arch-x64?view=msvc-170
|
|
ggml_add_cpu_backend_variant(cooperlake SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VNNI AVX512_BF16)
|
|
ggml_add_cpu_backend_variant(zen4 SSE42 AVX F16C FMA AVX2 BMI2 AVX512 AVX512_VBMI AVX512_VNNI AVX512_BF16)
|
|
endif()
|
|
ggml_add_cpu_backend_variant(alderlake SSE42 AVX F16C FMA AVX2 BMI2 AVX_VNNI)
|
|
if (NOT MSVC)
|
|
# MSVC doesn't support AMX
|
|
ggml_add_cpu_backend_variant(sapphirerapids SSE42 AVX F16C FMA AVX2 BMI2 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 SVE SME)
|
|
ggml_add_cpu_backend_variant(android_armv9.2_2 DOTPROD MATMUL_INT8 FP16_VECTOR_ARITHMETIC SVE SVE2 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(VirtGPU)
|
|
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)
|
|
ggml_add_backend(OPENVINO)
|
|
|
|
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()
|