用 Go SIMD 重写 TurboPFor:Debian Code Search 删掉了最后一处 cgo
来源: michael.stapelberg.ch — 2026-09-06
概述
Michael Stapelberg 实现了多年夙愿:删掉 Debian Code Search(DCS)里最后一处 cgo 依赖。这得益于 Go 1.26 新引入的实验性 simd/archsimd 包——他用它把 TurboPFor 整数压缩的解码器(bitunpack256v32)从 C 库移植为原生 Go SIMD 实现,并借 AVX-512 指令集做到比 C 参考实现更快。DCS 用 TurboPFor 把位置索引压缩后放进一台中配 Hetzner 服务器,因此解码速度直接决定字面查询(约占全部查询 78.2%)的延迟。
核心要点
Go 1.26 引入实验性 simd/archsimd 包,提供 Int8x16/Int64x8 等向量类型,用 GOEXPERIMENT=simd 开启
把 TurboPFor 的位压缩解码从 C 库(cgo)移植为原生 Go,七年来的最后一处 cgo 被删除
用 AVX-512 实现垂直 256 值布局,解码甚至快于 C 的参考实现
DCS 依赖 TurboPFor 压缩把位置索引装进中配服务器,解码速度直接决定查询延迟
金句
I deleted the last cgo dependency in Debian Code Search! ... we can implement the TurboPFor integer compression format as efficiently — more efficiently, in fact, by using the newer AVX512 instruction set! — as the reference implementation.