Skip to content
KernelIndex
Search⌘K

submission 544928

rajesh0042 · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

No package. Vendor the mirrored source: 17 lines, June 9 Researcher Reciprocity License v1.0.

matmul_cublas.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-matmul-v2-544928?include=source"
interfacepython
Compatibility
measured onNVIDIA A100
declared hardwareNVIDIA A100
architecturessm_80
dtypesfp16

Benchmark evidence

1 measurement across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
FP16 matmulsuite of 8 cases
NVIDIA A100
655.3µs
#9 of 27
2026-03-13

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:075f945a8dc158445b5f542c93540b62743d43e917662dee0ee57f76149df0e2
license declaredunknown
license concludedunknown
authorsrajesh0042
imported2026-08-15

Kernel source

matmul_cublas.py17 lines
import os
os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8"

import torch
import torch.nn.functional as F
from task import input_t, output_t

# cuBLAS is already highly optimized for A100
# Try torch.mm which goes through cuBLAS internally but avoid overhead
# Also try torch.matmul with contiguous tensors

def custom_kernel(data: input_t) -> output_t:
    a, b, c = data
    # torch.mm writes to c in-place via addmm with beta=0
    torch.mm(a, b, out=c)
    return c

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 544874.

⋯ 1 unchanged lines
os.environ["CUBLAS_WORKSPACE_CONFIG"] = ":4096:8"
import torch
- import triton
- import triton.language as tl
+ import torch.nn.functional as F
from task import input_t, output_t
- @triton.autotune(
- configs=[
- triton.Config({'BLOCK_M': 128, 'BLOCK_N': 256, 'BLOCK_K': 64, 'GROUP_M': 8}, num_stages=3, num_warps=8),
- triton.Config({'BLOCK_M': 64, 'BLOCK_N': 256, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- triton.Config({'BLOCK_M': 128, 'BLOCK_N': 128, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- triton.Config({'BLOCK_M': 128, 'BLOCK_N': 64, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- triton.Config({'BLOCK_M': 64, 'BLOCK_N': 128, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- triton.Config({'BLOCK_M': 128, 'BLOCK_N': 256, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=3, num_warps=8),
- triton.Config({'BLOCK_M': 256, 'BLOCK_N': 128, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=3, num_warps=8),
- triton.Config({'BLOCK_M': 256, 'BLOCK_N': 64, 'BLOCK_K': 32, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- triton.Config({'BLOCK_M': 64, 'BLOCK_N': 256, 'BLOCK_K': 64, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- triton.Config({'BLOCK_M': 128, 'BLOCK_N': 128, 'BLOCK_K': 64, 'GROUP_M': 8}, num_stages=3, num_warps=8),
- triton.Config({'BLOCK_M': 64, 'BLOCK_N': 64, 'BLOCK_K': 64, 'GROUP_M': 8}, num_stages=3, num_warps=8),
- triton.Config({'BLOCK_M': 32, 'BLOCK_N': 256, 'BLOCK_K': 64, 'GROUP_M': 8}, num_stages=4, num_warps=4),
- ],
- key=['M', 'N', 'K'],
- )
- @triton.jit
- def 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_M: tl.constexpr,
- ):
- 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_M * num_pid_n
- group_id = pid // num_pid_in_group
- first_pid_m = group_id * GROUP_M
- group_size_m = min(num_pid_m - first_pid_m, GROUP_M)
- pid_m = first_pid_m + ((pid % num_pid_in_group) % group_size_m)
- pid_n = (pid % num_pid_in_group) // group_size_m
+ # cuBLAS is already highly optimized for A100
+ # Try torch.mm which goes through cuBLAS internally but avoid overhead
+ # Also try torch.matmul with contiguous tensors
- 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)
- 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)
-
- acc = tl.zeros((BLOCK_M, BLOCK_N), dtype=tl.float32)
- for k in range(0, tl.cdiv(K, BLOCK_K)):
- a = tl.load(a_ptrs, mask=offs_k[None, :] < K - k * BLOCK_K, other=0.0)
- b = tl.load(b_ptrs, mask=offs_k[:, None] < K - k * BLOCK_K, other=0.0)
- acc = tl.dot(a, b, acc)
- a_ptrs += BLOCK_K * stride_ak
- b_ptrs += BLOCK_K * stride_bk
-
- c = acc.to(tl.float16)
- 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, c, mask=c_mask)
-
-
def custom_kernel(data: input_t) -> output_t:
a, b, c = data
- M, K = a.shape
- K, N = b.shape
- grid = lambda META: (triton.cdiv(M, META['BLOCK_M']) * triton.cdiv(N, META['BLOCK_N']),)
- matmul_kernel[grid](
- a, b, c,
- M, N, K,
- a.stride(0), a.stride(1),
- b.stride(0), b.stride(1),
- c.stride(0), c.stride(1),
- )
+ # torch.mm writes to c in-place via addmm with beta=0
+ torch.mm(a, b, out=c)
return c
scrolls · 86 diff lines total

Best evidence level for this revision: reported

JSON