char-fork/llama.cpp

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

Todor Boinovskihexagon: rope updates (#28628)6d9c82ea2

char/aliceai-t5-moe
3.5 KiB78 linesraw
1#ifndef HVX_SIN_COS_H
2#define HVX_SIN_COS_H
3
4#include "hvx-base.h"
5#include "hvx-floor.h"
6
7// Range-reduce x to y in [-pi/2, pi/2] and the quadrant sign (-1)^n.
8// Floor/truncate need IEEE bits, so convert qf32 back to sf before them.
9static inline void hvx_vec_sincos_reduce_f32(HVX_Vector x, HVX_Vector * y, HVX_Vector * sign) {
10    HVX_Vector const_inv_pi  = hvx_vec_splat_f32(0.3183098861837907f);
11    HVX_Vector const_half    = hvx_vec_splat_f32(0.5f);
12    HVX_Vector const_pi      = hvx_vec_splat_f32(3.141592653589793f);
13    HVX_Vector const_one     = hvx_vec_splat_f32(1.0f);
14    HVX_Vector const_neg_one = hvx_vec_splat_f32(-1.0f);
15    HVX_Vector const_one_i   = Q6_V_vsplat_R(1);
16
17    HVX_Vector x_over_pi = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(x, const_inv_pi));
18    x_over_pi = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(x_over_pi, const_half));
19
20    HVX_Vector n_float = hvx_vec_floor_f32(x_over_pi);
21    HVX_Vector n_int   = hvx_vec_truncate_f32(n_float);
22
23    HVX_Vector n_pi = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(n_float, const_pi));
24    *y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vsub_VsfVsf(x, n_pi));
25
26    HVX_VectorPred is_odd = Q6_Q_vcmp_eq_VwVw(Q6_V_vand_VV(n_int, const_one_i), const_one_i);
27    *sign = Q6_V_vmux_QVV(is_odd, const_neg_one, const_one);
28}
29
30static inline void hvx_vec_sincos_f32(HVX_Vector x, HVX_Vector * vcos, HVX_Vector * vsin) {
31    HVX_Vector y;
32    HVX_Vector sign;
33    hvx_vec_sincos_reduce_f32(x, &y, &sign);
34
35    HVX_Vector z = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(y, y));
36
37    HVX_Vector c4 = hvx_vec_splat_f32(2.3557242013849433e-05f);
38    HVX_Vector c3 = hvx_vec_splat_f32(-0.0013871428263450528f);
39    HVX_Vector c2 = hvx_vec_splat_f32(0.041665895266688284f);
40    HVX_Vector c1 = hvx_vec_splat_f32(-0.4999999360426369f);
41    HVX_Vector c0 = hvx_vec_splat_f32(0.9999999999071725f);
42
43    HVX_Vector cos_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(c3, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, c4))));
44    cos_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(c2, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, cos_y))));
45    cos_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(c1, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, cos_y))));
46    cos_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(c0, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, cos_y))));
47
48    HVX_Vector s4 = hvx_vec_splat_f32(2.642186986152672e-06f);
49    HVX_Vector s3 = hvx_vec_splat_f32(-0.00019825318964070864f);
50    HVX_Vector s2 = hvx_vec_splat_f32(0.00833326283319605f);
51    HVX_Vector s1 = hvx_vec_splat_f32(-0.16666666082087775f);
52    HVX_Vector s0 = hvx_vec_splat_f32(0.999999999915155f);
53
54    HVX_Vector sin_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(s3, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, s4))));
55    sin_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(s2, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, sin_y))));
56    sin_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(s1, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, sin_y))));
57    sin_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vadd_VsfVsf(s0, Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(z, sin_y))));
58    sin_y = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(y, sin_y));
59
60    *vcos = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(cos_y, sign));
61    *vsin = Q6_Vsf_equals_Vqf32(Q6_Vqf32_vmpy_VsfVsf(sin_y, sign));
62}
63
64static inline HVX_Vector hvx_vec_cos_f32(HVX_Vector x) {
65    HVX_Vector vcos;
66    HVX_Vector vsin;
67    hvx_vec_sincos_f32(x, &vcos, &vsin);
68    return vcos;
69}
70
71static inline HVX_Vector hvx_vec_sin_f32(HVX_Vector x) {
72    HVX_Vector vcos;
73    HVX_Vector vsin;
74    hvx_vec_sincos_f32(x, &vcos, &vsin);
75    return vsin;
76}
77
78#endif /* HVX_SIN_COS_H */