/* Unit tests for the resident-pipeline primitives (Inc.0). * Each primitive is checked against the exact CPU math from glm.c. * Build: nvcc backend_cuda.cu tests/test_pipe_cuda.cu -o pipe_test && ./pipe_test */ #include #include #include #include #include #include "../backend_cuda.h" static uint64_t rng=0x9E3779B97F4A7C15ULL; static float rndf(void){ rng^=rng<<13; rng^=rng>>7; rng^=rng<<17; return (float)((double)(rng>>11)/9007199254740992.0*2.0-1.0); } static void ref_rmsnorm(float *out,const float *x,const float *w,int D,float eps){ double ms=0; for(int i=0;i1.f?fabsf(b[i]):1.f; if(d/m>worst) worst=d/m; } printf(" %-14s max rel %.3e %s\n",what,worst,worst<=tol?"ok":"FAIL"); return worst<=tol; } int main(void){ int dev0=0; if(!coli_cuda_init(&dev0,1)){ puts("pipe tests: skipped (no CUDA device)"); return 0; } int ok=1; enum { S=7, D=6144, I=2048, R=64, H=4, QH=192 }; /* rmsnorm */ { float *x=(float*)malloc((size_t)S*D*4), *w=(float*)malloc(D*4); float *got=(float*)malloc((size_t)S*D*4), *ref=(float*)malloc((size_t)S*D*4); for(size_t i=0;i<(size_t)S*D;i++) x[i]=rndf()*3; for(int i=0;i