mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2024-12-27 03:44:35 +00:00
Update quantize_row_q4_0 for WASM
Untested
This commit is contained in:
parent
5d5f2b2efa
commit
b7e704658e
35
ggml.c
35
ggml.c
@ -949,24 +949,32 @@ static void quantize_row_q4_0(const float * restrict x, void * restrict vy, int
|
|||||||
}
|
}
|
||||||
#elif defined(__wasm_simd128__)
|
#elif defined(__wasm_simd128__)
|
||||||
for (int i = 0; i < nb; i++) {
|
for (int i = 0; i < nb; i++) {
|
||||||
float amax = 0.0f; // absolute max
|
float max = 0.0f;
|
||||||
|
float min = 0.0f;
|
||||||
|
|
||||||
v128_t srcv [8];
|
v128_t srcv [8];
|
||||||
v128_t asrcv[8];
|
v128_t maxv[8];
|
||||||
v128_t amaxv[8];
|
v128_t minv[8];
|
||||||
|
|
||||||
for (int l = 0; l < 8; l++) srcv[l] = wasm_v128_load(x + i*32 + 4*l);
|
for (int l = 0; l < 8; l++) srcv[l] = wasm_v128_load(x + i*32 + 4*l);
|
||||||
for (int l = 0; l < 8; l++) asrcv[l] = wasm_f32x4_abs(srcv[l]);
|
|
||||||
|
|
||||||
for (int l = 0; l < 4; l++) amaxv[2*l] = wasm_f32x4_max(asrcv[2*l], asrcv[2*l+1]);
|
for (int l = 0; l < 4; l++) maxv[2*l] = wasm_f32x4_max(srcv[2*l], srcv[2*l+1]);
|
||||||
for (int l = 0; l < 2; l++) amaxv[4*l] = wasm_f32x4_max(amaxv[4*l], amaxv[4*l+2]);
|
for (int l = 0; l < 2; l++) maxv[4*l] = wasm_f32x4_max(maxv[4*l], maxv[4*l+2]);
|
||||||
for (int l = 0; l < 1; l++) amaxv[8*l] = wasm_f32x4_max(amaxv[8*l], amaxv[8*l+4]);
|
for (int l = 0; l < 1; l++) maxv[8*l] = wasm_f32x4_max(maxv[8*l], maxv[8*l+4]);
|
||||||
|
|
||||||
amax = MAX(
|
for (int l = 0; l < 4; l++) minv[2*l] = wasm_f32x4_min(srcv[2*l], srcv[2*l+1]);
|
||||||
MAX(wasm_f32x4_extract_lane(amaxv[0], 0), wasm_f32x4_extract_lane(amaxv[0], 1)),
|
for (int l = 0; l < 2; l++) minv[4*l] = wasm_f32x4_min(minv[4*l], minv[4*l+2]);
|
||||||
MAX(wasm_f32x4_extract_lane(amaxv[0], 2), wasm_f32x4_extract_lane(amaxv[0], 3)));
|
for (int l = 0; l < 1; l++) minv[8*l] = wasm_f32x4_min(minv[8*l], minv[8*l+4]);
|
||||||
|
|
||||||
const float d = amax / ((1 << 3) - 1);
|
max = MAX(
|
||||||
|
MAX(wasm_f32x4_extract_lane(maxv[0], 0), wasm_f32x4_extract_lane(maxv[0], 1)),
|
||||||
|
MAX(wasm_f32x4_extract_lane(maxv[0], 2), wasm_f32x4_extract_lane(maxv[0], 3)));
|
||||||
|
min = MIN(
|
||||||
|
MIN(wasm_f32x4_extract_lane(minv[0], 0), wasm_f32x4_extract_lane(minv[0], 1)),
|
||||||
|
MIN(wasm_f32x4_extract_lane(minv[0], 2), wasm_f32x4_extract_lane(minv[0], 3)));
|
||||||
|
|
||||||
|
const float magnitude = max >= fabsf(min) ? max : min;
|
||||||
|
const float d = magnitude / -8;
|
||||||
const float id = d ? 1.0/d : 0.0;
|
const float id = d ? 1.0/d : 0.0;
|
||||||
|
|
||||||
y[i].d = d;
|
y[i].d = d;
|
||||||
@ -975,9 +983,10 @@ static void quantize_row_q4_0(const float * restrict x, void * restrict vy, int
|
|||||||
const v128_t v = wasm_f32x4_mul(srcv[l], wasm_f32x4_splat(id));
|
const v128_t v = wasm_f32x4_mul(srcv[l], wasm_f32x4_splat(id));
|
||||||
const v128_t vf = wasm_f32x4_add(v, wasm_f32x4_splat(8.5f));
|
const v128_t vf = wasm_f32x4_add(v, wasm_f32x4_splat(8.5f));
|
||||||
const v128_t vi = wasm_i32x4_trunc_sat_f32x4(vf);
|
const v128_t vi = wasm_i32x4_trunc_sat_f32x4(vf);
|
||||||
|
const v128_t vc = wasm_i32x4_min_u(vi, wasm_i32x4_splat(15));
|
||||||
|
|
||||||
y[i].qs[2*l + 0] = wasm_i32x4_extract_lane(vi, 0) | (wasm_i32x4_extract_lane(vi, 1) << 4);
|
y[i].qs[2*l + 0] = wasm_i32x4_extract_lane(vc, 0) | (wasm_i32x4_extract_lane(vc, 1) << 4);
|
||||||
y[i].qs[2*l + 1] = wasm_i32x4_extract_lane(vi, 2) | (wasm_i32x4_extract_lane(vi, 3) << 4);
|
y[i].qs[2*l + 1] = wasm_i32x4_extract_lane(vc, 2) | (wasm_i32x4_extract_lane(vc, 3) << 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
Loading…
Reference in New Issue
Block a user