submission 754379
ftyghome · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 140 lines, June 9 Researcher Reciprocity License v1.0.
submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixed-mla-754379?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:f65feb12ac9ab501988fdc6f394a50b73af8c21149b2e755f2d827381ad0d2ea
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.py140 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,
}
return MAPS.get((bs, seq))
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_scale: torch.Tensor
# print(kv_scale.shape, kv_scale.stride(), kv_scale[0], kv_scale[31])
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, split_out, split_lse = _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,
)
# print(split_out)
# print(split_lse)
return final_output.contiguous()
scrolls · 140 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 749134.
⋯ 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")⋯ 79 unchanged lines(256, 1024): 4,(256, 8192): 4,}+ return MAPS.get((bs, seq))override = os.getenv("MLA_SPLITKV_OVERRIDE")if override is not None:return int(override)⋯ 16 unchanged linesbatch_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(+ final_output, split_out, split_lse = _module.mla_decode_h16_fp8_fp8(q.contiguous(),kv_mxfp4.contiguous(),kv_fp8.contiguous(),⋯ 3 unchanged linesfloat(config["sm_scale"]),_hsaco_tensor if _hsaco_tensor.numel() else None,)+ # print(split_out)+ # print(split_lse)return final_output.contiguous()
scrolls · 35 diff lines total
Best evidence level for this revision: reported
JSON