English

CAFS: A Cache-Aware Frequency Sort for Low-Cardinality Integer Data on x86-64

Data Structures and Algorithms 2026-05-26 v1 Databases

Abstract

Integer sorts in OLAP engines often run on columns whose cardinality KK is much smaller than the array length NN. After a group-by stage the intermediate key column has KK bounded by the number of distinct group keys, and even a column-store scan typically operates on dictionary-encoded categorical fields where KK never exceeds a few thousand. A comparison sort on such a column still pays Θ(NlogN)\Theta(N \log N) comparisons, and a radix sort still pays Θ(NB/b)\Theta(N \cdot B/b) byte passes, irrespective of KK. This paper describes CAFS, an integer sort that does exploit it on x86-64 with AVX2. The algorithm combines a SIMD bucket sized to one cache line, a Chao1 cardinality estimator over 1024 strided samples (kept in a heap-allocated 40 KB open-addressing table), and an adaptive dispatcher backed by a spill safety guard. The hot loop is branchless and uses AVX2 cmpeq together with movemask and tzcnt to locate the matching lane. We benchmarked CAFS on a full-factorial grid of 58 array sizes NN from 10310^3 to 31073 \cdot 10^7 with dense KK schedules per NN, producing 592770 timed runs against pdqsort, IPS4o, vqsort, ska_sort, and std::sort. In the KNK \ll N band the throughput is 1.7 to 3.1x that of pdqsort, 1.7 to 3.5x IPS4o, and 1.2 to 2.3x vqsort. The operational crossover against pdqsort is at K1.3105K \approx 1.3 \cdot 10^5; against ska_sort, K8.14105K \approx 8.14 \cdot 10^5; against vqsort, K6.7105K \approx 6.7 \cdot 10^5; and against IPS4o the curves only converge near K=NK = N. Of the five baselines, only vqsort actually overtakes CAFS once the crossover is passed, which makes the vqsort threshold at K6.7105K \approx 6.7 \cdot 10^5 the binding constraint on the operational range of CAFS.

Cite

@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}
}

Comments

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

R2 v1 2026-07-22T07:30:57.245Z