#version 450
#include "dequant_head.glsl"
layout (local_size_x = 256, local_size_y = 1, local_size_z = 1) in;
layout (binding = 0) readonly buffer A {block_tq1_0 data_a[];};
layout (binding = 1) writeonly buffer D {D_TYPE data_b[];};
void main() {
const uint i = gl_GlobalInvocationID.x * 4;
if (i >= p.nel) {
return;
}
const uint ib = i / QUANT_K_TQ1_0;
const float d = float(data_a[ib].d);
[[unroll]] for (uint j = 0; j < 4 && (i + j) < p.nel; ++j) {
const uint e = (i + j) % QUANT_K_TQ1_0;
const uint bidx = tq1_0_byte_of(e);
const uint qbyte = uint(bidx < 48u ? data_a[ib].qs[bidx]
: data_a[ib].qh[bidx - 48u]);
const uint xi = tq1_0_trit(qbyte, tq1_0_digit_of(e));
data_b[i + j] = D_TYPE(d * (float(xi) - 1.0f));
}
}