mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-12-26 19:34:35 +00:00
107 lines
2.6 KiB
Plaintext
107 lines
2.6 KiB
Plaintext
|
#version 450
|
||
|
|
||
|
#extension GL_EXT_shader_16bit_storage : require
|
||
|
|
||
|
layout (push_constant) uniform parameter
|
||
|
{
|
||
|
uint KX;
|
||
|
uint KY;
|
||
|
float scale;
|
||
|
float max_bias;
|
||
|
float m0;
|
||
|
float m1;
|
||
|
uint n_head_log2;
|
||
|
} p;
|
||
|
|
||
|
#include "types.comp"
|
||
|
|
||
|
#extension GL_EXT_control_flow_attributes : enable
|
||
|
#define BLOCK_SIZE 512
|
||
|
|
||
|
layout(local_size_x = BLOCK_SIZE, local_size_y = 1, local_size_z = 1) in;
|
||
|
|
||
|
layout (binding = 0) readonly buffer X {A_TYPE data_a[];};
|
||
|
layout (binding = 1) readonly buffer Y {B_TYPE data_b[];};
|
||
|
layout (binding = 2) buffer D {D_TYPE data_d[];};
|
||
|
|
||
|
shared FLOAT_TYPE vals[BLOCK_SIZE];
|
||
|
|
||
|
void main() {
|
||
|
const uint tid = gl_LocalInvocationID.x;
|
||
|
const uint rowx = gl_WorkGroupID.x;
|
||
|
const uint rowy = rowx % p.KY;
|
||
|
|
||
|
float slope = 1.0f;
|
||
|
|
||
|
// ALiBi
|
||
|
if (p.max_bias > 0.0f) {
|
||
|
const uint h = rowx/p.KY; // head index
|
||
|
|
||
|
const float base = h < p.n_head_log2 ? p.m0 : p.m1;
|
||
|
const uint exp = h < p.n_head_log2 ? h + 1 : 2*(h - p.n_head_log2) + 1;
|
||
|
|
||
|
slope = pow(base, exp);
|
||
|
}
|
||
|
|
||
|
// Find max
|
||
|
FLOAT_TYPE max_val = uintBitsToFloat(0xFF800000);
|
||
|
|
||
|
[[unroll]] for (uint col0 = 0; col0 < p.KX; col0 += BLOCK_SIZE) {
|
||
|
const uint col = col0 + tid;
|
||
|
|
||
|
if (col >= p.KX) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
max_val = max(max_val, FLOAT_TYPE(data_a[rowx * p.KX + col]) * p.scale + (p.KY > 0 ? slope * FLOAT_TYPE(data_b[rowy * p.KX + col]) : FLOAT_TYPE(0.0f)));
|
||
|
}
|
||
|
vals[tid] = max_val;
|
||
|
|
||
|
barrier();
|
||
|
[[unroll]] for (int s = BLOCK_SIZE / 2; s > 0; s >>= 1) {
|
||
|
if (tid < s) {
|
||
|
vals[tid] = max(vals[tid], vals[tid + s]);
|
||
|
}
|
||
|
barrier();
|
||
|
}
|
||
|
|
||
|
max_val = vals[0];
|
||
|
barrier();
|
||
|
|
||
|
// Sum up values
|
||
|
vals[tid] = FLOAT_TYPE(0.0f);
|
||
|
|
||
|
[[unroll]] for (uint col0 = 0; col0 < p.KX; col0 += BLOCK_SIZE) {
|
||
|
const uint col = col0 + tid;
|
||
|
|
||
|
if (col >= p.KX) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
const uint i = rowx * p.KX + col;
|
||
|
const FLOAT_TYPE val = exp(FLOAT_TYPE(data_a[i]) * p.scale + (p.KY > 0 ? slope * FLOAT_TYPE(data_b[rowy * p.KX + col]) : FLOAT_TYPE(0.0f)) - max_val);
|
||
|
vals[tid] += val;
|
||
|
data_d[i] = D_TYPE(val);
|
||
|
}
|
||
|
|
||
|
barrier();
|
||
|
[[unroll]] for (int s = BLOCK_SIZE / 2; s > 0; s >>= 1) {
|
||
|
if (tid < s) {
|
||
|
vals[tid] += vals[tid + s];
|
||
|
}
|
||
|
barrier();
|
||
|
}
|
||
|
|
||
|
const D_TYPE divisor = D_TYPE(vals[0]);
|
||
|
|
||
|
[[unroll]] for (uint col0 = 0; col0 < p.KX; col0 += BLOCK_SIZE) {
|
||
|
const uint col = col0 + tid;
|
||
|
|
||
|
if (col >= p.KX) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
data_d[rowx*p.KX + col] /= divisor;
|
||
|
}
|
||
|
}
|