Skip to content
KernelIndex
Search⌘K

submission 779869

ajay_a · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

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

submission.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-histogram-v2-779869?include=source"
interfacepython
Compatibility
measured onNVIDIA B200
declared hardwareNVIDIA B200
architecturessm_100
dtypesuint8

Benchmark evidence

1 measurement across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
Histogramsuite of 6 cases
NVIDIA B200
248.8µs
#49 of 54
2026-04-23

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:3272dacf316307224cfd90c18e2c83e6b61e0c384947e6c360b6dfbeb4935954
license declaredunknown
license concludedunknown
authorsajay_a
imported2026-08-15

Kernel source

submission.py85 lines
#!POPCORN leaderboard histogram_v2
#!POPCORN gpu B200

# CUB DeviceHistogram::HistogramEven. Templates: fp32->i32, i32->i32.
import torch
from torch.utils.cpp_extension import load_inline
from task import input_t, output_t

_CUDA_SRC = r"""
#include <cub/cub.cuh>
#include <cstdint>

template <typename T, typename CounterT>
size_t _ws(int n, int bins) {
    size_t bytes = 0;
    int lv = bins + 1;
    cub::DeviceHistogram::HistogramEven(
        nullptr, bytes, (const T*)nullptr, (CounterT*)nullptr,
        lv, T(0), T(bins), n);
    return bytes;
}
template <typename T, typename CounterT>
void _h(uintptr_t s, uintptr_t h, int n, int bins, float lo, float hi,
        uintptr_t ws, size_t wb) {
    int lv = bins + 1;
    cub::DeviceHistogram::HistogramEven(
        reinterpret_cast<void*>(ws), wb,
        reinterpret_cast<const T*>(s),
        reinterpret_cast<CounterT*>(h),
        lv, T(lo), T(hi), n);
}
size_t ws_f32_i32(int64_t n, int64_t b) { return _ws<float, int32_t>((int)n, (int)b); }
void hist_f32_i32(uintptr_t s, uintptr_t h, int64_t n, int64_t b, float lo, float hi, uintptr_t w, size_t wb) { _h<float, int32_t>(s,h,(int)n,(int)b,lo,hi,w,wb); }
size_t ws_i32_i32(int64_t n, int64_t b) { return _ws<int32_t, int32_t>((int)n, (int)b); }
void hist_i32_i32(uintptr_t s, uintptr_t h, int64_t n, int64_t b, float lo, float hi, uintptr_t w, size_t wb) { _h<int32_t, int32_t>(s,h,(int)n,(int)b,lo,hi,w,wb); }
"""
_CPP_SRC = """
size_t ws_f32_i32(int64_t, int64_t);
void hist_f32_i32(uintptr_t, uintptr_t, int64_t, int64_t, float, float, uintptr_t, size_t);
size_t ws_i32_i32(int64_t, int64_t);
void hist_i32_i32(uintptr_t, uintptr_t, int64_t, int64_t, float, float, uintptr_t, size_t);
"""
_mod = load_inline(name="cub_hist_even_v2", cpp_sources=_CPP_SRC, cuda_sources=_CUDA_SRC,
                   functions=["ws_f32_i32","hist_f32_i32","ws_i32_i32","hist_i32_i32"],
                   extra_cuda_cflags=["-O3","-arch=sm_100"], extra_cflags=["-O3"], verbose=False)

_WS: dict = {}
def _get_ws(key, n, bins, device):
    k = (key, int(n), int(bins))
    ws = _WS.get(k)
    if ws is None:
        nb = getattr(_mod, f"ws_{key}")(n, bins)
        ws = torch.empty(max(int(nb), 1), dtype=torch.uint8, device=device)
        _WS[k] = ws
    return ws

def custom_kernel(data: input_t) -> output_t:
    samples = data[0]
    out = data[-1]
    if not samples.is_contiguous(): samples = samples.contiguous()
    n = samples.numel()
    bins = out.numel()
    in_dt = samples.dtype
    out_dt = out.dtype

    if in_dt == torch.float32 and out_dt == torch.int32:
        lo = float(samples.min().item())
        hi = float(samples.max().item())
        if hi <= lo: hi = lo + 1.0
        hi = hi + (hi - lo) * 1e-5
        ws = _get_ws("f32_i32", n, bins, samples.device)
        _mod.hist_f32_i32(samples.data_ptr(), out.data_ptr(), n, bins, lo, hi, ws.data_ptr(), ws.numel())
    elif in_dt == torch.int32 and out_dt == torch.int32:
        lo, hi = 0.0, float(bins)
        ws = _get_ws("i32_i32", n, bins, samples.device)
        _mod.hist_i32_i32(samples.data_ptr(), out.data_ptr(), n, bins, lo, hi, ws.data_ptr(), ws.numel())
    else:
        if samples.is_floating_point():
            out.copy_(torch.histc(samples, bins=bins,
                                  min=float(samples.min().item()),
                                  max=float(samples.max().item())).to(out_dt))
        else:
            out.copy_(torch.bincount(samples.to(torch.int64), minlength=bins)[:bins].to(out_dt))
    return out
scrolls · 85 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