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:
@@ -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",
|
||||
]
|
||||
|
||||
Reference in New Issue
Block a user