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_reg | ggml/src/ggml-cpu/ggml-cpu.c4000-4100 | 后端注册结构 |
ggml_backend_cpu_device_context | ggml/src/ggml-cpu/ggml-cpu.c3950-4000 | 设备上下文管理 |
ggml_backend_cpu_buffer_type | ggml/src/ggml-cpu/ggml-cpu.c3900-3950 | 内存缓冲区管理 |
type_traits_cpu | ggml/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
CPU 后端自动检测可用的 SIMD 指令集并选择优化实现
构建系统支持具有不同功能集的多个 CPU 变体
| 变体 | 特性 | CMake 目标 |
|---|---|---|
ggml-cpu-x64 | 基础 x64 | ggml_add_cpu_backend_variant(x64) |
ggml-cpu-haswell | SSE4.2, AVX, F16C, AVX2, BMI2, FMA | ggml_add_cpu_backend_variant(haswell ...) |
ggml-cpu-skylakex | Haswell + AVX512 | ggml_add_cpu_backend_variant(skylakex ...) |
ggml-cpu-sapphirerapids | Skylake-X + AMX | ggml_add_cpu_backend_variant(sapphirerapids ...) |
来源:ggml/src/CMakeLists.txt289-310 ggml/src/ggml-cpu/CMakeLists.txt168-311
CPU 后端集成了 KleidiAI 以进行 ARM 特定优化
来源:ggml/src/ggml-cpu/kleidiai/kleidiai.cpp38-67 ggml/src/ggml-cpu/kleidiai/kernels.cpp1-50
CPU 后端支持多种量化格式,针对不同用例进行了优化
| 类型 | 比特 | 块大小 | 描述 |
|---|---|---|---|
GGML_TYPE_Q4_0 | 4 | 32 | 4 位量化,无零点 |
GGML_TYPE_Q4_1 | 4 | 32 | 带零点的 4 位量化 |
GGML_TYPE_Q8_0 | 8 | 32 | 8 位量化 |
GGML_TYPE_Q2_K | 2 | 256 | K 量化,2 位 |
GGML_TYPE_Q4_K | 4 | 256 | K 量化,4 位 |
GGML_TYPE_IQ4_NL | 4 | 32 | 改进型 4 位量化 |
来源:ggml/src/ggml-cpu/ggml-cpu-quants.c1-100 ggml/src/ggml-cpu/ggml-cpu.c210-350
CPU 后端包含 NUMA 拓扑检测和内存局部性优化
来源:ggml/src/ggml-cpu/ggml-cpu.c577-663
构建系统检测目标架构并配置相应的优化
构建系统执行编译时和运行时功能检测
| 阶段 | 方法 | 目的 |
|---|---|---|
| 编译时 | 编译器宏 (__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