submission 698249
ftyghome · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 135 lines, June 9 Researcher Reciprocity License v1.0.
submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixed-mla-698249?include=source"interfacepython
Compatibility
measured onAMD Instinct MI355X
declared hardwareAMD Instinct MI355X
architecturesgfx950
dtypesbf16, int32
Benchmark evidence
1 measurement across 1 GPU, fastest first.
Operation / workload
Hardware
Latency
Rank
Observed
Reported · How evidence levels are derived →
Source and license
sourceavailable
revision digestsha256:645d15ca778197cbed49f33d95e7fc52234c1b0f5a4940253995692aed42925a
license declaredunknown
license concludedunknown
authorsftyghome
imported2026-08-15
Techniques
Extracted from the mirrored source by pattern, never inferred. Each row cites its line.
fp4
if "mxfp4" not in kv_data or "fp8" not in kv_data:num-warps = 4
NUM_WARPS = 4split-k
int64_t splitkv,tile-k = 32
TILE_K = 32Kernel source
submission.py135 lines
#!POPCORN leaderboard amd-mixed-mla
import base64
import os
import pathlib
import zlib
import torch
from torch.utils.cpp_extension import load_inline
from task import input_t, output_t
os.environ.setdefault("HSA_XNACK", "0")
os.environ.setdefault("PYTORCH_ROCM_ARCH", "gfx950:xnack-")
os.environ.setdefault("TORCH_EXTENSIONS_DIR", str(pathlib.Path(__file__).resolve().parent / ".torch_extensions"))
HERE = pathlib.Path(__file__).resolve().parent
MLA_CPP_B64 = "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"
GPU_HSACO_B64 = "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"
_SRC_PATH = HERE / "_submission_mla.cu"
_source_text = zlib.decompress(base64.b64decode(MLA_CPP_B64)).decode("utf-8")
if not _SRC_PATH.exists() or _SRC_PATH.read_text() != _source_text:
_SRC_PATH.write_text(_source_text)
_BINDING_SRC = r"""
#include <torch/extension.h>
#include <vector>
std::vector<torch::Tensor> mla_decode_h16_fp8_fp8(torch::Tensor q,
torch::Tensor kv,
torch::Tensor kv_fp8,
torch::Tensor kv_scale,
torch::Tensor kv_fp8_scale,
int64_t splitkv,
float softmax_scale,
std::optional<torch::Tensor> hsaco_tensor);
PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
m.def("mla_decode_h16_fp8_fp8", &mla_decode_h16_fp8_fp8);
}
"""
def _build_inline_module():
return load_inline(
name="mla_standalone_ext",
cpp_sources=[_BINDING_SRC],
cuda_sources=[_source_text],
verbose=True,
extra_cflags=["-O3", "-std=c++20"],
extra_cuda_cflags=[
"-O3",
"-std=c++20",
"-U__HIP_NO_HALF_OPERATORS__",
"-U__HIP_NO_HALF_CONVERSIONS__",
"--save-temps",
"-ffast-math",
"-fno-finite-math-only",
# "-mllvm", "-amdgpu-mfma-vgpr-form",
],
extra_ldflags=["-lamdhip64"],
)
def _load_hsaco_tensor():
if not GPU_HSACO_B64:
return torch.empty((0,), dtype=torch.uint8)
hsaco = zlib.decompress(base64.b64decode(GPU_HSACO_B64))
return torch.frombuffer(memoryview(bytearray(hsaco)), dtype=torch.uint8)
_hsaco_tensor = _load_hsaco_tensor()
_module = _build_inline_module()
def _quantize_fp8(x: torch.Tensor) -> torch.Tensor:
return x.to(torch.float8_e4m3fn).contiguous()
def _dyn_quantize_fp8(tensor: torch.Tensor) -> tuple[torch.Tensor, torch.Tensor]:
finfo = torch.finfo(torch.float8_e4m3fn)
amax = tensor.abs().amax().clamp(min=1e-12)
scale = amax / finfo.max
fp8_tensor = (tensor / scale).clamp(min=finfo.min, max=finfo.max).to(torch.float8_e4m3fn)
return fp8_tensor, scale.to(torch.float32).reshape(1)
def _choose_splitkv(bs: int, seq: int) -> int:
NUM_CUS = 256
NUM_WARPS = 4
TILE_K = 32
# (bs * split) % (cu * warp) == 0
# splitk <= 32
# seq % splitk == 0 && seq / splitk >= 32
MAPS = {
(4, 1024): 32,
(4, 8192): 32,
(32, 1024): 32,
(32, 8192): 32,
(64, 1024): 16,
(64, 8192): 16,
(256, 1024): 4,
(256, 8192): 4,
}
override = os.getenv("MLA_SPLITKV_OVERRIDE")
if override is not None:
return int(override)
mapped = MAPS.get((bs, seq))
if mapped is not None:
return mapped
split = min(NUM_WARPS * NUM_CUS // bs, seq // TILE_K, 32)
return split
def custom_kernel(data: input_t) -> output_t:
q, kv_data, _, _, config = data
# TODO: bf16 kv on small shapes
if "mxfp4" not in kv_data or "fp8" not in kv_data:
raise RuntimeError("submission currently expects kv_data['mxfp4'] and kv_data['fp8']")
kv_mxfp4, kv_scale = kv_data["mxfp4"]
kv_fp8, kv_fp8_scale = kv_data["fp8"]
batch_size = int(config["batch_size"])
kv_seq_len = int(config["kv_seq_len"])
splitkv = _choose_splitkv(batch_size, kv_seq_len)
final_output, _, _ = _module.mla_decode_h16_fp8_fp8(
q.contiguous(),
kv_mxfp4.contiguous(),
kv_fp8.contiguous(),
kv_scale.contiguous(),
kv_fp8_scale.contiguous(),
splitkv,
float(config["sm_scale"]),
_hsaco_tensor if _hsaco_tensor.numel() else None,
)
return final_output.contiguous()
scrolls · 135 lines total
Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Changes from previous submission
Against this author's previous submission submission 631390.
⋯ 13 unchanged linesos.environ.setdefault("TORCH_EXTENSIONS_DIR", str(pathlib.Path(__file__).resolve().parent / ".torch_extensions"))HERE = pathlib.Path(__file__).resolve().parent- MLA_CPP_B64 = "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"- GPU_HSACO_B64 = "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"+ MLA_CPP_B64 = "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"+ GPU_HSACO_B64 = "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"_SRC_PATH = HERE / "_submission_mla.cu"_source_text = zlib.decompress(base64.b64decode(MLA_CPP_B64)).decode("utf-8")⋯ 6 unchanged linesstd::vector<torch::Tensor> mla_decode_h16_fp8_fp8(torch::Tensor q,torch::Tensor kv,+ torch::Tensor kv_fp8,torch::Tensor kv_scale,+ torch::Tensor kv_fp8_scale,int64_t splitkv,float softmax_scale,std::optional<torch::Tensor> hsaco_tensor);⋯ 77 unchanged linesdef custom_kernel(data: input_t) -> output_t:q, kv_data, _, _, config = data# TODO: bf16 kv on small shapes- if "fp8" not in kv_data:- raise RuntimeError("submission currently expects kv_data['fp8']")- kv_fp8, kv_scale = kv_data["fp8"]+ if "mxfp4" not in kv_data or "fp8" not in kv_data:+ raise RuntimeError("submission currently expects kv_data['mxfp4'] and kv_data['fp8']")+ kv_mxfp4, kv_scale = kv_data["mxfp4"]+ kv_fp8, kv_fp8_scale = kv_data["fp8"]batch_size = int(config["batch_size"])kv_seq_len = int(config["kv_seq_len"])splitkv = _choose_splitkv(batch_size, kv_seq_len)final_output, _, _ = _module.mla_decode_h16_fp8_fp8(q.contiguous(),+ kv_mxfp4.contiguous(),kv_fp8.contiguous(),kv_scale.contiguous(),+ kv_fp8_scale.contiguous(),splitkv,float(config["sm_scale"]),_hsaco_tensor if _hsaco_tensor.numel() else None,
scrolls · 44 diff lines total
Best evidence level for this revision: reported
JSON