cera 0.5.1

Rust-native LLM inference engine
Documentation
@binding(3) @group(0) var<storage, read> params_0 : array<vec4<u32>>;

@binding(1) @group(0) var<storage, read> sel_weight_0 : array<f32>;

@binding(0) @group(0) var<storage, read> z_0 : array<f32>;

@binding(2) @group(0) var<storage, read_write> out_buf_0 : array<f32>;

@compute
@workgroup_size(256, 1, 1)
fn moe_combine(@builtin(local_invocation_id) lid_0 : vec3<u32>, @builtin(workgroup_id) grp_0 : vec3<u32>)
{
    var hidden_0 : u32 = params_0[i32(0)].x;
    var _S1 : u32 = params_0[i32(0)].y;
    var n_tokens_0 : u32 = params_0[i32(0)].z;
    var accumulate_0 : bool = (params_0[i32(0)].w) != u32(0);
    var row_0 : u32 = grp_0.x * u32(256) + lid_0.x;
    var tok_0 : u32 = grp_0.y;
    var _S2 : bool;
    if(row_0 >= hidden_0)
    {
        _S2 = true;
    }
    else
    {
        _S2 = tok_0 >= n_tokens_0;
    }
    if(_S2)
    {
        return;
    }
    var s_0 : u32 = u32(0);
    var acc_0 : f32 = 0.0f;
    for(;;)
    {
        if(s_0 < _S1)
        {
        }
        else
        {
            break;
        }
        var entry_0 : u32 = tok_0 * _S1 + s_0;
        var acc_1 : f32 = acc_0 + sel_weight_0[entry_0] * z_0[entry_0 * hidden_0 + row_0];
        s_0 = s_0 + u32(1);
        acc_0 = acc_1;
    }
    var dst_0 : u32 = tok_0 * hidden_0 + row_0;
    if(accumulate_0)
    {
        acc_0 = out_buf_0[dst_0] + acc_0;
    }
    else
    {
    }
    out_buf_0[dst_0] = acc_0;
    return;
}