Skip to content
KernelIndex
Search⌘K

submission 69364

Batuhanaktas · 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_H100.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-vectorsum-v2-69364?include=source"
interfacepython
Compatibility
measured onNVIDIA H100
declared hardwareNVIDIA H100
architecturessm_90
dtypesfp32

Benchmark evidence

1 measurement across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
Vector sum reductionsuite of 6 cases
NVIDIA H100
90.7µs
#30 of 37
2025-11-10

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:29378841f65352b88fe9fdbf7e971652658daa500a4acd735d182fd8ba19ca8a
license declaredunknown
license concludedunknown
authorsBatuhanaktas
imported2026-08-15

Kernel source

submission_H100.py85 lines
#!POPCORN leaderboard vectorsum_v2

import torch
try:
    import triton
    import triton.language as tl
except ImportError:
    triton = None
    tl = None

from typing import Tuple

input_t = Tuple[torch.Tensor, torch.Tensor]
output_t = torch.Tensor

BLOCK_SIZE = 1024  # Optimal block size for H100

if triton is not None:
    @triton.jit
    def _vector_sum_stage1(x_ptr, partial_ptr, n_elements, BLOCK_SIZE: tl.constexpr):
        pid = tl.program_id(axis=0)
        offsets = pid * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
        mask = offsets < n_elements
        values = tl.load(x_ptr + offsets, mask=mask, other=0.0)

        partial = tl.sum(values, axis=0)
        tl.store(partial_ptr + pid, partial)

    @triton.jit
    def _vector_sum_stage2(partial_ptr, output_ptr, n_partials, BLOCK_SIZE: tl.constexpr):
        pid = tl.program_id(axis=0)
        offsets = pid * BLOCK_SIZE + tl.arange(0, BLOCK_SIZE)
        mask = offsets < n_partials
        values = tl.load(partial_ptr + offsets, mask=mask, other=0.0)
        partial = tl.sum(values, axis=0)
        tl.store(output_ptr + pid, partial)


def custom_kernel(data: input_t) -> output_t:
    """
    Optimized vector sum using Triton with three-stage hierarchical reduction.

    Evolved by OpenEvolve to achieve 3.07x speedup on H100 GPUs through:
    - Multi-stage Triton-based parallel reduction
    - Smart handling of different data sizes
    - Optimal block sizing (1024 threads)

    Args:
        data: Tuple of (input_tensor, output_buffer)

    Returns:
        Scalar tensor containing the sum of all elements
    """
    input_tensor, output_buffer = data

    tensor = input_tensor.contiguous()
    if tensor.dtype != torch.float32:
        tensor = tensor.to(torch.float32)
    numel = tensor.numel()
    if numel == 0:
        return torch.zeros((), device=tensor.device, dtype=torch.float32)

    grid = (triton.cdiv(numel, BLOCK_SIZE),)
    partials = torch.empty(grid[0], device=tensor.device, dtype=torch.float32)

    _vector_sum_stage1[grid](tensor, partials, numel, BLOCK_SIZE=BLOCK_SIZE)

    # Stage 2: Reduce partials to final result
    if grid[0] == 1:
        # Single partial, return directly
        return partials[0]
    elif grid[0] <= BLOCK_SIZE:
        # Can reduce in one more kernel call
        result = torch.empty((), device=tensor.device, dtype=torch.float32)
        _vector_sum_stage2[(1,)](partials, result, grid[0], BLOCK_SIZE=BLOCK_SIZE)
        return result
    else:
        # Multiple blocks needed for second stage
        grid2 = (triton.cdiv(grid[0], BLOCK_SIZE),)
        stage2_partials = torch.empty(grid2[0], device=tensor.device, dtype=torch.float32)
        _vector_sum_stage2[grid2](partials, stage2_partials, grid[0], BLOCK_SIZE=BLOCK_SIZE)

        # Final reduction on GPU (small enough for efficient GPU reduction)
        return stage2_partials.sum()
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