/* dragon.c — the streaming 560B engine (Phase 3a: native get_tensor + one layer via mmap). * Reads any weight from mmap'd shards by name (manifest bsearch), dequantizes bf16/fp8 on the fly. * Validates layer-0 (2f math, native reads) vs layer0_target.f32. * Build: gcc -O3 -fopenmp -D_GNU_SOURCE -o dragon dragon.c -lm */ #include #include #include #include #include #include #include #include #include #define HID 6144 #define T 5 #define NEXP_TOT 768 #define NR 512 /* ---- manifest ---- */ #pragma pack(push,1) typedef struct { char name[128]; int32_t shard, dt; int64_t off, d0, d1; int32_t sshard; int64_t soff; int32_t s0,s1; } Rec; #pragma pack(pop) static Rec* recs; static int nrec; static const uint8_t* shard_base[128]; static long shard_size[128]; static int nshard; static void load_manifest(void){ FILE* f=fopen("manifest.bin","rb"); if(!f){perror("manifest");exit(1);} fread(&nrec,4,1,f); recs=malloc((long)nrec*sizeof(Rec)); fread(recs,sizeof(Rec),nrec,f); fclose(f); FILE* s=fopen("shards.txt","r"); char line[1024]; while(fgets(line,sizeof line,s)){ line[strcspn(line,"\n")]=0; int fd=open(line,O_RDONLY); struct stat st; fstat(fd,&st); shard_base[nshard]=mmap(NULL,st.st_size,PROT_READ,MAP_PRIVATE,fd,0); if(shard_base[nshard]==MAP_FAILED){perror(line);exit(1);} shard_size[nshard]=st.st_size; close(fd); nshard++; } fclose(s); fprintf(stderr,"manifest: %d tensors, %d shards mmapped\n",nrec,nshard); } static Rec* find(const char* nm){ int lo=0,hi=nrec-1; while(lo<=hi){int m=(lo+hi)/2;int c=strcmp(recs[m].name,nm);if(c==0)return &recs[m];if(c<0)lo=m+1;else hi=m-1;} fprintf(stderr,"MISSING tensor: %s\n",nm); exit(2); } static float bf16f(uint16_t b){uint32_t u=((uint32_t)b)<<16;float f;memcpy(&f,&u,4);return f;} static float e4m3f(uint8_t b){int s=(b>>7)&1,e=(b>>3)&0xF,m=b&7;float v;if(e==0xF&&m==7)return NAN;if(e==0)v=ldexpf(m/8.0f,-6);else v=ldexpf(1.0f+m/8.0f,e-7);return s?-v:v;} /* dequant tensor into out (float), returns d0,d1 */ static void get_tensor(const char* nm, float* out, long* pd0, long* pd1){ Rec* r=find(nm); long d0=r->d0,d1=r->d1; *pd0=d0;*pd1=d1; const uint8_t* p=shard_base[r->shard]+r->off; if(r->dt==0){ const uint16_t* w=(const uint16_t*)p; for(long i=0;idt==1){ memcpy(out,p,d0*d1*4); } else { /* fp8 + 128x128 block scale */ const float* sc=(const float*)(shard_base[r->sshard]+r->soff); long s1=r->s1; #pragma omp parallel for for(long i=0;imx)mx=sc[ki];}double sm=0;for(int ki=0;ki<=qi;ki++){sc[ki]=expf(sc[ki]-mx);sm+=sc[ki];}for(int d=0;dmx)mx=lg[i];double sm=0;float sf[NEXP_TOT];for(int i=0;ibv){bv=ch[i];bi=i;}}idx[j]=bi;} for(int j=0;j<12;j++){int e=idx[j];float w=sf[e]*6.0f; if(e>=NR){for(int i=0;i1?atoi(argv[1]):1; load_manifest(); float* x=Lf("embed_out",(long)T*HID); float* cosT=Lf("mla_cos",(long)T*ROPE),*sinT=Lf("mla_sin",(long)T*ROPE); for(int L=0;Ldm)dm=dd;} printf("PHASE 3a (native mmap layer-0) max diff vs Python: %.3e\nVERDICT: %s\n",dm,dm<0.1?"PASS":"FAIL"); } if(NLAYERS>=28){ long a,b; float nw[HID]; get_tensor("model.norm.weight",nw,&a,&b); float last[HID]; rmsn(x+(long)(T-1)*HID,nw,last,HID); /* final norm on last token */ /* lm_head [131072,6144] bf16 — stream row by row, track top-5 */ Rec* r=find("lm_head.weight"); long V=r->d0; const uint16_t* w=(const uint16_t*)(shard_base[r->shard]+r->off); fprintf(stderr,"lm_head V=%ld, streaming argmax...\n",V); float top[5]; int tid[5]; for(int i=0;i<5;i++){top[i]=-1e30f;tid[i]=-1;} #pragma omp parallel { float lt[5]; int li[5]; for(int i=0;i<5;i++){lt[i]=-1e30f;li[i]=-1;} #pragma omp for for(long v=0;vlt[i]){ for(int j=4;j>i;j--){lt[j]=lt[j-1];li[j]=li[j-1];} lt[i]=f;li[i]=v; break; } } #pragma omp critical { for(int i=0;i<5;i++) for(int j=0;j<5;j++) if(lt[i]>top[j]){ for(int m=4;m>j;m--){top[m]=top[m-1];tid[m]=tid[m-1];} top[j]=lt[i];tid[j]=li[i]; break; } } } printf("\n===== dragon.c FULL FORWARD — top-5 next token IDs =====\n"); for(int i=0;i<5;i++) printf(" id %d logit %.2f\n",tid[i],top[i]); } return 0; }