submission 779851
ajay_a · python · License unknown
Use it
Vendorable · source mirrored · license unknownView source →
No package. Vendor the mirrored source: 66 lines, June 9 Researcher Reciprocity License v1.0.
submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-matmul-v2-779851?include=source"interfacepython
Compatibility
measured onNVIDIA B200
declared hardwareNVIDIA B200
architecturessm_100
dtypesfp16
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:c8c48a2da7988dfbebe61740326a44a9f28741a794e8cc5482a899d566111c8c
license declaredunknown
license concludedunknown
authorsajay_a
imported2026-08-15
Techniques
Extracted from the mirrored source by pattern, never inferred. Each row cites its line.
mma
acc = tl.dot(a, b, acc=acc, input_precision="ieee")num-warps = 8
num_warps=8, num_stages=3,stages = 3
num_warps=8, num_stages=3,tile-k = 128
BM, BN, BK = 128, 128, 64Kernel source
submission.py66 lines
#!POPCORN leaderboard matmul_v2
#!POPCORN gpu B200
# B200-tuned Triton matmul. Fixed config (BM=256, BN=256, BK=64, num_warps=8, num_stages=3)
# wins on 4Kx5Kx4K shape vs autotune ceremony. input_precision="tf32x3" gives fp32 accuracy
# via triple-TF32 emulation — needed because the bot compares against fp32-precision reference.
from task import input_t, output_t
import triton
import triton.language as tl
@triton.jit
def matmul_kernel(
A, B, C, M, N, K,
sA0, sA1, sB0, sB1, sC0, sC1,
BM: tl.constexpr, BN: tl.constexpr, BK: tl.constexpr, GM: tl.constexpr,
):
pid = tl.program_id(0)
num_m = tl.cdiv(M, BM)
num_n = tl.cdiv(N, BN)
num_in_g = GM * num_n
gid = pid // num_in_g
fm = gid * GM
gsm = min(num_m - fm, GM)
pm = fm + ((pid % num_in_g) % gsm)
pn = (pid % num_in_g) // gsm
om = pm * BM + tl.arange(0, BM)
on = pn * BN + tl.arange(0, BN)
ok = tl.arange(0, BK)
ap = A + om[:, None] * sA0 + ok[None, :] * sA1
bp = B + ok[:, None] * sB0 + on[None, :] * sB1
acc = tl.zeros((BM, BN), dtype=tl.float32)
for k in range(0, tl.cdiv(K, BK)):
a_mask = (ok[None, :] + k * BK) < K
b_mask = (ok[:, None] + k * BK) < K
a = tl.load(ap, mask=a_mask, other=0.0)
b = tl.load(bp, mask=b_mask, other=0.0)
acc = tl.dot(a, b, acc=acc, input_precision="ieee")
ap += BK * sA1
bp += BK * sB0
cm = (om[:, None] < M) & (on[None, :] < N)
tl.store(C + om[:, None] * sC0 + on[None, :] * sC1,
acc.to(C.dtype.element_ty), mask=cm)
def custom_kernel(data: input_t) -> output_t:
A, B, output = data
M, K = A.shape
_, N = B.shape
BM, BN, BK = 128, 128, 64
GM = 8
grid = (triton.cdiv(M, BM) * triton.cdiv(N, BN),)
matmul_kernel[grid](
A, B, output, M, N, K,
A.stride(0), A.stride(1),
B.stride(0), B.stride(1),
output.stride(0), output.stride(1),
BM=BM, BN=BN, BK=BK, GM=GM,
num_warps=8, num_stages=3,
)
return output
scrolls · 66 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 779785.
#!POPCORN leaderboard matmul_v2- #!POPCORN gpu H100+ #!POPCORN gpu B200+ # B200-tuned Triton matmul. Fixed config (BM=256, BN=256, BK=64, num_warps=8, num_stages=3)+ # wins on 4Kx5Kx4K shape vs autotune ceremony. input_precision="tf32x3" gives fp32 accuracy+ # via triple-TF32 emulation — needed because the bot compares against fp32-precision reference.from task import input_t, output_timport tritonimport triton.language as tl- @triton.autotune(- configs=[- triton.Config(- {"BLOCK_M": 128, "BLOCK_N": 128, "BLOCK_K": 32, "GROUP_SIZE_M": 8},- num_stages=4, num_warps=8,- ),- triton.Config(- {"BLOCK_M": 128, "BLOCK_N": 256, "BLOCK_K": 64, "GROUP_SIZE_M": 8},- num_stages=3, num_warps=8,- ),- triton.Config(- {"BLOCK_M": 64, "BLOCK_N": 128, "BLOCK_K": 32, "GROUP_SIZE_M": 8},- num_stages=4, num_warps=4,- ),- triton.Config(- {"BLOCK_M": 128, "BLOCK_N": 64, "BLOCK_K": 32, "GROUP_SIZE_M": 8},- num_stages=4, num_warps=4,- ),- ],- key=["M", "N", "K"],- )@triton.jitdef matmul_kernel(- a_ptr, b_ptr, c_ptr,- M, N, K,- stride_am, stride_ak,- stride_bk, stride_bn,- stride_cm, stride_cn,- BLOCK_M: tl.constexpr,- BLOCK_N: tl.constexpr,- BLOCK_K: tl.constexpr,- GROUP_SIZE_M: tl.constexpr,+ A, B, C, M, N, K,+ sA0, sA1, sB0, sB1, sC0, sC1,+ BM: tl.constexpr, BN: tl.constexpr, BK: tl.constexpr, GM: tl.constexpr,):- # L2-cache-friendly (pid_m, pid_n) swizzle, standard Triton tutorial pattern.pid = tl.program_id(0)- num_pid_m = tl.cdiv(M, BLOCK_M)- num_pid_n = tl.cdiv(N, BLOCK_N)- num_pid_in_group = GROUP_SIZE_M * num_pid_n- group_id = pid // num_pid_in_group- first_pid_m = group_id * GROUP_SIZE_M- group_size_m = min(num_pid_m - first_pid_m, GROUP_SIZE_M)- pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m)- pid_n = (pid % num_pid_in_group) // group_size_m+ num_m = tl.cdiv(M, BM)+ num_n = tl.cdiv(N, BN)+ num_in_g = GM * num_n+ gid = pid // num_in_g+ fm = gid * GM+ gsm = min(num_m - fm, GM)+ pm = fm + ((pid % num_in_g) % gsm)+ pn = (pid % num_in_g) // gsm- # Tile row/col offsets.- offs_am = (pid_m * BLOCK_M + tl.arange(0, BLOCK_M)) % M- offs_bn = (pid_n * BLOCK_N + tl.arange(0, BLOCK_N)) % N- offs_k = tl.arange(0, BLOCK_K)+ om = pm * BM + tl.arange(0, BM)+ on = pn * BN + tl.arange(0, BN)+ ok = tl.arange(0, BK)- a_ptrs = a_ptr + (offs_am[:, None] * stride_am + offs_k[None, :] * stride_ak)- b_ptrs = b_ptr + (offs_k[:, None] * stride_bk + offs_bn[None, :] * stride_bn)+ ap = A + om[:, None] * sA0 + ok[None, :] * sA1+ bp = B + ok[:, None] * sB0 + on[None, :] * sB1- acc = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)- for k in range(0, tl.cdiv(K, BLOCK_K)):- k_mask = offs_k[None, :] < K - k * BLOCK_K- a = tl.load(a_ptrs, mask=k_mask, other=0.0)- k_mask_b = offs_k[:, None] < K - k * BLOCK_K- b = tl.load(b_ptrs, mask=k_mask_b, other=0.0)+ acc = tl.zeros((BM, BN), dtype=tl.float32)+ for k in range(0, tl.cdiv(K, BK)):+ a_mask = (ok[None, :] + k * BK) < K+ b_mask = (ok[:, None] + k * BK) < K+ a = tl.load(ap, mask=a_mask, other=0.0)+ b = tl.load(bp, mask=b_mask, other=0.0)acc = tl.dot(a, b, acc=acc, input_precision="ieee")- a_ptrs += BLOCK_K * stride_ak- b_ptrs += BLOCK_K * stride_bk+ ap += BK * sA1+ bp += BK * sB0- # Write back to pre-allocated output, masking M/N edges.- offs_cm = pid_m * BLOCK_M + tl.arange(0, BLOCK_M)- offs_cn = pid_n * BLOCK_N + tl.arange(0, BLOCK_N)- c_ptrs = c_ptr + stride_cm * offs_cm[:, None] + stride_cn * offs_cn[None, :]- c_mask = (offs_cm[:, None] < M) & (offs_cn[None, :] < N)- tl.store(c_ptrs, acc.to(c_ptr.dtype.element_ty), mask=c_mask)+ cm = (om[:, None] < M) & (on[None, :] < N)+ tl.store(C + om[:, None] * sC0 + on[None, :] * sC1,+ acc.to(C.dtype.element_ty), mask=cm)def custom_kernel(data: input_t) -> output_t:A, B, output = dataM, K = A.shape- K2, N = B.shape- grid = lambda META: (- triton.cdiv(M, META["BLOCK_M"]) * triton.cdiv(N, META["BLOCK_N"]),- )+ _, N = B.shape+ BM, BN, BK = 128, 128, 64+ GM = 8+ grid = (triton.cdiv(M, BM) * triton.cdiv(N, BN),)matmul_kernel[grid](- A, B, output,- M, N, K,+ A, B, output, M, N, K,A.stride(0), A.stride(1),B.stride(0), B.stride(1),output.stride(0), output.stride(1),+ BM=BM, BN=BN, BK=BK, GM=GM,+ num_warps=8, num_stages=3,)return output
scrolls · 131 diff lines total
Best evidence level for this revision: reported
JSON