Skip to content
KernelIndex
Search⌘K

submission 66598

BlueDream · python · License unknown

Use it

Vendorable · source mirrored · license unknownView source →

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

vecsum2.py
curl "https://kernelindex.com/api/v1/implementations/kernelbot-vectorsum-v2-66598?include=source"
interfacepython
Compatibility
measured onNVIDIA L4
declared hardwareNVIDIA L4
architecturessm_89
dtypesfp32

Benchmark evidence

1 measurement across 1 GPU, fastest first.

Operation / workload
Hardware
Latency
Rank
Observed
Vector sum reductionsuite of 6 cases
NVIDIA L4
2.77ms
#25 of 26
2025-11-04

Reported · How evidence levels are derived →

Source and license

sourceavailable
revision digestsha256:f7176dee5dad40c2104c6529d3b4091f00af0eca0e7d7e93f5114c8425ca1248
license declaredunknown
license concludedunknown
authorsBlueDream
imported2026-08-15

Techniques

Extracted from the mirrored source by pattern, never inferred. Each row cites its line.

shared-memoryextern __shared__ __align__(sizeof(scalar_t)) char shared_mem_char[];

Kernel source

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

# Optimize for L4 GPU architecture
os.environ['TORCH_CUDA_ARCH_LIST'] = '8.9'

