import { buildMiniCPMKernels, H, KV, VOCAB } from "./minicpm-kernels.js"; export function buildDSparkKernels(options) { const kernels = buildMiniCPMKernels({ ...options, weightFormat: "bf16", draft: true, }); kernels.attention = kernels.attention.replace( "let pos=step.position+token;", "let pos=step.position+step.count-1u;", ); const pre = `${options.subgroups ? "enable subgroups;" : ""}\nstruct Step{position:u32,count:u32,chunk:u32,chunks:u32};@group(0)@binding(0)varstep:Step;\n`; const bind = (i, name, type, mode = "read") => `@group(1)@binding(${i})var${name}:array<${type}>;\n`; kernels.capture = pre + bind(0, "x", "f32") + bind(1, "residual", "f32") + bind(2, "features", "f32", "read_write") + "@group(1)@binding(3)varslot:vec4;" + ` @compute @workgroup_size(256)fn main(@builtin(global_invocation_id)g:vec3){if(g.x<2048u&&g.y pre + bind(0, "input", "f32") + bind(1, "qNorm", "f32") + bind(2, "kNorm", "f32") + bind(3, "queries", "f32", "read_write") + bind(4, "keys", "f32", "read_write") + bind(5, "values", "f32", "read_write") + ` var red:array;var normalized:array; @compute @workgroup_size(128)fn main(@builtin(local_invocation_id)l:vec3,@builtin(workgroup_id)g:vec3){let d=l.x;let head=g.x;let t=g.y;let isQ=${context ? "false" : "head<16u"};let i=t*${context ? 512 : 2560}u+head*128u+d;let raw=input[i];red[d]=raw*raw;workgroupBarrier();for(var s=64u;s>0u;s>>=1u){if(d){if(l.x){let i=tokens[step.position]*256u+l.x;let w=weights[i>>1u];out[l.x]=bitcast(select(w<<16u,w&0xffff0000u,(i&1u)==1u));}`; kernels.addBias = pre + bind(0, "base", "f32") + bind(1, "bias", "f32") + bind(2, "out", "f32", "read_write") + `@compute @workgroup_size(256)fn main(@builtin(global_invocation_id)g:vec3){if(g.x<${VOCAB}u){out[g.x]=base[g.x]+bias[g.x];}}`; kernels.argmax = pre + bind(0, "logits", "f32") + bind(1, "out", "vec2", "read_write") + ` var val:array;var ids:array; @compute @workgroup_size(256)fn main(@builtin(local_invocation_id)l:vec3,@builtin(workgroup_id)g:vec3){var v=-3.402823e38;var id=0xffffffffu;for(var i=g.x*256u+l.x;i<${VOCAB}u;i+=32768u){let x=logits[i];if(x>v||(x==v&&i0u;s>>=1u){if(l.xval[l.x]||(val[o]==val[l.x]&&ids[o](bitcast(val[0]),ids[0]);}} `; kernels.argmaxFinal = pre + bind(0, "input", "vec2") + bind(1, "tokens", "u32", "read_write") + ` var val:array;var ids:array; @compute @workgroup_size(128)fn main(@builtin(local_invocation_id)l:vec3){val[l.x]=bitcast(input[l.x].x);ids[l.x]=input[l.x].y;workgroupBarrier();for(var s=64u;s>0u;s>>=1u){if(l.xval[l.x]||(val[o]==val[l.x]&&ids[o]