submission 727033
zymla09 · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 651 lines, June 9 Researcher Reciprocity License v1.0.
submission_hip_fp8_hybrid.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-amd-mixed-mla-727033?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:b8e83811517b6046097ec686ae0c09cc632d08c83684cc19045d2ec375bab94e
license declaredunknown
license concludedunknown
authorszymla09
imported2026-08-26
Techniques
Extracted from the mirrored source by pattern, never inferred. Each row cites its line.
fp4
"""Hybrid: HIP FP4 unfused (kv<=2048) + aiter FP8 (kv>2048)"""tile-n = 16
BM, BN = 16, 64Kernel source
submission_hip_fp8_hybrid.py651 lines
#!POPCORN leaderboard amd-mixed-mla
#!POPCORN gpu MI355X
"""Hybrid: HIP FP4 unfused (kv<=2048) + aiter FP8 (kv>2048)"""
_CO_LZ_B64 = (
"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"
)
import os, lzma, base64, ctypes, struct, torch
from task import input_t, output_t
NQ = 16; QKD = 576; VD = 512; SM_SCALE = 1.0 / (QKD ** 0.5)
# =========================================================================
# HIP FP4 kernels (for kv <= 2048)
# =========================================================================
_hip = ctypes.CDLL("libamdhip64.so")
_hip.hipModuleLoadData.restype = ctypes.c_int
_hip.hipModuleLoadData.argtypes = [ctypes.c_void_p, ctypes.c_void_p]
_hip.hipModuleGetFunction.restype = ctypes.c_int
_hip.hipModuleGetFunction.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_char_p]
_hip.hipModuleLaunchKernel.restype = ctypes.c_int
_hip.hipModuleLaunchKernel.argtypes = [
ctypes.c_void_p, ctypes.c_uint, ctypes.c_uint, ctypes.c_uint,
ctypes.c_uint, ctypes.c_uint, ctypes.c_uint,
ctypes.c_uint, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p]
_co_data = lzma.decompress(base64.b64decode(_CO_LZ_B64))
_co_buf = (ctypes.c_char * len(_co_data)).from_buffer_copy(_co_data)
_mod = ctypes.c_void_p()
_hip.hipModuleLoadData(ctypes.byref(_mod), _co_buf)
def _get_fn(mod, name):
fn = ctypes.c_void_p()
r = _hip.hipModuleGetFunction(ctypes.byref(fn), mod, name)
assert r == 0, f"hipModuleGetFunction({name}) = {r}"
return fn
_fn_qk = _get_fn(_mod, b"_Z16fp4_gemm_batchedPK12hip_bfloat16PKhS3_PS_iiiiiiii")
_fn_sm = _get_fn(_mod, b"_Z18softmax_fp4_kernelPK12hip_bfloat16PhS2_fii")
_fn_pv = _get_fn(_mod, b"_Z19fp4_pv_fp4a_batchedPKhS0_S0_S0_P12hip_bfloat16iiiiiiiiii")
SMEM_QK = 54784
SMEM_PV = 21760 + 64
def _make_cfg(args_bytes):
ab = (ctypes.c_char * len(args_bytes)).from_buffer(args_bytes)
sz = ctypes.c_size_t(len(args_bytes))
return (ctypes.c_void_p * 5)(
ctypes.c_void_p(1), ctypes.cast(ab, ctypes.c_void_p),
ctypes.c_void_p(2), ctypes.cast(ctypes.pointer(sz), ctypes.c_void_p),
ctypes.c_void_p(3))
def _launch_qk(A_ptr, B_ptr, Bs_ptr, C_ptr, M, N, K, bs, sA, sB, sBs, sc_per_tok, sC):
BM, BN = 16, 64
grid_x = ((M + BM - 1) // BM) * ((N + BN - 1) // BN)
args = bytearray(64)
struct.pack_into("Q", args, 0, A_ptr)
struct.pack_into("Q", args, 8, B_ptr)
struct.pack_into("Q", args, 16, Bs_ptr)
struct.pack_into("Q", args, 24, C_ptr)
for i, v in enumerate([M, N, K, sA, sB, sBs, sc_per_tok, sC]):
struct.pack_into("i", args, 32 + i*4, v)
cfg = _make_cfg(args)
_hip.hipModuleLaunchKernel(_fn_qk, grid_x, bs, 1, 256, 1, 1, SMEM_QK,
ctypes.c_void_p(0), ctypes.c_void_p(0), cfg)
def _launch_sm(scores_ptr, pfp4_ptr, psc_ptr, sm_scale, bs, nq, kv):
args = bytearray(40)
struct.pack_into("Q", args, 0, scores_ptr)
struct.pack_into("Q", args, 8, pfp4_ptr)
struct.pack_into("Q", args, 16, psc_ptr)
struct.pack_into("f", args, 24, sm_scale)
struct.pack_into("i", args, 28, nq)
struct.pack_into("i", args, 32, kv)
cfg = _make_cfg(args)
_hip.hipModuleLaunchKernel(_fn_sm, bs * nq, 1, 1, 256, 1, 1, 0,
ctypes.c_void_p(0), ctypes.c_void_p(0), cfg)
def _launch_pv(afp4, asc, vfp4, vsc, c, M, N, K, bs, sAfp4, sAsc, sVfp4, fp4s, sVsc, scs, sC):
BM, BN = 16, 64
grid_x = ((M + BM - 1) // BM) * ((N + BN - 1) // BN)
args = bytearray(96)
for i, v in enumerate([afp4, asc, vfp4, vsc, c]):
struct.pack_into("Q", args, i*8, v)
for i, v in enumerate([M, N, K, sAfp4, sAsc, sVfp4, fp4s, sVsc, scs, sC]):
struct.pack_into("i", args, 40 + i*4, v)
cfg = _make_cfg(args)
_hip.hipModuleLaunchKernel(_fn_pv, grid_x, bs, 1, 256, 1, 1, SMEM_PV,
ctypes.c_void_p(0), ctypes.c_void_p(0), cfg)
_hip_cache = {}
def _hip_fp4_kernel(data):
q_bf16, kv_data, qo_indptr, kv_indptr, config = data
bs = config["batch_size"]; kv = config["kv_seq_len"]
kv_fp4, kv_sc = kv_data["mxfp4"]
Kfp4 = kv_fp4.view(torch.uint8).reshape(bs * kv, -1)
Ksc = kv_sc.view(torch.uint8).reshape(bs * kv, -1)
fp4_per_tok = Kfp4.shape[1]; sc_per_tok = Ksc.shape[1]
buf_key = (bs, kv)
if buf_key not in _hip_cache:
scores = torch.empty(bs, NQ, kv, dtype=torch.bfloat16, device="cuda")
p_fp4 = torch.empty(bs, NQ, kv // 2, dtype=torch.uint8, device="cuda")
p_sc = torch.empty(bs, NQ, kv // 32, dtype=torch.uint8, device="cuda")
out = torch.empty(bs, NQ, VD, dtype=torch.bfloat16, device="cuda")
_hip_cache[buf_key] = (scores, p_fp4, p_sc, out)
scores, p_fp4, p_sc, out = _hip_cache[buf_key]
Kptr = Kfp4.data_ptr(); Ksptr = Ksc.data_ptr()
_launch_qk(q_bf16.contiguous().data_ptr(), Kptr, Ksptr,
scores.data_ptr(), NQ, kv, QKD, bs,
NQ * QKD, kv * fp4_per_tok, kv * sc_per_tok, sc_per_tok, NQ * kv)
_launch_sm(scores.data_ptr(), p_fp4.data_ptr(), p_sc.data_ptr(),
SM_SCALE, bs, NQ, kv)
_launch_pv(p_fp4.data_ptr(), p_sc.data_ptr(), Kptr, Ksptr, out.data_ptr(),
NQ, VD, kv, bs,
NQ * (kv // 2), NQ * (kv // 32),
kv * fp4_per_tok, fp4_per_tok, kv * sc_per_tok, sc_per_tok, NQ * VD)
return out
# =========================================================================
# FP8 aiter fallback with metadata caching (for kv > 2048)
# =========================================================================
import aiter
from aiter import dtypes as aiter_dtypes
from aiter.mla import mla_decode_fwd
from aiter import get_mla_metadata_info_v1, get_mla_metadata_v1
from reference import PAGE_SIZE, NUM_KV_SPLITS, SM_SCALE as REF_SM_SCALE
FP8_DTYPE = aiter_dtypes.fp8
def _fp8_quantize(tensor):
flat = tensor.view(-1, tensor.shape[-1])
fp8_out, scale = aiter.per_tensor_quant_hip(flat, quant_dtype=FP8_DTYPE)
return fp8_out.view(tensor.shape), scale
_fp8_cache = {}
def _fp8_kernel(data):
q, kv_data, qo_indptr, kv_indptr, config = data
bs = config["batch_size"]; nq = config["num_heads"]; nkv = config["num_kv_heads"]
dq = config["qk_head_dim"]; dv = config["v_head_dim"]
q_seq_len = config["q_seq_len"]
total_kv = int(kv_indptr[-1].item())
q_fp8, q_scale = _fp8_quantize(q)
kv_fp8, kv_scale = kv_data["fp8"]
key = (bs, total_kv)
if key not in _fp8_cache:
kv_indices = torch.arange(total_kv, dtype=torch.int32, device="cuda")
kv_last_page_len = (kv_indptr[1:] - kv_indptr[:-1]).to(torch.int32)
info = get_mla_metadata_info_v1(bs, q_seq_len, nq, FP8_DTYPE, FP8_DTYPE,
is_sparse=False, fast_mode=False, num_kv_splits=NUM_KV_SPLITS,
intra_batch_mode=True)
w = [torch.empty(s, dtype=t, device="cuda") for s, t in info]
get_mla_metadata_v1(qo_indptr, kv_indptr, kv_last_page_len,
nq // nkv, nkv, True, w[0], w[2], w[1], w[3], w[4], w[5],
page_size=PAGE_SIZE, kv_granularity=max(PAGE_SIZE, 16),
max_seqlen_qo=q_seq_len, uni_seqlen_qo=q_seq_len, fast_mode=False,
max_split_per_batch=NUM_KV_SPLITS, intra_batch_mode=True,
dtype_q=FP8_DTYPE, dtype_kv=FP8_DTYPE)
meta = dict(work_meta_data=w[0], work_indptr=w[1], work_info_set=w[2],
reduce_indptr=w[3], reduce_final_map=w[4], reduce_partial_map=w[5])
kv_4d = kv_fp8.view(kv_fp8.shape[0], PAGE_SIZE, nkv, kv_fp8.shape[-1])
o = torch.empty((q.shape[0], nq, dv), dtype=torch.bfloat16, device="cuda")
_fp8_cache[key] = dict(kv_indices=kv_indices, kv_last_page_len=kv_last_page_len,
meta=meta, kv_4d=kv_4d, o=o)
c = _fp8_cache[key]
mla_decode_fwd(
q_fp8.view(-1, nq, dq), c["kv_4d"], c["o"],
qo_indptr, kv_indptr, c["kv_indices"], c["kv_last_page_len"],
q_seq_len, page_size=PAGE_SIZE, nhead_kv=nkv,
sm_scale=REF_SM_SCALE, logit_cap=0.0,
num_kv_splits=NUM_KV_SPLITS,
q_scale=q_scale, kv_scale=kv_scale,
intra_batch_mode=True, **c["meta"])
return c["o"]
# =========================================================================
# Hybrid dispatcher
# =========================================================================
_KV_THRESHOLD = 2048
def custom_kernel(data: input_t) -> output_t:
config = data[4]
kv = config["kv_seq_len"]
if kv <= _KV_THRESHOLD:
return _hip_fp4_kernel(data)
else:
return _fp8_kernel(data)
scrolls · 651 lines total
Source code from GPU Mode and the KernelBot dataset · June 9 Researcher Reciprocity License v1.0
Best evidence level for this revision: reported
JSON