| 4019 | sum += x[i].d * y[i].d * (float)vaddvq_s32(isum); |
| 4020 | } |
| 4021 | #else |
| 4022 | for (int i = 0; i < nb; i++) { |
| 4023 | int isum = 0; |
| 4024 | for (int j = 0; j < QK_K; j++) { |
| 4025 | isum += (int)x[i].qs[j] * (int)y[i].qs[j]; |
| 4026 | } |
| 4027 | sum += x[i].d * y[i].d * (float)isum; |
| 4028 | } |
| 4029 | #endif |
| 4030 | *s = sum; |
| 4031 | } |
| 4032 | |
| 4033 | static void ds4_vec_dot_q8_K_pair_q8_K( |
| 4034 | int n, float *s0, float *s1, |
| 4035 | const block_q8_K *x0, const block_q8_K *x1, |
| 4036 | const block_q8_K *y) { |
| 4037 | const int nb = n / QK_K; |
| 4038 | float sum0 = 0.0f; |
| 4039 | float sum1 = 0.0f; |
| 4040 | #if defined(__ARM_NEON) && defined(__ARM_FEATURE_DOTPROD) |
| 4041 | for (int i = 0; i < nb; i++) { |
| 4042 | int32x4_t isum0 = vdupq_n_s32(0); |
| 4043 | int32x4_t isum1 = vdupq_n_s32(0); |
| 4044 | for (int j = 0; j < QK_K; j += 16) { |
| 4045 | const int8x16_t yv = vld1q_s8(y[i].qs + j); |
| 4046 | isum0 = vdotq_s32(isum0, vld1q_s8(x0[i].qs + j), yv); |
| 4047 | isum1 = vdotq_s32(isum1, vld1q_s8(x1[i].qs + j), yv); |
| 4048 | } |
| 4049 | sum0 += x0[i].d * y[i].d * (float)vaddvq_s32(isum0); |
| 4050 | sum1 += x1[i].d * y[i].d * (float)vaddvq_s32(isum1); |
| 4051 | } |
| 4052 | #else |
| 4053 | for (int i = 0; i < nb; i++) { |
| 4054 | int isum0 = 0; |
| 4055 | int isum1 = 0; |
| 4056 | for (int j = 0; j < QK_K; j++) { |
| 4057 | const int yv = (int)y[i].qs[j]; |
| 4058 | isum0 += (int)x0[i].qs[j] * yv; |
| 4059 | isum1 += (int)x1[i].qs[j] * yv; |
| 4060 | } |
| 4061 | sum0 += x0[i].d * y[i].d * (float)isum0; |
| 4062 | sum1 += x1[i].d * y[i].d * (float)isum1; |
| 4063 | } |
| 4064 | #endif |
| 4065 | *s0 = sum0; |
| 4066 | *s1 = sum1; |
| 4067 | } |
| 4068 | |
| 4069 | static DS4_MAYBE_UNUSED void ds4_vec_dot_iq2_xxs_q8_K(int n, float *s, const block_iq2_xxs *x, const block_q8_K *y) { |
no test coverage detected