- Fix mask indexing: batch*q_len*kv_len -> batch*kv_len - Add csrc/kernels/gqa_common.cuh with shared GQAParams struct - Unify decode/prefill Python API: both accept (q,k,v,mask=None,...) - Decode now supports optional mask, is_causal, causal_offset, scale - Rename struct fields: B->batch, Hq->q_head, Hk->kv_head, D->head_dim - Use py::arg() for correct None/defaults handling in pybind11 - Update pure C tests and build instructions (-arch=sm_89)
- Split .cuh/.cu for gqa_decode_attn and gqa_prefill_attn - gqa_prefill_attn: tiled shared-memory K/V, fused load, compute-opt, mask support - Add pure C tests under csrc/tests/ for fast nvcc-only iteration - Update .gitignore for build artifacts
- gqa_decode_attn: rewrite to per-KV-head, K in smem - gqa_prefill_attn: new kernel for Q_len > 1 with GQA