Skip to content
KernelIndex
Search⌘K

submission 780718

brianyu · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

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

a100_v2_cublaslt_ws32m_idx2_s0.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-matmul-v2-780718?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
627.7µs
#1 of 27
2026-05-06

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:2ae96b35ae427ee7d26fb0111b38abe4931f1ed838b720eb3fec63a81b0d44fb
license declaredunknown
license concludedunknown
authorsbrianyu
imported2026-08-15

Kernel source

a100_v2_cublaslt_ws32m_idx2_s0.py156 lines
#!POPCORN leaderboard matmul_v2
#!POPCORN gpus A100

import os
import torch
from torch.utils.cpp_extension import load_inline
from task import input_t, output_t


CPP_SRC = r"""
#include <cublasLt.h>
#include <torch/extension.h>

#include <stdexcept>
#include <vector>

#define CHECK_CUBLAS(call)                         \
  do {                                             \
    cublasStatus_t status = (call);                \
    if (status != CUBLAS_STATUS_SUCCESS) {         \
      throw std::runtime_error("cuBLAS error");   \
    }                                              \
  } while (0)


struct LtPlan {
  bool initialized = false;
  cublasLtHandle_t handle = nullptr;
  cublasLtMatmulDesc_t op = nullptr;
  cublasLtMatrixLayout_t a_desc = nullptr;
  cublasLtMatrixLayout_t b_desc = nullptr;
  cublasLtMatrixLayout_t c_desc = nullptr;
  cublasLtMatmulAlgo_t algo;
  torch::Tensor workspace;
  size_t workspace_bytes = 33554432;

  void init(torch::Tensor C) {
    if (initialized) return;

    const int64_t m = 4096;
    const int64_t n = 5120;
    const int64_t k = 4096;
    const int requested = 8;
    const int wanted_idx = 2;

    cublasOperation_t trans = CUBLAS_OP_N;
    cublasLtOrder_t order = CUBLASLT_ORDER_ROW;

    CHECK_CUBLAS(cublasLtCreate(&handle));
    CHECK_CUBLAS(cublasLtMatmulDescCreate(&op, CUBLAS_COMPUTE_32F, CUDA_R_32F));
    CHECK_CUBLAS(cublasLtMatmulDescSetAttribute(
        op, CUBLASLT_MATMUL_DESC_TRANSA, &trans, sizeof(trans)));
    CHECK_CUBLAS(cublasLtMatmulDescSetAttribute(
        op, CUBLASLT_MATMUL_DESC_TRANSB, &trans, sizeof(trans)));

    CHECK_CUBLAS(cublasLtMatrixLayoutCreate(&a_desc, CUDA_R_16F, m, k, k));
    CHECK_CUBLAS(cublasLtMatrixLayoutCreate(&b_desc, CUDA_R_16F, k, n, n));
    CHECK_CUBLAS(cublasLtMatrixLayoutCreate(&c_desc, CUDA_R_16F, m, n, n));
    CHECK_CUBLAS(cublasLtMatrixLayoutSetAttribute(
        a_desc, CUBLASLT_MATRIX_LAYOUT_ORDER, &order, sizeof(order)));
    CHECK_CUBLAS(cublasLtMatrixLayoutSetAttribute(
        b_desc, CUBLASLT_MATRIX_LAYOUT_ORDER, &order, sizeof(order)));
    CHECK_CUBLAS(cublasLtMatrixLayoutSetAttribute(
        c_desc, CUBLASLT_MATRIX_LAYOUT_ORDER, &order, sizeof(order)));

    cublasLtMatmulPreference_t pref = nullptr;
    CHECK_CUBLAS(cublasLtMatmulPreferenceCreate(&pref));
    CHECK_CUBLAS(cublasLtMatmulPreferenceSetAttribute(
        pref,
        CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES,
        &workspace_bytes,
        sizeof(workspace_bytes)));

    std::vector<cublasLtMatmulHeuristicResult_t> heuristic(requested);
    int returned = 0;
    CHECK_CUBLAS(cublasLtMatmulAlgoGetHeuristic(
        handle,
        op,
        a_desc,
        b_desc,
        c_desc,
        c_desc,
        pref,
        requested,
        heuristic.data(),
        &returned));
    CHECK_CUBLAS(cublasLtMatmulPreferenceDestroy(pref));
    if (returned <= 0) {
      throw std::runtime_error("cuBLASLt returned no heuristic algorithms");
    }
    int chosen = wanted_idx < returned ? wanted_idx : 0;
    algo = heuristic[chosen].algo;
    workspace = torch::empty({static_cast<int64_t>(workspace_bytes)}, C.options().dtype(torch::kUInt8));
    initialized = true;
  }
};

static LtPlan plan;

void cublaslt_matmul(torch::Tensor A, torch::Tensor B, torch::Tensor C) {
  TORCH_CHECK(A.is_cuda() && B.is_cuda() && C.is_cuda(), "expected CUDA tensors");
  TORCH_CHECK(A.dtype() == torch::kFloat16 && B.dtype() == torch::kFloat16 && C.dtype() == torch::kFloat16,
              "expected fp16 tensors");
  TORCH_CHECK(A.is_contiguous() && B.is_contiguous() && C.is_contiguous(), "expected contiguous tensors");
  plan.init(C);

  const float alpha = 1.0f;
  const float beta = 0.0f;
  CHECK_CUBLAS(cublasLtMatmul(
      plan.handle,
      plan.op,
      &alpha,
      A.data_ptr(),
      plan.a_desc,
      B.data_ptr(),
      plan.b_desc,
      &beta,
      C.data_ptr(),
      plan.c_desc,
      C.data_ptr(),
      plan.c_desc,
      &plan.algo,
      plan.workspace.data_ptr(),
      plan.workspace_bytes,
      0));
}

PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
  m.def("cublaslt_matmul", &cublaslt_matmul, "fixed-shape cuBLASLt matmul");
}
"""


