cera 0.5.5

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

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

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

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

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

@compute
@workgroup_size(256, 1, 1)
fn conv2d_direct(@builtin(global_invocation_id) gid_0 : vec3<u32>)
{
    var in_ch_0 : u32 = par_buf_0[i32(0)].x;
    var out_ch_0 : u32 = par_buf_0[i32(0)].y;
    var _S1 : u32 = par_buf_0[i32(0)].z;
    var _S2 : u32 = par_buf_0[i32(0)].w;
    var _S3 : u32 = par_buf_0[i32(1)].x;
    var _S4 : u32 = par_buf_0[i32(1)].y;
    var str_h_0 : u32 = par_buf_0[i32(1)].z;
    var str_w_0 : u32 = par_buf_0[i32(1)].w;
    var pad_h_0 : u32 = par_buf_0[i32(2)].x;
    var pad_w_0 : u32 = par_buf_0[i32(2)].y;
    var w_out_0 : u32 = par_buf_0[i32(2)].w;
    var groups_0 : u32 = par_buf_0[i32(3)].x;
    var plane_out_0 : u32 = par_buf_0[i32(2)].z * w_out_0;
    var idx_0 : u32 = gid_0.x;
    if(idx_0 >= (out_ch_0 * plane_out_0))
    {
        return;
    }
    var oc_0 : u32 = idx_0 / plane_out_0;
    var rem_0 : u32 = idx_0 - oc_0 * plane_out_0;
    var oh_0 : u32 = rem_0 / w_out_0;
    var ow_0 : u32 = rem_0 - oh_0 * w_out_0;
    var _S5 : u32 = in_ch_0 / groups_0;
    var out_per_group_0 : u32 = out_ch_0 / groups_0;
    var _S6 : u32 = oc_0 / out_per_group_0;
    var _S7 : i32 = i32(oh_0 * str_h_0) - i32(pad_h_0);
    var _S8 : i32 = i32(ow_0 * str_w_0) - i32(pad_w_0);
    var _S9 : f32 = bias_buf_0[oc_0];
    var ic_local_0 : u32 = u32(0);
    var acc_0 : f32 = _S9;
    for(;;)
    {
        if(ic_local_0 < _S5)
        {
        }
        else
        {
            break;
        }
        var _S10 : u32 = (oc_0 * _S5 + ic_local_0) * _S3 * _S4;
        var _S11 : u32 = (_S6 * _S5 + ic_local_0) * _S1 * _S2;
        var ki_0 : u32 = u32(0);
        var acc_1 : f32 = acc_0;
        for(;;)
        {
            if(ki_0 < _S3)
            {
            }
            else
            {
                break;
            }
            var ih_0 : i32 = _S7 + i32(ki_0);
            var _S12 : bool;
            if(ih_0 < i32(0))
            {
                _S12 = true;
            }
            else
            {
                _S12 = ih_0 >= i32(_S1);
            }
            var acc_2 : f32;
            if(_S12)
            {
                acc_2 = acc_1;
                ki_0 = ki_0 + u32(1);
                acc_1 = acc_2;
                continue;
            }
            var _S13 : u32 = _S11 + u32(ih_0) * _S2;
            var kj_0 : u32 = u32(0);
            acc_2 = acc_1;
            for(;;)
            {
                if(kj_0 < _S4)
                {
                }
                else
                {
                    break;
                }
                var iw_0 : i32 = _S8 + i32(kj_0);
                var _S14 : bool;
                if(iw_0 < i32(0))
                {
                    _S14 = true;
                }
                else
                {
                    _S14 = iw_0 >= i32(_S2);
                }
                if(_S14)
                {
                    kj_0 = kj_0 + u32(1);
                    continue;
                }
                acc_2 = acc_2 + w_buf_0[_S10 + ki_0 * _S4 + kj_0] * in_buf_0[_S13 + u32(iw_0)];
                kj_0 = kj_0 + u32(1);
            }
            ki_0 = ki_0 + u32(1);
            acc_1 = acc_2;
        }
        ic_local_0 = ic_local_0 + u32(1);
        acc_0 = acc_1;
    }
    out_buf_0[idx_0] = acc_0;
    return;
}