菜单

CPU 后端

相关源文件

目的与范围

CPU 后端是 GGML 的默认计算后端,在 CPU 硬件上执行张量操作。它为矩阵运算、量化算术和跨多个 CPU 架构(包括 x86、ARM、PowerPC 和 RISC-V)的矢量化计算提供了优化的实现。当专用硬件加速(GPU 后端)不可用时,此后端将作为后备实现,并实现大型语言模型推理所需的核心数学运算。

有关 GPU 加速的信息,请参阅 CUDA 后端Metal 后端Vulkan 后端。有关后端测试和验证的信息,请参阅 后端测试和验证

架构概述

CPU 后端作为模块化系统实现,具有特定于体系结构的优化、SIMD 指令支持和多线程功能。后端会自动检测 CPU 功能并选择最优化的可用代码路径。

核心后端架构

来源:ggml/src/ggml-cpu/ggml-cpu.c1-500 ggml/src/CMakeLists.txt287-322

核心组件

后端注册和接口

CPU 后端通过 ggml_backend_cpu_reg 实现标准的 GGML 后端接口,并提供设备管理、缓冲区分配和操作分派。

组件文件位置目的
ggml_backend_cpu_regggml/src/ggml-cpu/ggml-cpu.c4000-4100后端注册结构
ggml_backend_cpu_device_contextggml/src/ggml-cpu/ggml-cpu.c3950-4000设备上下文管理
ggml_backend_cpu_buffer_typeggml/src/ggml-cpu/ggml-cpu.c3900-3950内存缓冲区管理
type_traits_cpuggml/src/ggml-cpu/ggml-cpu.c198-371特定类型操作分派

线程架构

线程系统结合了工作窃取和静态工作分配,具有 NUMA 感知线程放置和内存分配。

来源:ggml/src/ggml-cpu/ggml-cpu.c435-560 ggml/src/ggml-cpu/ggml-cpu.c577-663

类型特征和操作分派

type_traits_cpu 数组提供了类型特定操作的函数指针

来源:ggml/src/ggml-cpu/ggml-cpu.c198-371

SIMD 优化

特征检测和代码路径选择

CPU 后端自动检测可用的 SIMD 指令集并选择优化实现

CPU 变体和构建选项

构建系统支持具有不同功能集的多个 CPU 变体

变体特性CMake 目标
ggml-cpu-x64基础 x64ggml_add_cpu_backend_variant(x64)
ggml-cpu-haswellSSE4.2, AVX, F16C, AVX2, BMI2, FMAggml_add_cpu_backend_variant(haswell ...)
ggml-cpu-skylakexHaswell + AVX512ggml_add_cpu_backend_variant(skylakex ...)
ggml-cpu-sapphirerapidsSkylake-X + AMXggml_add_cpu_backend_variant(sapphirerapids ...)

来源:ggml/src/CMakeLists.txt289-310 ggml/src/ggml-cpu/CMakeLists.txt168-311

ARM 特定优化

KleidiAI 集成

CPU 后端集成了 KleidiAI 以进行 ARM 特定优化

来源:ggml/src/ggml-cpu/kleidiai/kleidiai.cpp38-67 ggml/src/ggml-cpu/kleidiai/kernels.cpp1-50

量化支持

量化数据类型

CPU 后端支持多种量化格式,针对不同用例进行了优化

类型比特块大小描述
GGML_TYPE_Q4_04324 位量化,无零点
GGML_TYPE_Q4_1432带零点的 4 位量化
GGML_TYPE_Q8_08328 位量化
GGML_TYPE_Q2_K2256K 量化,2 位
GGML_TYPE_Q4_K4256K 量化,4 位
GGML_TYPE_IQ4_NL432改进型 4 位量化

量化操作

来源:ggml/src/ggml-cpu/ggml-cpu-quants.c1-100 ggml/src/ggml-cpu/ggml-cpu.c210-350

内存管理和 NUMA 支持

NUMA 感知内存分配

CPU 后端包含 NUMA 拓扑检测和内存局部性优化

来源:ggml/src/ggml-cpu/ggml-cpu.c577-663

构建系统配置

CMake 架构特定配置

构建系统检测目标架构并配置相应的优化

功能检测流程

构建系统执行编译时和运行时功能检测

阶段方法目的
编译时编译器宏 (__AVX2__, __ARM_NEON)启用优化代码路径
运行时CPUID/getauxval选择最优实现
构建时CMake 功能检查配置构建变体

来源:ggml/src/ggml-cpu/CMakeLists.txt85-386 ggml/src/CMakeLists.txt102-114

性能优化

矢量化操作

CPU 后端使用 SIMD 映射实现高度优化的矢量化操作

缓存感知算法

后端使用可配置的缓存行大小和块策略实现了缓存感知的算法,以获得最佳内存访问模式。

来源:ggml/src/ggml-cpu/simd-mappings.h1-100 ggml/src/ggml-cpu/vec.cpp1-50 ggml/src/ggml-cpu/ops.h9-22