summaryrefslogtreecommitdiff
path: root/ggml/src/vulkan-shaders/rope_norm.comp
blob: 4ad35e549d77fa9db0317f6caa4b4427089336ed (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#version 450

#include "rope_head.comp"

void main() {
    const uint i0 = 2*gl_GlobalInvocationID.y;
    uint ne0 = p.ncols;
    uint ne1 = p.p_delta_rows;

    if (i0 >= ne0) {
        return;
    }

    const uint row_dst = gl_GlobalInvocationID.x;

    if (i0 >= p.n_dims) {
        const uint i = row_dst*ne0 + i0;

        data_d[i + 0] = data_a[i + 0];
        data_d[i + 1] = data_a[i + 1];

        return;
    }

    const uint row_x     = row_dst % ne1;
    const uint channel_x = row_dst / ne1;

    const uint idst = row_dst*ne0 + i0;
    const uint ix   = channel_x*p.s2 + row_x*p.s1 + i0;

    const float theta_base = data_pos[channel_x] * pow(p.theta_scale, i0/2.0f);

    const float freq_factor = p.has_ff != 0 ? data_ff[i0/2] : 1.0f;

    float cos_theta, sin_theta;
    rope_yarn(theta_base / freq_factor, i0, cos_theta, sin_theta);

    const float x0 = float(data_a[ix + 0]);
    const float x1 = float(data_a[ix + 1]);

    data_d[idst + 0] = D_TYPE(x0*cos_theta - x1*sin_theta);
    data_d[idst + 1] = D_TYPE(x0*sin_theta + x1*cos_theta);
}