call → compile_kernel
callcompile_kernel
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n_cpp_src=r'''\n#include <torch/extension.h>\ntorch::Tensor opm_forward(torch::Tensor msa_repr, torch::Tensor msa_mask, torch::Tensor ln_w, torch::Tensor ln_b, torch::Tensor pa_w, torch::Tensor pa_b, torch::Tensor pb_w, torch::Tensor pb_b, torch::Tensor out_w, torch::Tensor out_b);\n'''\n_cuda_src=r'''\n#include <torch/extension.h>\n#include <ATen/cuda/CUDAContext.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <cublasLt.h>\n#define C 64\n#define H 32\n#define P 64\n#define S 8\n#define N 32\n#define BATCH 2\n#define KALL 1024\n#define MALL 2048\nstatic cublasLtHandle_t ltHandle = nullptr;\n__inline__ __device__ float warp_reduce_sum(float v){for(int o=16;o>0;o>>=1)v+=__shfl_down_sync(0xffffffff,v,o);return v;}\n__inline__ __device__ float block_reduce_sum(float v){__shared__ float shared[8];__shared__ float result;int lane=threadIdx.x&31,wid=threadIdx.x>>5;v=warp_reduce_sum(v);if(lane==0)shared[wid]=v;__syncthreads();v=(threadIdx.x<(blockDim.x>>5))?shared[lane]:0.0f;if(wid==0)v=warp_reduce_sum(v);if(threadIdx.x==0)result=v;__syncthreads();return result;}\n__global__ void project_kernel(const float* __restrict__ x,const float* __restrict__ ln_w,const float* __restrict__ ln_b,const float* __restrict__ pa_w,const float* __restrict__ pa_b,const float* __restrict__ pb_w,const float* __restrict__ pb_b,float* __restrict__ a,float* __restrict__ b){int row=blockIdx.x,tid=threadIdx.x;const float* xr=x+row*C;float sum=0;for(int c=tid;c<C;c+=blockDim.x)sum+=xr[c];float mean=block_reduce_sum(sum)*(1.0f/C);float ss=0;for(int c=tid;c<C;c+=blockDim.x){float d=xr[c]-mean;ss+=d*d;}float inv=rsqrtf(block_reduce_sum(ss)*(1.0f/C)+1e-5f);__shared__ float norm[C];for(int c=tid;c<C;c+=blockDim.x)norm[c]=(xr[c]-mean)*inv*ln_w[c]+ln_b[c];__syncthreads();if(tid<H){int h=tid;float va=pa_b[h],vb=pb_b[h];const float* wa=pa_w+h*C;const float* wb=pb_w+h*C;\n#pragma unroll\nfor(int c=0;c<C;++c){float nv=norm[c];va+=nv*wa[c];vb+=nv*wb[c];}a[row*H+h]=va;b[row*H+h]=vb;}}\n__global__ void outer_kernel(const float* __restrict__ a,const float* __restrict__ b,float* __restrict__ outer){int idx=blockIdx.x*blockDim.x+threadIdx.x;int total=BATCH*N*N*H*H;if(idx>=total)return;int t=idx;int k=t&(H-1);t>>=5;int h=t&(H-1);t>>=5;int j=t&(N-1);t>>=5;int i=t&(N-1);t>>=5;int bb=t;float acc=0;\n#pragma unroll\nfor(int s=0;s<S;++s){int base=(bb*S+s)*N;acc+=a[(base+i)*H+h]*b[(base+j)*H+k];}outer[idx]=acc*0.125f;}\ntorch::Tensor opm_forward(torch::Tensor msa_repr, torch::Tensor msa_mask, torch::Tensor ln_w, torch::Tensor ln_b, torch::Tensor pa_w, torch::Tensor pa_b, torch::Tensor pb_w, torch::Tensor pb_b, torch::Tensor out_w, torch::Tensor out_b){auto opts=msa_repr.options();auto a=torch::empty({BATCH*S*N,H},opts);auto bb=torch::empty({BATCH*S*N,H},opts);auto outer=torch::empty({BATCH*N*N,H*H},opts);auto out=torch::empty({BATCH,N,N,P},opts);cudaStream_t stream=at::cuda::getCurrentCUDAStream();project_kernel<<<BATCH*S*N,128,0,stream>>>(msa_repr.data_ptr<float>(),ln_w.data_ptr<float>(),ln_b.data_ptr<float>(),pa_w.data_ptr<float>(),pa_b.data_ptr<float>(),pb_w.data_ptr<float>(),pb_b.data_ptr<float>(),a.data_ptr<float>(),bb.data_ptr<float>());outer_kernel<<<(BATCH*N*N*H*H+255)/256,256,0,stream>>>(a.data_ptr<float>(),bb.data_ptr<float>(),outer.data_ptr<float>());if(ltHandle==nullptr)cublasLtCreate(<Handle);cublasLtMatmulDesc_t opDesc;cublasLtMatrixLayout_t aDesc,bDesc,cDesc; cublasOperation_t transa=CUBLAS_OP_T, transb=CUBLAS_OP_N; cublasComputeType_t computeType=CUBLAS_COMPUTE_32F; cublasLtMatmulDescCreate(&opDesc, computeType, CUDA_R_32F); cublasLtMatmulDescSetAttribute(opDesc,CUBLASLT_MATMUL_DESC_TRANSA,&transa,sizeof(transa)); cublasLtMatmulDescSetAttribute(opDesc,CUBLASLT_MATMUL_DESC_TRANSB,&transb,sizeof(transb)); cublasLtEpilogue_t epi=CUBLASLT_EPILOGUE_BIAS; cublasLtMatmulDescSetAttribute(opDesc,CUBLASLT_MATMUL_DESC_EPILOGUE,&epi,sizeof(epi)); const void* biasPtr=out_b.data_ptr<float>(); cublasLtMatmulDescSetAttribute(opDesc,CUBLASLT_MATMUL_DESC_BIAS_POINTER,&biasPtr,sizeof(biasPtr)); cublasLtMatrixLayoutCreate(&aDesc, CUDA_R_32F, KALL, P, KALL); cublasLtMatrixLayoutCreate(&bDesc, CUDA_R_32F, KALL, MALL, KALL); cublasLtMatrixLayoutCreate(&cDesc, CUDA_R_32F, P, MALL, P); float alpha=1.0f,beta=0.0f; cublasLtMatmul(ltHandle,opDesc,&alpha,out_w.data_ptr<float>(),aDesc,outer.data_ptr<float>(),bDesc,&beta,out.data_ptr<float>(),cDesc,out.data_ptr<float>(),cDesc,nullptr,nullptr,0,stream); cublasLtMatmulDescDestroy(opDesc); cublasLtMatrixLayoutDestroy(aDesc); cublasLtMatrixLayoutDestroy(bDesc); cublasLtMatrixLayoutDestroy(cDesc); return out;}\n'''\n_ext=load_inline(name='opm_cublaslt_v1',cpp_sources=_cpp_src,cuda_sources=_cuda_src,functions=['opm_forward'],extra_cuda_cflags=['-O3','--use_fast_math'],extra_cflags=['-O3'],verbose=False)\nclass ModelNew(nn.Module):\n def __init__(self,msa_dim,pair_dim,hidden_dim=32):\n super().__init__();self.layer_norm=nn.LayerNorm(msa_dim);self.proj_a=nn.Linear(msa_dim,hidden_dim);self.proj_b=nn.Linear(msa_dim,hidden_dim);self.out_proj=nn.Linear(hidden_dim*hidden_dim,pair_dim)\n def forward(self,msa_repr,msa_mask):\n return _ext.opm_forward(msa_repr.contiguous(),msa_mask.contiguous(),self.layer_norm.weight,self.layer_norm.bias,self.proj_a.weight,self.proj_a.bias,self.proj_b.weight,self.proj_b.bias,self.out_proj.weight,self.out_proj.bias)\n"
}