llama.cpp
98d1e92c - vulkan: tiled transpose for 0<->2 permuted CONT (#26585)

Commit
29 days ago
vulkan: tiled transpose for 0<->2 permuted CONT (#26585) * vulkan: tiled transpose for 0<->2 permuted CONT -ggml_vk_get_cpy_pipeline only routed to the tiled shared-memory transpose shader when dim1 was the innermost dimension, i.e. ggml_transpose (a 0<->1 swap). A 0<->2 swap -- ggml_cont(ggml_permute(x, 2, 1, 0, 3)) -- fell back to the generic per-element strided copy, whose source reads stride by ne0*ne1 elements: one cache line per lane. -DeepSeek-V4's lightning indexer performs exactly that permute on a [n_kv, n_tokens, n_head] tensor. On Vulkan/RADV gfx1151 it ran at ~1-9 GB/s of a ~200 GB/s part and accounted for 43% of total prefill time. -Add copy_transpose_02.comp, mirroring copy_transpose.comp but tiling over dst dims (0, 2) with dims 1 and 3 as the batch, so reads walk src dim2 and writes walk dst dim0 -- both contiguous. The selection condition additionally requires a non-contiguous source and a contiguous destination so it cannot take cases the contiguous-copy shader already handles. -test-backend-ops only exercised ggml_transpose for CONT, so the strided path was untested. Add test_cont_permute covering (2,1,0,3), (1,2,0,3) and (0,2,1,3) over f32/f16 at tile-aligned, tile-unaligned and large shapes. The large shapes are in the eval set rather than only in perf because perf mode does not verify results. -Measured on gfx1151, ne=[n_kv,64,64,1], perm=(2,1,0,3), f32: n_kv=1024: 9.08 -> 579.85 GB/s n_kv=1280: 20.03 -> 153.71 GB/s n_kv=2048: 7.11 -> 91.68 GB/s n_kv=2304: 16.24 -> 86.49 GB/s -The ~2.2x penalty previously seen at power-of-two n_kv (destination-stride aliasing) is gone. End to end, DeepSeek-V4-Flash IQ3_XXS prefill on a 9k-token prompt goes from 56.33 t/s to 103.74 t/s (+84%). -Note: at n_tokens=512 a single slow-path dispatch takes ~273 ms and looping it in perf mode can trip the GPU watchdog, so the perf cases use n_tokens=64. * tests: fold test_cont_permute into test_cont, add L2-exceeding perf shapes Review feedback: test_cont gains a permute parameter ({0,0,0,0} = none), matching test_mul_mat's pattern, and the separate struct is gone. Perf adds [n_kv, 512, 64, 1] variants (~0.5 GB per run) that exceed GPU L2, since the 64-token shapes fit in cache on large parts and read above memory bandwidth. * tests: trim perf-case comment to the two-line summary * vulkan: trim comments on the 0<->2 transpose path Drop the shader file header, the read/write block comments and the rationale prose in the CONT test cases. Keep the tile-shape and bank-conflict notes and the permute parameter documentation. --------- Co-authored-by: Kevin Hopper <no-reply@maestro.press>
Author
Parents
Loading