llama.cpp b11216为SYCL后端补上 1024 至 8192 宽度的FWHT内核
新内核fwht_kernel_wide覆盖 1024/2048/4096/8192 四种宽度,把此前走稠密GEMM的O(n²) 路径改为O(n log n) 的蝶形计算,但作者已在无GPU的pod上验证,ggml调度集成未被端到端测试。
AI解读:这条更新解决的是llama.cpp SYCL后端一个具体的性能缺口:宽度超过 512 的FWHT(快速沃尔什-哈达玛变换)此前没有专用内核,只能退化成稠密GEMM,复杂度从O(n log n) 升到O(n²)。
真正受影响的是在Intel GPU或SYCL设备上跑量化/旋转类模型的开发者。新内核覆盖 1024、2048、4096、8192 四种宽度,正是大模型里常见的分组大小,意味着这些宽度的旋转运算不再需要物化整张旋转张量。
但作者自己也标了边界:测试在无GPU的pod上无法调用test-backend-ops,只用一个独立harness在SYCL CPU设备上验证了内核算法本身,ggml的调度和supports_op集成没有端到端跑通。也就是说,性能收益尚未有实测数据支撑,合入的是正确性。
对普通用户而言不需要任何操作;对SYCL后端维护者来说,下一步是用真实GPU补上调度层验证和性能对比。
llama.cpp发布b11216版本,其中一项提交(#29243)为SYCL后端新增了针对块宽度大于 512 的FWHT内核。
该提交说明,SYCL的FWHT此前通过标准蝶形网络覆盖 64 到 512,另通过Kronecker/Paley构造单独覆盖 384/640/768/1280;当Hadamard提示产生 1024、2048、4096、8192 宽度时,仍会落入默认分支,以稠密GEMM对物化后的旋转张量运算——结果正确,但复杂度为O(n²),而非O(n log n)。
新内核fwht_kernel_wide的改动是每个work-group处理一行,而非每个sub-group处理一行,因此每个work-item保留N/NT个值,而不是N/WARP_SIZE个值。低于sub-group宽度的蝶形仍走shuffle;达到work-group宽度的蝶形经过work-group本地内存;其余留在寄存器中。蝶形与符号约定跟已有的窄内核一致。
测试条件:无GPU的pod迫使作者改用独立harness
提交正文说明,ggml的SYCL后端注册(dpct::dev_mgr)无条件要求存在标记为GPU的平台,否则会在任何算子级测试运行前抛错;因此在这台无GPU的pod上,即使通过CPU设备也无法运行test-backend-ops。
作者改为使用独立harness验证:同一份内核体在真实SYCL CPU设备(Intel oneAPI DPC++ 2026.1,OpenCL CPU后端)上运行,对照独立的递归倍增Hadamard参考实现检查;交叉验证方式是先用未修改的窄内核跑同一harness并确认通过,以排除参考约定的错误,再信任新代码的结果。
- N=1024 NT=256 rows=1:max_abs_err=1.7e-07,max_rel_err=4.9e-04,PASS
- N=2048 NT=256 rows=1:max_abs_err=1.9e-07,max_rel_err=2.0e-04,PASS
- N=4096 NT=256 rows=1:max_abs_err=2.0e-07,max_rel_err=1.4e-04,PASS
- N=8192 NT=256 rows=1:max_abs_err=2.5e-07,max_rel_err=3.8e-03,PASS
- N=1024 NT=256 rows=7:max_abs_err=2.4e-07,max_rel_err=1.0e-03,PASS
- N=2048 NT=256 rows=5:max_abs_err=3.0e-07,max_rel_err=9.4e-04,PASS
- N=4096 NT=256 rows=3:max_abs_err=2.7e-07,max_rel_err=1.7e-03,PASS
- N=8192 NT=256 rows=2:max_abs_err=2.5e-07,max_rel_err=1.9e-03,PASS
已验证与未验证的范围
提交正文明确,上述结果只覆盖内核算法本身,未端到端测试ggml的dispatch/supports_op集成;后者需要真实GPU(或SYCL GPU插件)才能越过后端注册。
test-backend-ops的构建已验证:fwht.cpp作为ggml-sycl的一部分重新编译,零警告。
- 发布页同时提供多平台预编译包,包括Ubuntu x64的SYCL FP32与SYCL FP16版本,以及Windows x64 SYCL版本;macOS Apple Silicon的KleidiAI版本处于DISABLED状态。
- openEuler构建同样处于DISABLED状态。