call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n\ncpp_source = r'''\n#include <torch/extension.h>\ntorch::Tensor matmul64_forward(torch::Tensor A, torch::Tensor B);\n'''\n\ncuda_source = r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n\n#define BM 64\n#define BN 64\n#define BK 64\n\n__global__ __launch_bounds__(256, 2)\nvoid matmul64_kernel(const float* __restrict__ A, const float* __restrict__ B, float* __restrict__ C,\n int M, int N) {\n __shared__ float As[BM][BK];\n __shared__ float Bs[BK][BN];\n\n const int tx = threadIdx.x; // 0..15\n const int ty = threadIdx.y; // 0..15\n const int tid = ty * 16 + tx;\n const int block_m = blockIdx.y * BM;\n const int block_n = blockIdx.x * BN;\n\n // Load the full 64x64 A panel and 64x64 B panel.\n #pragma unroll\n for (int l = 0; l < BM*BK; l += 256) {\n int idx = l + tid;\n int r = idx >> 6;\n int k = idx & 63;\n As[r][k] = A[(block_m + r) * BK + k];\n }\n #pragma unroll\n for (int l = 0; l < BK*BN; l += 256) {\n int idx = l + tid;\n int k = idx >> 6;\n int c = idx & 63;\n Bs[k][c] = B[k * N + block_n + c];\n }\n __syncthreads();\n\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\n const int lr = ty * 4;\n const int lc = tx * 4;\n\n #pragma unroll\n for (int k = 0; k < BK; ++k) {\n float a0 = As[lr + 0][k];\n float a1 = As[lr + 1][k];\n float a2 = As[lr + 2][k];\n float a3 = As[lr + 3][k];\n float b0 = Bs[k][lc + 0];\n float b1 = Bs[k][lc + 1];\n float b2 = Bs[k][lc + 2];\n float b3 = Bs[k][lc + 3];\n acc00 = fmaf(a0, b0, acc00); acc01 = fmaf(a0, b1, acc01); acc02 = fmaf(a0, b2, acc02); acc03 = fmaf(a0, b3, acc03);\n acc10 = fmaf(a1, b0, acc10); acc11 = fmaf(a1, b1, acc11); acc12 = fmaf(a1, b2, acc12); acc13 = fmaf(a1, b3, acc13);\n acc20 = fmaf(a2, b0, acc20); acc21 = fmaf(a2, b1, acc21); acc22 = fmaf(a2, b2, acc22); acc23 = fmaf(a2, b3, acc23);\n acc30 = fmaf(a3, b0, acc30); acc31 = fmaf(a3, b1, acc31); acc32 = fmaf(a3, b2, acc32); acc33 = fmaf(a3, b3, acc33);\n }\n\n int row = block_m + lr;\n int col = block_n + lc;\n float* out = C + row * N + col;\n out[0] = acc00; out[1] = acc01; out[2] = acc02; out[3] = acc03;\n out += N;\n out[0] = acc10; out[1] = acc11; out[2] = acc12; out[3] = acc13;\n out += N;\n out[0] = acc20; out[1] = acc21; out[2] = acc22; out[3] = acc23;\n out += N;\n out[0] = acc30; out[1] = acc31; out[2] = acc32; out[3] = acc33;\n}\n\ntorch::Tensor matmul64_forward(torch::Tensor A, torch::Tensor B) {\n const int M = (int)A.size(0);\n const int N = (int)B.size(1);\n auto C = torch::empty({M, N}, A.options());\n dim3 block(16, 16);\n dim3 grid((N + BN - 1) / BN, (M + BM - 1) / BM);\n cudaStream_t stream = at::cuda::getCurrentCUDAStream();\n matmul64_kernel<<<grid, block, 0, stream>>>(A.data_ptr<float>(), B.data_ptr<float>(), C.data_ptr<float>(), M, N);\n return C;\n}\n'''\n\n_ext = load_inline(name='matmul64_ext_v1', cpp_sources=cpp_source, cuda_sources=cuda_source,\n functions=['matmul64_forward'], extra_cuda_cflags=['-O3', '--use_fast_math'], verbose=False)\n\nclass ModelNew(nn.Module):\n def __init__(self):\n super(ModelNew, self).__init__()\n def forward(self, A: torch.Tensor, B: torch.Tensor) -> torch.Tensor:\n return _ext.matmul64_forward(A, B)\n"
}