os.environ.setdefault("TORCH_CUDA_ARCH_LIST", "8.0")
_local_bin = os.path.expanduser("~/.local/bin")
os.environ["PATH"] = _local_bin + os.pathsep + os.environ.get("PATH", "")

_EXT = load_inline(
    name="a100_v2_cublaslt_ws32m_idx2_s0_ext",
    cpp_sources=[CPP_SRC],
    extra_cflags=["-O3"],
    extra_cuda_cflags=["-O3"],
    extra_ldflags=["-lcublasLt", "-lcublas"],
    verbose=False,
    with_cuda=True,
)


def custom_kernel(data: input_t) -> output_t:
    a, b, c = data
    if a.shape == (4096, 4096) and b.shape == (4096, 5120):
        _EXT.cublaslt_matmul(a, b, c)
    else:
        torch.mm(a, b, out=c)
    return c
scrolls · 156 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 780614.

#!POPCORN leaderboard matmul_v2
#!POPCORN gpus A100
+ import os
import torch
+ from torch.utils.cpp_extension import load_inline
from task import input_t, output_t
+ CPP_SRC = r"""
+ #include <cublasLt.h>
+ #include <torch/extension.h>
+
+ #include <stdexcept>
+ #include <vector>
+
+ #define CHECK_CUBLAS(call) \
+ do { \
+ cublasStatus_t status = (call); \
+ if (status != CUBLAS_STATUS_SUCCESS) { \
+ throw std::runtime_error("cuBLAS error"); \
+ } \
+ } while (0)
+
+
+ struct LtPlan {
+ bool initialized = false;
+ cublasLtHandle_t handle = nullptr;
+ cublasLtMatmulDesc_t op = nullptr;
+ cublasLtMatrixLayout_t a_desc = nullptr;
+ cublasLtMatrixLayout_t b_desc = nullptr;
+ cublasLtMatrixLayout_t c_desc = nullptr;
+ cublasLtMatmulAlgo_t algo;
+ torch::Tensor workspace;
+ size_t workspace_bytes = 33554432;
+
+ void init(torch::Tensor C) {
+ if (initialized) return;
+
+ const int64_t m = 4096;
+ const int64_t n = 5120;
+ const int64_t k = 4096;
+ const int requested = 8;
+ const int wanted_idx = 2;
+
+ cublasOperation_t trans = CUBLAS_OP_N;
+ cublasLtOrder_t order = CUBLASLT_ORDER_ROW;
+
+ CHECK_CUBLAS(cublasLtCreate(&handle));
+ CHECK_CUBLAS(cublasLtMatmulDescCreate(&op, CUBLAS_COMPUTE_32F, CUDA_R_32F));
+ CHECK_CUBLAS(cublasLtMatmulDescSetAttribute(
+ op, CUBLASLT_MATMUL_DESC_TRANSA, &trans, sizeof(trans)));
+ CHECK_CUBLAS(cublasLtMatmulDescSetAttribute(
+ op, CUBLASLT_MATMUL_DESC_TRANSB, &trans, sizeof(trans)));
+
+ CHECK_CUBLAS(cublasLtMatrixLayoutCreate(&a_desc, CUDA_R_16F, m, k, k));
+ CHECK_CUBLAS(cublasLtMatrixLayoutCreate(&b_desc, CUDA_R_16F, k, n, n));
+ CHECK_CUBLAS(cublasLtMatrixLayoutCreate(&c_desc, CUDA_R_16F, m, n, n));
+ CHECK_CUBLAS(cublasLtMatrixLayoutSetAttribute(
+ a_desc, CUBLASLT_MATRIX_LAYOUT_ORDER, &order, sizeof(order)));
+ CHECK_CUBLAS(cublasLtMatrixLayoutSetAttribute(
+ b_desc, CUBLASLT_MATRIX_LAYOUT_ORDER, &order, sizeof(order)));
+ CHECK_CUBLAS(cublasLtMatrixLayoutSetAttribute(
+ c_desc, CUBLASLT_MATRIX_LAYOUT_ORDER, &order, sizeof(order)));
+
+ cublasLtMatmulPreference_t pref = nullptr;
+ CHECK_CUBLAS(cublasLtMatmulPreferenceCreate(&pref));
+ CHECK_CUBLAS(cublasLtMatmulPreferenceSetAttribute(
+ pref,
+ CUBLASLT_MATMUL_PREF_MAX_WORKSPACE_BYTES,
+ &workspace_bytes,
+ sizeof(workspace_bytes)));
+
+ std::vector<cublasLtMatmulHeuristicResult_t> heuristic(requested);
+ int returned = 0;
+ CHECK_CUBLAS(cublasLtMatmulAlgoGetHeuristic(
+ handle,
+ op,
+ a_desc,
+ b_desc,
+ c_desc,
+ c_desc,
+ pref,
+ requested,
+ heuristic.data(),
+ &returned));
+ CHECK_CUBLAS(cublasLtMatmulPreferenceDestroy(pref));
+ if (returned <= 0) {
+ throw std::runtime_error("cuBLASLt returned no heuristic algorithms");
+ }
+ int chosen = wanted_idx < returned ? wanted_idx : 0;
+ algo = heuristic[chosen].algo;
+ workspace = torch::empty({static_cast<int64_t>(workspace_bytes)}, C.options().dtype(torch::kUInt8));
+ initialized = true;
+ }
+ };
+
+ static LtPlan plan;
+
+ void cublaslt_matmul(torch::Tensor A, torch::Tensor B, torch::Tensor C) {
+ TORCH_CHECK(A.is_cuda() && B.is_cuda() && C.is_cuda(), "expected CUDA tensors");
+ TORCH_CHECK(A.dtype() == torch::kFloat16 && B.dtype() == torch::kFloat16 && C.dtype() == torch::kFloat16,
+ "expected fp16 tensors");
+ TORCH_CHECK(A.is_contiguous() && B.is_contiguous() && C.is_contiguous(), "expected contiguous tensors");
+ plan.init(C);
+
+ const float alpha = 1.0f;
+ const float beta = 0.0f;
+ CHECK_CUBLAS(cublasLtMatmul(
+ plan.handle,
+ plan.op,
+ &alpha,
+ A.data_ptr(),
+ plan.a_desc,
+ B.data_ptr(),
+ plan.b_desc,
+ &beta,
+ C.data_ptr(),
+ plan.c_desc,
+ C.data_ptr(),
+ plan.c_desc,
+ &plan.algo,
+ plan.workspace.data_ptr(),
+ plan.workspace_bytes,
+ 0));
+ }
+
+ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
+ m.def("cublaslt_matmul", &cublaslt_matmul, "fixed-shape cuBLASLt matmul");
+ }
+ """
+
+
+ os.environ.setdefault("TORCH_CUDA_ARCH_LIST", "8.0")
+ _local_bin = os.path.expanduser("~/.local/bin")
+ os.environ["PATH"] = _local_bin + os.pathsep + os.environ.get("PATH", "")
+
+ _EXT = load_inline(
+ name="a100_v2_cublaslt_ws32m_idx2_s0_ext",
+ cpp_sources=[CPP_SRC],
+ extra_cflags=["-O3"],
+ extra_cuda_cflags=["-O3"],
+ extra_ldflags=["-lcublasLt", "-lcublas"],
+ verbose=False,
+ with_cuda=True,
+ )
+
+
def custom_kernel(data: input_t) -> output_t:
a, b, c = data
- torch.mm(a, b, out=c)
+ if a.shape == (4096, 4096) and b.shape == (4096, 5120):
+ _EXT.cublaslt_matmul(a, b, c)
+ else:
+ torch.mm(a, b, out=c)
return c
scrolls · 156 diff lines total

Best evidence level for this revision: reported

JSON