llama.cpp b11513改进CUDA top-k算法选择,qwen4exp测试耗时降至 941.8 ms
该版本用按行网格的基数选择替换CUB逐行DeviceTopKKernel,并改为按形状选择TOP_K实现;发布说明称在 34,816 tokens的qwen4exp上,top-k启动次数从 1,671,253 降至 2,329,耗时从 5,761.8 ms降至 941.8 ms。
AI解读:这次改动针对CUDA后端的top-k算子:以按行划分网格的基数选择(radix select)替换CUB的逐行DeviceTopKKernel,并由GGML_CUDA_TOPK_RADIX_MIN_ROWS控制启用。
发布说明给出的性能数据来自qwen4exp、34,816 tokens场景:top-k从 1,671,253 次启动、5,761.8 ms,变为 2,329 次启动、941.8 ms。这是项目方在单一工作负载上的测量,不能外推为所有模型或硬件上的同等降幅。
TOP_K实现改为按形状选择:短行用bitonic,多个长行用radix select,单个长行用DeviceTopK或CUB argsort;阈值可在构建时覆盖。
另外两点细化:行数不超过一个block wave时,bitonic继续用于填充后至 1024 的行。
预编译产物覆盖macOS/iOS、Linux、Android、Windows,含CPU、CUDA 12/13、Vulkan、ROCm、OpenVINO、SYCL等后端;openEuler与启用KleidiAI的macOS arm64构建在说明中标注为DISABLED。
llama.cpp发布b11513,CUDA后端改进top-k算法选择(PR #28713)。
top-k改动内容与实测数字
按发布说明,改动用按行网格的radix select替换CUB的逐行DeviceTopKKernel,启用条件由GGML_CUDA_TOPK_RADIX_MIN_ROWS控制。
在qwen4exp、34,816 tokens上,top-k由 1,671,253 次启动、5,761.8 ms,降至 2,329 次启动、941.8 ms。该数字为项目在特定测试用例上的结果。
- 替换对象:CUB逐行DeviceTopKKernel → 网格跨行的radix select
- 启用门槛:GGML_CUDA_TOPK_RADIX_MIN_ROWS
- 测试配置:qwen4exp,34,816 tokens
- 启动次数:1,671,253 → 2,329
- 耗时:5,761.8 ms → 941.8 ms
按形状选择TOP_K实现
发布说明称,原先的nrows/ncols特例被 #28547 的决策边界取代(在 #29278 中实现):短行用bitonic,多个长行用radix select,单个长行用DeviceTopK或CUB argsort。阈值仍可在构建时覆盖。
在此基础上另有两处细化:当行填充后不超过 1024 且行数可装入一个block wave时,继续使用bitonic。
产物与已禁用平台
该版本附带多平台预编译产物,涵盖macOS/iOS、Linux、Android、Windows,以及CPU、CUDA 12与 13、Vulkan、ROCm 10.0、OpenVINO、SYCL等构建;Snapdragon平台另有CPU、Adreno GPU、Hexagon NPU组合包。
发布页标注两处为DISABLED:macOS Apple Silicon启用KleidiAI的构建(PR #23780),以及openEuler构建(PR #23705)。