perf: dispatch linear gemv by decode batch size and unify extension style

- replace the per-shape auto tables in the linear backend with an M-banded rule (M in [2,4] on compute capability 8.0+) that measured at the HBM bandwidth floor across every family, and fold the capability check into the capable guard
- drop the unreachable swiglu auto shape-table machinery so both backends share one env-mode ladder via the new dispatch.env_mode helper
- add __all__ across extension modules, name the rotary registration records, and unify typing to the typing-module style
- rewrite test_linear_dispatch.py around behavioral routing assertions and document the M-banded policy in the developer docs
- Benchmark: L20 SM89, Python dispatch overhead 2.9us to 1.5us, auto now covers every projection shape at M in [2,4].
This commit is contained in:
2026-09-03 07:23:13 +08:00
parent 27abb7c5e7
commit 7540acb43e
14 changed files with 225 additions and 536 deletions
+15 -4
View File
@@ -20,15 +20,19 @@ import glob
import importlib
import logging
import os
from functools import cache
from typing import Dict, List
import torch
logger = logging.getLogger(__name__)
_LIB_DIR = os.path.join(os.path.dirname(__file__), "lib")
def _discover_kernel_names() -> list[str]:
def _discover_kernel_names() -> List[str]:
"""Return the module names of the compiled kernel ``.so`` files in lib/."""
names: list[str] = []
names: List[str] = []
for path in glob.glob(os.path.join(_LIB_DIR, "*.so")):
# strip the "<soabi>.so" suffix, e.g. attn_decode.cpython-312-...so
names.append(os.path.basename(path).split(".", 1)[0])
@@ -37,8 +41,8 @@ def _discover_kernel_names() -> list[str]:
KERNEL_NAMES = _discover_kernel_names()
_available: dict[str, bool] = {}
_modules: dict[str, object] = {}
_available: Dict[str, bool] = {}
_modules: Dict[str, object] = {}
def _try_load(name: str) -> object:
@@ -81,3 +85,10 @@ def get_module(name: str) -> object:
f"Build with CSRC_KERNELS=true (or use the torch-native fallback)."
)
return mod
__all__ = [
"KERNEL_NAMES",
"get_module",
"is_available",
]