cera 0.5.0

Rust-native LLM inference engine
Documentation
#include <metal_stdlib>
#include <metal_math>
#include <metal_texture>
using namespace metal;

#line 49 "cera/src/backend/shaders/slang/conv1d.slang"
struct KernelContext_0
{
    uint device* par_buf_0;
    float device* rbuf_0;
    float device* w_buf_0;
    float device* in_buf_0;
    float device* out_buf_0;
};


#line 36
[[kernel]] void conv1d_depthwise(uint3 gid_0 [[thread_position_in_grid]], uint device* par_buf_1 [[buffer(4)]], float device* rbuf_1 [[buffer(1)]], float device* w_buf_1 [[buffer(2)]], float device* in_buf_1 [[buffer(0)]], float device* out_buf_1 [[buffer(3)]])
{

#line 36
    thread KernelContext_0 kernelContext_0;

#line 36
    (&kernelContext_0)->par_buf_0 = par_buf_1;

#line 36
    (&kernelContext_0)->rbuf_0 = rbuf_1;

#line 36
    (&kernelContext_0)->w_buf_0 = w_buf_1;

#line 36
    (&kernelContext_0)->in_buf_0 = in_buf_1;

#line 36
    (&kernelContext_0)->out_buf_0 = out_buf_1;
    uint ch_0 = gid_0.x;
    uint hs_0 = par_buf_1[int(0)];
    uint ks_0 = par_buf_1[int(1)];
    uint d_conv_0 = par_buf_1[int(2)];

    if(ch_0 >= hs_0)
    {

#line 43
        return;
    }

#line 43
    uint k_0 = 0U;

#line 43
    float sum_0 = 0.0f;

#line 48
    for(;;)
    {

#line 48
        if(k_0 < d_conv_0)
        {
        }
        else
        {

#line 48
            break;
        }

#line 49
        float sum_1 = sum_0 + *((&kernelContext_0)->rbuf_0+(k_0 * hs_0 + ch_0)) * (&kernelContext_0)->w_buf_0[ch_0 * ks_0 + k_0];

#line 48
        k_0 = k_0 + 1U;

#line 48
        sum_0 = sum_1;

#line 48
    }



    *((&kernelContext_0)->out_buf_0+ch_0) = sum_0 + (&kernelContext_0)->in_buf_0[ch_0] * (&kernelContext_0)->w_buf_0[ch_0 * ks_0 + d_conv_0];

#line 57
    if(d_conv_0 > 1U)
    {

#line 57
        k_0 = 0U;
        for(;;)
        {

#line 58
            if(k_0 < (d_conv_0 - 1U))
            {
            }
            else
            {

#line 58
                break;
            }

#line 59
            uint _S1 = k_0 + 1U;

#line 59
            *((&kernelContext_0)->rbuf_0+(k_0 * hs_0 + ch_0)) = *((&kernelContext_0)->rbuf_0+(_S1 * hs_0 + ch_0));

#line 58
            k_0 = _S1;

#line 58
        }

#line 57
    }

#line 62
    if(d_conv_0 > 0U)
    {

#line 63
        *((&kernelContext_0)->rbuf_0+((d_conv_0 - 1U) * hs_0 + ch_0)) = (&kernelContext_0)->in_buf_0[ch_0];

#line 62
    }


    return;
}