Day 6·3 4x4 asm 内核——从 llama.cpp 提取的 MIT 代码

发布时间:2026/9/12 20:12:02
Day 6·3 4x4 asm 内核——从 llama.cpp 提取的 MIT 代码 源码精读篇本文为源码/方法论精读无独立实测文中数字均引述仓库 docs 的板端实测记录一句话导读4x4 asm 内核讲清为何用提取脚本从 llama.cpp 原样搬运约 450 行 NEON asm 而非手写重写并对照 MIT 许可的文件头要素与删除署名的三层后果。8x8 是引擎自己排的可宽 GEMM 的最优形状llama.cpp 早就研究过x86 侧甚至有更狠的 4x4 手写 asm。自己重写一遍没必要——MIT 允许提取。今天讲的不只是内核更是把别人代码搬进来的工程伦理与许可边界。1. 知识点为什么提取一小段比重写一遍更专业llama.cpp 的ggml_gemm_q4_0_4x4_q8_0是一段约 450 行的手写 NEON asm.inst sdot、16 个累加器、软件流水线预取。这种代码有一个特性人工重写几乎必然引入转录错误——一条sdot的 lane 写错、一个偏移算错结果就全错还极难排查对拍只能告诉你错了不能告诉你在哪一行。所以仓库的做法不是照着写一遍而是写了个机械提取脚本tools/extract_llama_asm.py把 llama.cpp 源文件里那个__asm__ __volatile__(...)块按行号原样抠出来。脚本头注释写明了动机Extract ggml_gemm_q4_0_4x4_q8_0 (asm kernel) verbatim from llama.cpp into a standalone C function, so the ~480 lines of hand-written NEON sdot asm are ported mechanically (zero transcription risk). ... The asm block is the __asm__ __volatile__( ... ) spanning lines 1852-2301. Zero transcription risk零转录风险是这句话的灵魂能用脚本原样搬的就不该用手抄。工程上越是又复杂又不可读的代码越要机械搬运——人只负责把它正确地组装进去不负责逐行翻译它。2. 对应代码许可边界长什么样搬代码有红线许可证要跟着走。看 tools/llama_gemm_q4_0_4x4_asm.c 的文件头第 1–30 行/* llama_gemm_q4_0_4x4_asm.c - mechanically extracted from llama.cpp * (ggml/src/ggml-cpu/arch/arm/repack.cpp, lines 1852-2301), MIT license. * ... * This file is a verbatim (mechanically extracted) portion of llama.cpp and * is redistributed under the MIT License. Original upstream: * https://github.com/ggerganov/llama.cpp ... * MIT License * Copyright (c) 2023-2026 The ggml authors * Permission is hereby granted, free of charge, ...完整 MIT 文本 */要素齐全来源文件与行号、上游仓库、MIT 许可全文、版权持有人、再分发声明。而在仓库根的 LICENSE第 24–27 行与第 60–63 行里引擎把自己代码的双许可与第三方段各自保留原许可的关系交代清楚- 源自 llama.cpp 的代码段tools/llama_gemm_q4_0_4x4_asm.c以及 src/model/vllm_safetensors.c 中标注的 ggml_gemm/gemv/vec_dot 派生内核 MIT License, Copyright (c) 2023-2026 The ggml authors版权声明与许可文本见各文件头。同样的署名也出现在引擎内的移植注释里vllm_safetensors.c 第 4184–4186 行源自 llama.cppMIT (c) 2023-2026 The ggml authors全文见本文件头。每一处引入都原地署名不搞搬了但不说。3. 改动后果删掉署名会发生什么把上面的文件头 MIT 文本删掉只留内核代码——编译照过、性能照旧代码层面零影响。这就是许可问题的狡猾之处它不靠编译器拦你靠的是合规与信任。后果分三层法律MIT 的条件只有一条——再分发必须带上版权声明与许可文本。删掉它就是违约再分发对引擎这种要商用授权双许可的项目等于在自己最看重许可合规的地方埋雷工程文件头里的来源 行号 上游是可追溯性资产。半年后这个 asm 出了数值问题你要回上游 diff没有出处你只能对着 450 行汇编发呆信任仓库 README 自称源码可得双许可 第三方成分透明而透明清单README「体量与依赖」表 LICENSE 第三节正是建立在每个文件头都写清楚之上。删署名 拆自己台。这也是本系列诚实基调在代码层的体现自己的代码可以锁别人的代码必须还。双许可只约束引擎自研部分第三方段永远保留上游许可。4. 学员调试任务A 档动手读代码ol读tools/extract_llama_asm.py全文说出它从上游哪一行取到哪一行、输出到哪个文件打开tools/llama_gemm_q4_0_4x4_asm.c在文件头找全五要素来源/行号/上游链接/许可文本/版权人在LICENSE里找到第三方段声明用自己的话复述双许可 vs MIT 段的边界。B 档纯读源码在vllm_safetensors.c里 grepggml/llama.cpp列出所有源自上游的注释锚点验证是否每处都带 MIT 与版权年份。实战排查示例B 档在仓库根目录执行以下 grep把vllm_safetensors.c里所有涉及上游的注释锚点一次性捞出来grep -n -E ggml|llama\.cpp src/model/vllm_safetensors.c输出会是一长串行号 匹配行例如4184: // 源自 llama.cppMIT (c) 2023-2026 The ggml authors全文见本文件头 4185: // ggml_gemm_q4_0_4x4_q8_0 派生内核上游见 llama.cpp repack.cpp 4186: // 版权声明与 MIT 许可文本见本文件头拿到输出后逐条核对三件事是否带 MIT注释里是否出现MIT字样或明确指向「本文件头」的许可文本是否带版权年份是否出现(c) 2023-2026 The ggml authors这类版权持有人与年份是否带来源是否写明源自 llama.cpp或给出上游文件/行号保证可追溯。若某条注释只写了ggml却漏了 MIT 与年份就说明该处署名不完整需要补全——这正是 B 档要验证的「每处引入都原地署名」。预期输出你能讲清机械提取 vs 手写重写的取舍、MIT 的唯一硬性条件保留声明以及自研锁许可 第三方还许可的工程姿态。收尾本篇源码点名tools/extract_llama_asm.py、tools/llama_gemm_q4_0_4x4_asm.c、LICENSE 第三节。开源仓库Kestrel-LLM (Gitee)源码可得双许可学习 / 学术研究免费下篇预告矩阵会算了可引擎里有 Q8 也有 Q4——什么时候用谁第 7 天讲混合精度路由同一层里为什么 FFN 走 Q4、attention 走 Q8。关键词4x4 asm、llama.cpp、MIT 许可、NEON、推理引擎上一篇Day 6·2 8x8 布局重排把“取数”提前到转换期让宽矩阵 GEMM 快 1.7 倍下一篇Day 7·1 Q4_0 格式——与 GGUF 对齐的 4bit 布局