call → run_correctness
callrun_correctness
{
"kernel_code": "import torch\nimport torch.nn as nn\nfrom torch.utils.cpp_extension import load_inline\n_cpp = r'''\n#include <torch/extension.h>\n#include <vector>\nstd::vector<torch::Tensor> planar_forward(torch::Tensor z, std::vector<torch::Tensor> w_list, std::vector<torch::Tensor> u_list, std::vector<torch::Tensor> b_list);\n'''\n_src = r'''\n#include <torch/extension.h>\n#include <cuda.h>\n#include <cuda_runtime.h>\n#include <vector>\n#include <cmath>\n#include <c10/cuda/CUDAGuard.h>\n#include <ATen/cuda/CUDAContext.h>\nstatic __device__ __forceinline__ float warp_sum(float v){unsigned m=0xffffffffu; v=__fadd_rn(v,__shfl_down_sync(m,v,16)); v=__fadd_rn(v,__shfl_down_sync(m,v,8)); v=__fadd_rn(v,__shfl_down_sync(m,v,4)); v=__fadd_rn(v,__shfl_down_sync(m,v,2)); v=__fadd_rn(v,__shfl_down_sync(m,v,1)); return v;}\nstatic __device__ __forceinline__ float softplus_pt(float x){return x>20.0f?x:log1pf(expf(x));}\n__global__ __launch_bounds__(32,16) void planar_kernel(const float* __restrict__ zin,float* __restrict__ zout,float* __restrict__ ldo,const float* const* __restrict__ wps,const float* const* __restrict__ ups,const float* const* __restrict__ bps,int B,int D,int F){\n int row=blockIdx.x,lane=threadIdx.x; if(row>=B||lane>=D)return; float z=zin[row*D+lane]; float sld=0.f;\n #pragma unroll\n for(int f=0; f<8; ++f){ if(f>=F) break; const float* wv=wps[f]; const float* uv=ups[f]; float w=wv[lane], u=uv[lane];\n float wtu=warp_sum(__fmul_rn(w,u)); float w2=warp_sum(__fmul_rn(w,w)); float lin=__fadd_rn(warp_sum(__fmul_rn(z,w)), bps[f][0]);\n wtu=__shfl_sync(0xffffffffu,wtu,0); w2=__shfl_sync(0xffffffffu,w2,0); lin=__shfl_sync(0xffffffffu,lin,0);\n float m=__fadd_rn(-1.0f,softplus_pt(wtu)); float coeff=__fdividef(__fadd_rn(m,-wtu),w2); float uhat=__fadd_rn(u,__fmul_rn(coeff,w));\n float h=tanhf(lin); float hp=__fadd_rn(1.0f,-__fmul_rn(h,h)); z=__fadd_rn(z,__fmul_rn(uhat,h));\n float wu=warp_sum(__fmul_rn(w,uhat)); wu=__shfl_sync(0xffffffffu,wu,0); float val=__fadd_rn(1.0f,__fmul_rn(hp,wu)); if(lane==0) sld=__fadd_rn(sld,logf(__fadd_rn(fabsf(val),1.0e-8f)));\n }\n zout[row*D+lane]=z; if(lane==0) ldo[row]=sld;\n}\nstd::vector<torch::Tensor> planar_forward(torch::Tensor z,std::vector<torch::Tensor> w_list,std::vector<torch::Tensor> u_list,std::vector<torch::Tensor> b_list){\n const at::cuda::OptionalCUDAGuard device_guard(device_of(z)); int64_t B=z.size(0),D=z.size(1); int F=w_list.size(); auto out=torch::empty_like(z); auto ld=torch::empty({B},z.options());\n std::vector<const float*> hw(F),hu(F),hb(F); for(int i=0;i<F;++i){hw[i]=w_list[i].data_ptr<float>();hu[i]=u_list[i].data_ptr<float>();hb[i]=b_list[i].data_ptr<float>();}\n auto opts=torch::TensorOptions().device(z.device()).dtype(torch::kInt64); auto wp=torch::empty({F},opts),up=torch::empty({F},opts),bp=torch::empty({F},opts); auto stream=at::cuda::getCurrentCUDAStream();\n cudaMemcpyAsync(wp.data_ptr<int64_t>(),hw.data(),F*sizeof(const float*),cudaMemcpyHostToDevice,stream); cudaMemcpyAsync(up.data_ptr<int64_t>(),hu.data(),F*sizeof(const float*),cudaMemcpyHostToDevice,stream); cudaMemcpyAsync(bp.data_ptr<int64_t>(),hb.data(),F*sizeof(const float*),cudaMemcpyHostToDevice,stream);\n planar_kernel<<<(int)B,32,0,stream>>>(z.data_ptr<float>(),out.data_ptr<float>(),ld.data_ptr<float>(),reinterpret_cast<const float* const*>(wp.data_ptr<int64_t>()),reinterpret_cast<const float* const*>(up.data_ptr<int64_t>()),reinterpret_cast<const float* const*>(bp.data_ptr<int64_t>()),(int)B,(int)D,F); return {out,ld};}\n'''\n_ext=load_inline(name='planar_flow_ext_v3', cpp_sources=_cpp, cuda_sources=_src, functions=['planar_forward'], verbose=False, extra_cuda_cflags=['-O3','--fmad=false'], extra_cflags=['-O3'])\nclass ModelNew(nn.Module):\n def __init__(self, dim, num_flows):\n super().__init__(); self.dim=dim; self.num_flows=num_flows; self.w=nn.ParameterList([nn.Parameter(torch.randn(dim)) for _ in range(num_flows)]); self.u=nn.ParameterList([nn.Parameter(torch.randn(dim)) for _ in range(num_flows)]); self.b=nn.ParameterList([nn.Parameter(torch.zeros(1)) for _ in range(num_flows)])\n def forward(self,z:torch.Tensor)->tuple:\n return tuple(_ext.planar_forward(z,list(self.w),list(self.u),list(self.b)))\n"
}