call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\ncpp_src = r'''\n#include <torch/extension.h>\ntorch::Tensor tri_matmul_cuda(torch::Tensor A, torch::Tensor B);\ntorch::Tensor tri_matmul(torch::Tensor A, torch::Tensor B) { return tri_matmul_cuda(A, B); }\n'''\ncuda_src = r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#define BS 64\n#define TT 16\n#define RPT 4\n__global__ void tri_matmul_fp32_64_kernel(const float* __restrict__ A,const float* __restrict__ B,float* __restrict__ C,int N,int tiles){\n int tj=blockIdx.x, ti=blockIdx.y; if(ti>=tiles||tj>=tiles||ti<tj) return;\n int tx=threadIdx.x, ty=threadIdx.y, tid=ty*TT+tx;\n int row_base=ti*BS+ty, col_base=tj*BS+tx;\n __shared__ float As[BS][BS+1]; __shared__ float Bs[BS][BS+1];\n float c00=0,c01=0,c02=0,c03=0,c10=0,c11=0,c12=0,c13=0,c20=0,c21=0,c22=0,c23=0,c30=0,c31=0,c32=0,c33=0;\n int k0=tj*BS, k1=(ti+1)*BS;\n for(int kk=k0; kk<k1; kk+=BS){\n #pragma unroll\n for(int m=0;m<16;++m){\n int idx=tid + m*256; int r=idx>>6; int cc=idx&63;\n As[r][cc]=A[(ti*BS+r)*N + (kk+cc)];\n Bs[r][cc]=B[(kk+r)*N + (tj*BS+cc)];\n }\n __syncthreads();\n #pragma unroll\n for(int k=0;k<BS;++k){\n float a0=As[ty][k], a1=As[ty+16][k], a2=As[ty+32][k], a3=As[ty+48][k];\n float b0=Bs[k][tx], b1=Bs[k][tx+16], b2=Bs[k][tx+32], b3=Bs[k][tx+48];\n c00=fmaf(a0,b0,c00); c01=fmaf(a0,b1,c01); c02=fmaf(a0,b2,c02); c03=fmaf(a0,b3,c03);\n c10=fmaf(a1,b0,c10); c11=fmaf(a1,b1,c11); c12=fmaf(a1,b2,c12); c13=fmaf(a1,b3,c13);\n c20=fmaf(a2,b0,c20); c21=fmaf(a2,b1,c21); c22=fmaf(a2,b2,c22); c23=fmaf(a2,b3,c23);\n c30=fmaf(a3,b0,c30); c31=fmaf(a3,b1,c31); c32=fmaf(a3,b2,c32); c33=fmaf(a3,b3,c33);\n }\n __syncthreads();\n }\n float* p=C+row_base*N+col_base;\n p[0]=c00; p[16]=c01; p[32]=c02; p[48]=c03;\n p[16*N]=c10; p[16*N+16]=c11; p[16*N+32]=c12; p[16*N+48]=c13;\n p[32*N]=c20; p[32*N+16]=c21; p[32*N+32]=c22; p[32*N+48]=c23;\n p[48*N]=c30; p[48*N+16]=c31; p[48*N+32]=c32; p[48*N+48]=c33;\n}\ntorch::Tensor tri_matmul_cuda(torch::Tensor A, torch::Tensor B){\n TORCH_CHECK(A.is_cuda() && B.is_cuda(), \"cuda\"); TORCH_CHECK(A.scalar_type()==torch::kFloat32 && B.scalar_type()==torch::kFloat32,\"fp32\"); TORCH_CHECK(A.is_contiguous()&&B.is_contiguous(),\"contig\");\n int64_t N64=A.size(0); auto C=torch::empty({N64,N64},A.options()); cudaStream_t stream=at::cuda::getCurrentCUDAStream(); cudaMemsetAsync(C.data_ptr<float>(),0,(size_t)N64*(size_t)N64*sizeof(float),stream);\n int N=(int)N64; int tiles=(N+BS-1)/BS; dim3 grid(tiles,tiles); dim3 block(TT,TT); tri_matmul_fp32_64_kernel<<<grid,block,0,stream>>>(A.data_ptr<float>(),B.data_ptr<float>(),C.data_ptr<float>(),N,tiles); C10_CUDA_KERNEL_LAUNCH_CHECK(); return C;\n}\n'''\n_ext=load_inline(name='tri_matmul_fp32_ext_v3b', cpp_sources=cpp_src, cuda_sources=cuda_src, functions=['tri_matmul'], extra_cflags=['-O3'], extra_cuda_cflags=['-O3'], verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self): super(ModelNew,self).__init__()\n def forward(self,A,B): return _ext.tri_matmul(A,B)\n"
}