CAFS:面向 x86-64 架构的低基数整数数据的缓存感知频率排序
数据结构与算法
2026-05-26 v1 数据库
摘要
OLAP 引擎中的整数排序通常针对基数 远小于数组长度 的列进行操作。分组操作后,中间键列的 受分组键数量限制;即使是列式扫描也多用于字典编码的分类字段,其中 不会超过几千。无论是比较排序还是基数排序,都无法充分利用 的小规模特性,分别支付 的比较次数和 的字节 passes。本文描述了 CAFS,一种在 x86-64 架构上利用 规模的整数排序算法。该算法结合了单缓存行大小的 SIMD 桶、对 1024 个等距样本的 Chao1 基数估计器(样本存放在堆分配的 40 KB 开放地址哈希表中),以及由溢出安全防护支撑的自适应调度器。热循环无分支,采用 AVX2 的 cmpeq、movemask 和 tzcnt 指令定位匹配的向量位置。我们在 从 到 的 58 个数组规模上进行基准测试,覆盖密集的 配置,共执行 592770 组计时测试,分别对比 pdqsort、IPS4o、vqsort、ska_sort 和 std::sort。在 的区间,CAFS 的吞吐量为 pdqsort 的 1.7 到 3.1 倍、IPS4o 的 1.7 到 3.5 倍、vqsort 的 1.2 到 2.3 倍。CAFS 与 pdqsort 的运行交叉点出现在 ;与 ska_sort 为 ;与 vqsort 为 ;而与 IPS4o 的曲线仅在 时汇聚。尽管五个基准算法中只有 vqsort 在交叉点之后会超过 CAFS,这使得 vqsort 的阈值 成为 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