call → submit_kernel
callsubmit_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\n\n_cpp_src = r'''\n#include <torch/extension.h>\n\ntorch::Tensor matmul_forward(torch::Tensor A, torch::Tensor B);\n'''\n\n_cuda_src = r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n\n// Specialized SGEMM for A[M,32] @ B[32,N]. Each block computes a 128x128\n// output tile. A warp owns an 8x128 strip; every thread computes 8 rows x\n// 4 columns (columns are interleaved by warp lane for conflict-free shared\n// memory accesses and coalesced global stores).\n__global__ __launch_bounds__(512, 2)\nvoid matmul_k32_128x128_kernel(const float* __restrict__ A,\n const float* __restrict__ B,\n float* __restrict__ C,\n int M, int K, int N) {\n __shared__ float As[128][32];\n __shared__ float Bs[32][128];\n\n const int tx = threadIdx.x; // 0..31\n const int ty = threadIdx.y; // 0..15\n const int tid = ty * 32 + tx;\n\n const int block_row = blockIdx.y * 128;\n const int block_col = blockIdx.x * 128;\n\n // Load A tile, padding K<32 or boundary rows with zero.\n #pragma unroll\n for (int idx = tid; idx < 128 * 32; idx += 512) {\n int r = idx >> 5; // /32\n int k = idx & 31; // %32\n int gr = block_row + r;\n float v = 0.0f;\n if (gr < M && k < K) v = A[(long long)gr * K + k];\n As[r][k] = v;\n }\n\n // Load B tile, padding K<32 or boundary columns with zero.\n #pragma unroll\n for (int idx = tid; idx < 32 * 128; idx += 512) {\n int k = idx >> 7; // /128\n int c = idx & 127; // %128\n int gc = block_col + c;\n float v = 0.0f;\n if (k < K && gc < N) v = B[(long long)k * N + gc];\n Bs[k][c] = v;\n }\n\n __syncthreads();\n\n const int lr0 = ty * 8;\n const int c0 = tx;\n const int c1 = tx + 32;\n const int c2 = tx + 64;\n const int c3 = tx + 96;\n\n float a;\n float acc00=0.f, acc01=0.f, acc02=0.f, acc03=0.f;\n float acc10=0.f, acc11=0.f, acc12=0.f, acc13=0.f;\n float acc20=0.f, acc21=0.f, acc22=0.f, acc23=0.f;\n float acc30=0.f, acc31=0.f, acc32=0.f, acc33=0.f;\n float acc40=0.f, acc41=0.f, acc42=0.f, acc43=0.f;\n float acc50=0.f, acc51=0.f, acc52=0.f, acc53=0.f;\n float acc60=0.f, acc61=0.f, acc62=0.f, acc63=0.f;\n float acc70=0.f, acc71=0.f, acc72=0.f, acc73=0.f;\n\n #pragma unroll\n for (int k = 0; k < 32; ++k) {\n float b0 = Bs[k][c0];\n float b1 = Bs[k][c1];\n float b2 = Bs[k][c2];\n float b3 = Bs[k][c3];\n\n a = As[lr0 + 0][k];\n acc00 = fmaf(a, b0, acc00); acc01 = fmaf(a, b1, acc01); acc02 = fmaf(a, b2, acc02); acc03 = fmaf(a, b3, acc03);\n a = As[lr0 + 1][k];\n acc10 = fmaf(a, b0, acc10); acc11 = fmaf(a, b1, acc11); acc12 = fmaf(a, b2, acc12); acc13 = fmaf(a, b3, acc13);\n a = As[lr0 + 2][k];\n acc20 = fmaf(a, b0, acc20); acc21 = fmaf(a, b1, acc21); acc22 = fmaf(a, b2, acc22); acc23 = fmaf(a, b3, acc23);\n a = As[lr0 + 3][k];\n acc30 = fmaf(a, b0, acc30); acc31 = fmaf(a, b1, acc31); acc32 = fmaf(a, b2, acc32); acc33 = fmaf(a, b3, acc33);\n a = As[lr0 + 4][k];\n acc40 = fmaf(a, b0, acc40); acc41 = fmaf(a, b1, acc41); acc42 = fmaf(a, b2, acc42); acc43 = fmaf(a, b3, acc43);\n a = As[lr0 + 5][k];\n acc50 = fmaf(a, b0, acc50); acc51 = fmaf(a, b1, acc51); acc52 = fmaf(a, b2, acc52); acc53 = fmaf(a, b3, acc53);\n a = As[lr0 + 6][k];\n acc60 = fmaf(a, b0, acc60); acc61 = fmaf(a, b1, acc61); acc62 = fmaf(a, b2, acc62); acc63 = fmaf(a, b3, acc63);\n a = As[lr0 + 7][k];\n acc70 = fmaf(a, b0, acc70); acc71 = fmaf(a, b1, acc71); acc72 = fmaf(a, b2, acc72); acc73 = fmaf(a, b3, acc73);\n }\n\n const int gr0 = block_row + lr0;\n const int gc0 = block_col + c0;\n const int gc1 = block_col + c1;\n const int gc2 = block_col + c2;\n const int gc3 = block_col + c3;\n\n#define STORE_ROW(ii, a0,a1,a2,a3) do { \\\n int rr = gr0 + (ii); \\\n if (rr < M) { \\\n long long base = (long long)rr * N; \\\n if (gc0 < N) C[base + gc0] = (a0); \\\n if (gc1 < N) C[base + gc1] = (a1); \\\n if (gc2 < N) C[base + gc2] = (a2); \\\n if (gc3 < N) C[base + gc3] = (a3); \\\n } \\\n } while (0)\n\n STORE_ROW(0, acc00, acc01, acc02, acc03);\n STORE_ROW(1, acc10, acc11, acc12, acc13);\n STORE_ROW(2, acc20, acc21, acc22, acc23);\n STORE_ROW(3, acc30, acc31, acc32, acc33);\n STORE_ROW(4, acc40, acc41, acc42, acc43);\n STORE_ROW(5, acc50, acc51, acc52, acc53);\n STORE_ROW(6, acc60, acc61, acc62, acc63);\n STORE_ROW(7, acc70, acc71, acc72, acc73);\n#undef STORE_ROW\n}\n\ntorch::Tensor matmul_forward(torch::Tensor A, torch::Tensor B) {\n const int M = (int)A.size(0);\n const int K = (int)A.size(1);\n const int N = (int)B.size(1);\n auto C = torch::empty({M, N}, A.options());\n\n dim3 block(32, 16, 1);\n dim3 grid((N + 127) / 128, (M + 127) / 128, 1);\n matmul_k32_128x128_kernel<<<grid, block>>>(\n A.data_ptr<float>(), B.data_ptr<float>(), C.data_ptr<float>(), M, K, N);\n return C;\n}\n'''\n\n_ext = load_inline(\n name='skinny_k32_matmul_ext_v1',\n cpp_sources=_cpp_src,\n cuda_sources=_cuda_src,\n functions=['matmul_forward'],\n extra_cflags=['-O3'],\n extra_cuda_cflags=['-O3', '--use_fast_math'],\n verbose=False,\n)\n\n\nclass ModelNew(nn.Module):\n def __init__(self):\n super(ModelNew, self).__init__()\n\n def forward(self, A, B):\n return _ext.matmul_forward(A, B)\n"
}