ggml-quants.c 有 5591 行、约 226KB,是 llama.cpp 里把模型压进 4-bit 的"量化核心"。可今天你在整个文件里只能数出 2 个#ifdef __AVX2__和 2 个#ifdef __ARM_NEON__。真正跑在你 CPU 上、决定推理快慢的那段向量化点积,一行都不在这里。它在 2025 年被整体搬去了ggml-cpu/arch/x86/quants.c(4310 行)和arch/arm/quants.c(4113 行)——两份加起来八千多行的 SIMD,全是这个文件当年的"出走人口"。那么问题来了:一个被掏空成纯标量的文件,凭什么还能统治 Q4_0、Q4_1、Q5_0、Q8_0、Q4_K 十几种量化格式,让 CUDA、Metal、七种 CPU 架构各自的实现都向它对齐?答案藏在三个你以为是"代码风格"的东西里:函数名quantize_row_q4_0_ref是一张派发表的索引键;那份慢吞吞的参考实现是全平台的对拍金标准;而[GGML_TYPE_Q4_0] = { ... }这一行 C99 语法,做完了你以为需要 C++ 虚函数表才能做的事。这篇文章先把这套组织法拆开,再回到ggml-quants.c:75,逐行读quantize_row_q4_0_ref怎么把 32 个 float 压成 18 字节。读完你会同意一件事:在这套架构里,量化算法只是最薄、也最不值钱的那一层。真正撑起这个文件的,是它把"格式定义"“参考实现”"机器特
别再盯着公式了!llama.cpp 4-bit 量化最值钱的根本不是算法,而是这个设计
ggml-quants.c 有 5591 行、约 226KB,是 llama.cpp 里把模型压进 4-bit 的"量化核心"。可今天你在整个文件里只能数出 2 个#ifdef __AVX2__和 2 个#ifdef __ARM_NEON__。真正跑在你 CPU 上、决定推理快慢的那段向量化点积,一行都不在这里。它在 2025 年被整体搬去了ggml-cpu/arch/x86/quants.c(4310 行)和arch/arm/quants.c(4113 行)——两份加起来八千多行的 SIMD,全是这个文件当年的"出走人口"。那么问题来了:一个被掏空成纯标量的文件,凭什么还能统治 Q4_0、Q4_1、Q5_0、Q8_0、Q4_K 十几种量化格式,让 CUDA、Metal、七种 CPU 架构各自的实现都向它对齐?答案藏在三个你以为是"代码风格"的东西里:函数名quantize_row_q4_0_ref是一张派发表的索引键;那份慢吞吞的参考实现是全平台的对拍金标准;而[GGML_TYPE_Q4_0] = { ... }这一行 C99 语法,做完了你以为需要 C++ 虚函数表才能做的事。这篇文章先把这套组织法拆开,再回到ggml-quants.c:75,逐行读quantize_row_q4_0_ref怎么把 32 个 float 压成 18 字节。读完你会同意一件事:在这套架构里,量化算法只是最薄、也最不值钱的那一层。真正撑起这个文件的,是它把"格式定义"“参考实现”"机器特