def custom_kernel(data: input_t) -> output_t:
    """
    CUDA implementation of vectorSum with Kahan compensated summation.
    
    Args:
        data: Tuple of (input_tensor, output_tensor)
              - input_tensor: 1D tensor of shape (N,) with float32 values
              - output_tensor: Pre-allocated output tensor of shape (1,)
    
    Returns:
        Scalar tensor containing the sum of all input elements
    """
    # Unpack the input tuple
    input_tensor, output_tensor = data
    
    # Ensure contiguous memory layout for optimal access
    A = input_tensor.contiguous()
    
    # Validation checks
    assert A.is_cuda, "Input tensor must be on GPU"
    assert A.dim() == 1, "Input tensor must be 1-dimensional"
    assert A.dtype == torch.float32, "Input tensor must be float32"
    
    N = A.numel()
    
    # Handle edge case of empty input
    if N == 0:
        output_tensor.fill_(0.0)
        return output_tensor.squeeze()
    
    # CUDA kernel source code with Kahan summation for better precision
    cuda_source = """
    #include <torch/extension.h>
    #include <cuda_runtime.h>

    // Kahan compensated summation for better numerical accuracy
    template <typename scalar_t>
    __inline__ __device__ void kahanSum(scalar_t& sum, scalar_t& c, scalar_t value) {
        scalar_t y = value - c;
        scalar_t t = sum + y;
        c = (t - sum) - y;
        sum = t;
    }

    // Warp-level reduction using shuffle instructions
    template <typename scalar_t>
    __inline__ __device__ scalar_t warpReduceSum(scalar_t val) {
        for (int offset = 16; offset > 0; offset /= 2) {
            val += __shfl_down_sync(0xffffffff, val, offset);
        }
        return val;
    }

    // Two-stage reduction: blocks -> final sum
    template <typename scalar_t>
    __global__ void vector_sum_kernel_stage1(
        const scalar_t* __restrict__ input,
        scalar_t* __restrict__ block_sums,
        const int N
    ) {
        extern __shared__ __align__(sizeof(scalar_t)) char shared_mem_char[];
        scalar_t* sharedMem = reinterpret_cast<scalar_t*>(shared_mem_char);

        const int tid = threadIdx.x;
        const int bid = blockIdx.x;
        const int globalIdx = bid * blockDim.x + tid;

        // Kahan summation for each thread
        scalar_t threadSum = 0;
        scalar_t compensation = 0;

        for (int i = globalIdx; i < N; i += gridDim.x * blockDim.x) {
            kahanSum(threadSum, compensation, input[i]);
        }

        // Warp-level reduction
        threadSum = warpReduceSum(threadSum);

        // Store warp results to shared memory
        if (tid % 32 == 0) {
            sharedMem[tid / 32] = threadSum;
        }
        __syncthreads();

        // First warp reduces all warp sums
        if (tid < 32) {
            scalar_t val = (tid < (blockDim.x + 31) / 32) ? sharedMem[tid] : 0;
            scalar_t blockSum = warpReduceSum(val);

            if (tid == 0) {
                block_sums[bid] = blockSum;
            }
        }
    }

    template <typename scalar_t>
    __global__ void vector_sum_kernel_stage2(
        const scalar_t* __restrict__ block_sums,
        scalar_t* __restrict__ output,
        const int num_blocks
    ) {
        extern __shared__ __align__(sizeof(scalar_t)) char shared_mem_char[];
        scalar_t* sharedMem = reinterpret_cast<scalar_t*>(shared_mem_char);

        const int tid = threadIdx.x;

        // Kahan summation for final reduction
        scalar_t threadSum = 0;
        scalar_t compensation = 0;

        for (int i = tid; i < num_blocks; i += blockDim.x) {
            kahanSum(threadSum, compensation, block_sums[i]);
        }

        // Warp-level reduction
        threadSum = warpReduceSum(threadSum);

        if (tid % 32 == 0) {
            sharedMem[tid / 32] = threadSum;
        }
        __syncthreads();

        if (tid < 32) {
            scalar_t val = (tid < (blockDim.x + 31) / 32) ? sharedMem[tid] : 0;
            scalar_t finalSum = warpReduceSum(val);

            if (tid == 0) {
                output[0] = finalSum;
            }
        }
    }

    torch::Tensor vector_sum_cuda(torch::Tensor input, torch::Tensor output) {
        TORCH_CHECK(input.device().is_cuda(), "Input must be a CUDA tensor");
        TORCH_CHECK(input.dim() == 1, "Input must be 1-dimensional");
        
        const int N = input.numel();
        
        if (N == 0) {
            output.fill_(0.0);
            return output;
        }

        const int blockSize = 256;
        const int numBlocks = min((N + blockSize - 1) / blockSize, 4096);
        
        // Allocate intermediate storage for block sums
        auto block_sums = torch::empty({numBlocks}, input.options());
        
        // Stage 1: Reduce input to per-block sums
        dim3 grid1(numBlocks);
        dim3 block1(blockSize);
        size_t shared_mem_size1 = (blockSize / 32) * sizeof(float);
        
        AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "vector_sum_kernel_stage1", ([&] {
            vector_sum_kernel_stage1<scalar_t><<<grid1, block1, shared_mem_size1>>>(
                input.data_ptr<scalar_t>(),
                block_sums.data_ptr<scalar_t>(),
                N
            );
        }));
        
        // Stage 2: Reduce block sums to final result (deterministic, no atomics)
        dim3 grid2(1);
        dim3 block2(blockSize);
        size_t shared_mem_size2 = (blockSize / 32) * sizeof(float);
        
        AT_DISPATCH_FLOATING_TYPES(input.scalar_type(), "vector_sum_kernel_stage2", ([&] {
            vector_sum_kernel_stage2<scalar_t><<<grid2, block2, shared_mem_size2>>>(
                block_sums.data_ptr<scalar_t>(),
                output.data_ptr<scalar_t>(),
                numBlocks
            );
        }));

        cudaError_t err = cudaGetLastError();
        if (err != cudaSuccess) {
            throw std::runtime_error(cudaGetErrorString(err));
        }

        return output;
    }
    """

    # C++ binding code
    cpp_source = """
    #include <torch/extension.h>
    torch::Tensor vector_sum_cuda(torch::Tensor input, torch::Tensor output);
    
    PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {
        m.def("vector_sum_cuda", &vector_sum_cuda, "Vector sum reduction (CUDA)");
    }
    """

    # Compile and load the CUDA extension
    module = load_inline(
        name='vector_sum_optimized',
        cpp_sources=cpp_source,
        cuda_sources=cuda_source,
        extra_cuda_cflags=['-arch=sm_89', '-O3', '--use_fast_math'],
        verbose=False
    )

    # Execute the kernel and return the result
    result = module.vector_sum_cuda(A, output_tensor)
    return result.squeeze()
scrolls · 214 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