中文

CAFS:面向 x86-64 架构的低基数整数数据的缓存感知频率排序

数据结构与算法 2026-05-26 v1 数据库

摘要

OLAP 引擎中的整数排序通常针对基数 KK 远小于数组长度 NN 的列进行操作。分组操作后,中间键列的 KK 受分组键数量限制;即使是列式扫描也多用于字典编码的分类字段,其中 KK 不会超过几千。无论是比较排序还是基数排序,都无法充分利用 KK 的小规模特性,分别支付 Θ(NlogN)\Theta(N \log N) 的比较次数和 Θ(NB/b)\Theta(N \cdot B/b) 的字节 passes。本文描述了 CAFS,一种在 x86-64 架构上利用 KK 规模的整数排序算法。该算法结合了单缓存行大小的 SIMD 桶、对 1024 个等距样本的 Chao1 基数估计器(样本存放在堆分配的 40 KB 开放地址哈希表中),以及由溢出安全防护支撑的自适应调度器。热循环无分支,采用 AVX2 的 cmpeq、movemask 和 tzcnt 指令定位匹配的向量位置。我们在 NN10310^331073 \cdot 10^7 的 58 个数组规模上进行基准测试,覆盖密集的 KK 配置,共执行 592770 组计时测试,分别对比 pdqsort、IPS4o、vqsort、ska_sort 和 std::sort。在 KNK \ll N 的区间,CAFS 的吞吐量为 pdqsort 的 1.7 到 3.1 倍、IPS4o 的 1.7 到 3.5 倍、vqsort 的 1.2 到 2.3 倍。CAFS 与 pdqsort 的运行交叉点出现在 K1.3105K \approx 1.3 \cdot 10^5;与 ska_sort 为 K8.14105K \approx 8.14 \cdot 10^5;与 vqsort 为 K6.7105K \approx 6.7 \cdot 10^5;而与 IPS4o 的曲线仅在 K=NK = N 时汇聚。尽管五个基准算法中只有 vqsort 在交叉点之后会超过 CAFS,这使得 vqsort 的阈值 K6.7105K \approx 6.7 \cdot 10^5 成为 CAFS 实际运行范围的制约因素。

关键词

引用

@article{arxiv.2605.25040,
  title  = {CAFS: A Cache-Aware Frequency Sort for Low-Cardinality Integer Data on x86-64},
  author = {Vasiliy S. Shlyk},
  journal= {arXiv preprint arXiv:2605.25040},
  year   = {2026}
}

备注

28 pages, 15 figures, 10 tables. Source code: https://github.com/kexibq-official/cafs-lib