char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Jeff Bolzvulkan: fuse SSM_CONV + BIAS + SILU (#22653)3fbadb06d

char/aliceai-t5-moe
1.7 KiB60 linesraw
1#version 450
2
3#extension GL_EXT_control_flow_attributes : require
4
5#include "types.glsl"
6
7layout(constant_id = 0) const uint BLOCK_SIZE = 32;
8layout(constant_id = 1) const uint TOKENS_PER_WG = 16;
9layout(constant_id = 2) const bool APPLY_BIAS = false;
10layout(constant_id = 3) const bool APPLY_SILU = false;
11
12layout(local_size_x_id = 0, local_size_y_id = 1, local_size_z = 1) in;
13
14layout(binding = 0) readonly buffer Src0 { float src0[]; };
15layout(binding = 1) readonly buffer Src1 { float src1[]; };
16layout(binding = 2) readonly buffer Bias { float bias[]; };
17layout(binding = 3) buffer Dst { float dst[]; };
18
19layout(push_constant) uniform PushConstants {
20    uint nb01; uint nb02;
21    uint nb11;
22    uint dst_nb0; uint dst_nb1; uint dst_nb2;
23    uint nc; uint ncs; uint nr; uint n_t; uint n_s;
24};
25
26void main() {
27    const uint i1 = gl_GlobalInvocationID.x;
28    const uint i2 = gl_WorkGroupID.y * TOKENS_PER_WG + gl_LocalInvocationID.y;
29    const uint i3 = gl_WorkGroupID.z;
30
31    if (i1 >= nr || i2 >= n_t || i3 >= n_s) {
32        return;
33    }
34
35    const uint src0_base = i3 * (nb02 / 4) + i2 + i1 * (nb01 / 4);
36    const uint src1_base = i1 * (nb11 / 4);
37
38    float sum = 0.0;
39
40    if (nc == 4) {
41        sum = dot(
42            vec4(src0[src0_base], src0[src0_base + 1], src0[src0_base + 2], src0[src0_base + 3]),
43            vec4(src1[src1_base], src1[src1_base + 1], src1[src1_base + 2], src1[src1_base + 3])
44        );
45    } else {
46        [[unroll]] for (uint i0 = 0; i0 < nc; i0++) {
47            sum += src0[src0_base + i0] * src1[src1_base + i0];
48        }
49    }
50
51    if (APPLY_BIAS) {
52        sum += bias[i1];
53    }
54    if (APPLY_SILU) {
55        sum = sum / (1.0f + exp(-sum));
56    }
57
58    const uint dst_idx = i3 * (dst_nb2 / 4) + i2 * (dst_nb1 / 4) + i1;
59    dst[dst_idx] = sum;
60}