call → submit_kernel
callsubmit_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n_cuda_src = r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <cfloat>\n\n// Optimized for the benchmark shape [128,4096,4095], reducing dimension 1.\n// One block handles a contiguous tile of columns for one batch item. For each\n// row of the reduced dimension, lanes in a warp read contiguous columns, so all\n// global loads are coalesced although each output element is a strided reduce.\n__global__ void max_dim1_kernel(const float* __restrict__ x,\n float* __restrict__ y,\n int B, int D1, int D2) {\n int b = blockIdx.y;\n int j = blockIdx.x * blockDim.x + threadIdx.x;\n if (j >= D2 || b >= B) return;\n\n const float* p = x + ((long long)b * D1 * D2 + j);\n float m = -FLT_MAX;\n\n // D1 is 4096 in the target; unrolling improves ILP a bit while preserving\n // coalescing across the block for every row.\n int i = 0;\n #pragma unroll 4\n for (; i + 3 < D1; i += 4) {\n float v0 = p[(long long)(i + 0) * D2];\n float v1 = p[(long long)(i + 1) * D2];\n float v2 = p[(long long)(i + 2) * D2];\n float v3 = p[(long long)(i + 3) * D2];\n m = fmaxf(m, v0);\n m = fmaxf(m, v1);\n m = fmaxf(m, v2);\n m = fmaxf(m, v3);\n }\n for (; i < D1; ++i) {\n m = fmaxf(m, p[(long long)i * D2]);\n }\n y[(long long)b * D2 + j] = m;\n}\n\n// Contiguous last-dimension reduction. Included for completeness; not expected\n// for the provided initializer, but avoids relying on PyTorch fallbacks.\n__global__ void max_dim2_kernel(const float* __restrict__ x,\n float* __restrict__ y,\n int B, int D1, int D2) {\n int row = blockIdx.x; // row in flattened [B,D1]\n if (row >= B * D1) return;\n const float* p = x + (long long)row * D2;\n float m = -FLT_MAX;\n for (int k = threadIdx.x; k < D2; k += blockDim.x) m = fmaxf(m, p[k]);\n\n // block reduction in shared memory\n __shared__ float smem[256];\n smem[threadIdx.x] = m;\n __syncthreads();\n for (int s = blockDim.x >> 1; s > 32; s >>= 1) {\n if (threadIdx.x < s) smem[threadIdx.x] = fmaxf(smem[threadIdx.x], smem[threadIdx.x + s]);\n __syncthreads();\n }\n if (threadIdx.x < 32) {\n float v = smem[threadIdx.x];\n v = fmaxf(v, __shfl_down_sync(0xffffffff, v, 16));\n v = fmaxf(v, __shfl_down_sync(0xffffffff, v, 8));\n v = fmaxf(v, __shfl_down_sync(0xffffffff, v, 4));\n v = fmaxf(v, __shfl_down_sync(0xffffffff, v, 2));\n v = fmaxf(v, __shfl_down_sync(0xffffffff, v, 1));\n if (threadIdx.x == 0) y[row] = v;\n }\n}\n\n// Reduction over batch dimension for 3-D tensors.\n__global__ void max_dim0_kernel(const float* __restrict__ x,\n float* __restrict__ y,\n int B, int D1, int D2) {\n long long n = (long long)D1 * D2;\n long long idx = (long long)blockIdx.x * blockDim.x + threadIdx.x;\n if (idx >= n) return;\n float m = -FLT_MAX;\n for (int b = 0; b < B; ++b) {\n m = fmaxf(m, x[(long long)b * n + idx]);\n }\n y[idx] = m;\n}\n\ntorch::Tensor max_forward(torch::Tensor x, int64_t dim) {\n TORCH_CHECK(x.is_cuda(), \"x must be CUDA\");\n TORCH_CHECK(x.scalar_type() == torch::kFloat32, \"only float32 supported\");\n TORCH_CHECK(x.dim() == 3, \"only 3D tensors supported\");\n TORCH_CHECK(x.is_contiguous(), \"x must be contiguous\");\n int B = (int)x.size(0);\n int D1 = (int)x.size(1);\n int D2 = (int)x.size(2);\n if (dim < 0) dim += 3;\n\n cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n if (dim == 1) {\n auto y = torch::empty({B, D2}, x.options());\n int threads = 256;\n dim3 block(threads);\n dim3 grid((D2 + threads - 1) / threads, B);\n max_dim1_kernel<<<grid, block, 0, stream>>>(x.data_ptr<float>(), y.data_ptr<float>(), B, D1, D2);\n return y;\n } else if (dim == 2) {\n auto y = torch::empty({B, D1}, x.options());\n int threads = 256;\n max_dim2_kernel<<<B * D1, threads, 0, stream>>>(x.data_ptr<float>(), y.data_ptr<float>(), B, D1, D2);\n return y;\n } else { // dim == 0\n TORCH_CHECK(dim == 0, \"dim out of range\");\n auto y = torch::empty({D1, D2}, x.options());\n int threads = 256;\n long long n = (long long)D1 * D2;\n int grid = (int)((n + threads - 1) / threads);\n max_dim0_kernel<<<grid, threads, 0, stream>>>(x.data_ptr<float>(), y.data_ptr<float>(), B, D1, D2);\n return y;\n }\n}\n'''\n\n_ext = load_inline(\n name='max_reduce_dim1_ext_v1',\n cpp_sources='',\n cuda_sources=_cuda_src,\n functions=['max_forward'],\n extra_cuda_cflags=['-O3'],\n extra_cflags=['-O3'],\n verbose=False,\n)\n\nclass ModelNew(nn.Module):\n def __init__(self, dim: int):\n super(ModelNew, self).__init__()\n self.dim = dim\n\n def forward(self, x: torch.Tensor) -> torch.Tensor:\n return _ext.max_forward(x, self.dim)\n"
}