10 const void *A,
const void *B,
const float *bias,
float *
C,
12#if !defined(CK_TARGET_ARM)
20 const void *A,
const void *B,
const float *bias,
float *
C,
23 const void *A,
const void *B,
const float *bias,
float *
C,
39 if (!input || !output || rows <= 0 || streams <= 0 || hidden_dim <= 0) {
42 for (
int row = 0; row < rows; ++row) {
43 const float *src = input + (size_t)row * (
size_t)hidden_dim;
44 float *dst = output + (size_t)row * (
size_t)streams * (size_t)hidden_dim;
45 for (
int stream = 0; stream < streams; ++stream) {
46 for (
int col = 0; col < hidden_dim; ++col) {
47 dst[(size_t)stream * (
size_t)hidden_dim + (size_t)col] = src[col];
58 if (!input || !output || rows <= 0 || streams <= 0 || hidden_dim <= 0) {
61 for (
int row = 0; row < rows; ++row) {
62 const float *src = input + (size_t)row * (
size_t)hidden_dim;
63 float *dst = output + (size_t)row * (
size_t)streams * (size_t)hidden_dim;
64 for (
int stream = 0; stream < streams; ++stream) {
65 for (
int col = 0; col < hidden_dim; ++col) {
66 dst[(size_t)stream * (
size_t)hidden_dim + (size_t)col] =
74 const float *norm_weight,
75 const uint16_t *mix_down_weight,
76 const uint16_t *mix_up_weight,
77 const uint16_t *inject_weight,
79 float *injection_output,
80 float *normalized_scratch,
81 float *dynamic_scratch,
89 if (!hyper_input || !norm_weight || !mix_down_weight || !mix_up_weight ||
90 !mixed_output || !normalized_scratch || !dynamic_scratch || !mix_scratch ||
91 rows <= 0 || streams <= 0 || hidden_dim <= 0 || dynamic_dim <= 0) {
94 if (emit_injection && (!inject_weight || !injection_output)) {
98 const int hyper_dim = streams * hidden_dim;
99 const float inv_streams = 1.0f / (float)streams;
101 for (
int row = 0; row < rows; ++row) {
102 const float *input_row =
103 hyper_input + (size_t)row * (
size_t)hyper_dim;
105 normalized_scratch + (size_t)row * (
size_t)hyper_dim;
107 dynamic_scratch + (size_t)row * (
size_t)dynamic_dim;
108 float *mix_row = mix_scratch + (size_t)row * (
size_t)hyper_dim;
110 for (
int stream = 0; stream < streams; ++stream) {
111 const int base = stream * hidden_dim;
124 for (
int out = 0; out < dynamic_dim; ++out) {
125 const uint16_t *weight_row =
126 mix_down_weight + (size_t)out * (
size_t)hyper_dim;
128 for (
int col = 0; col < hyper_dim; ++col) {
133 projected / (1.0f + expf(-projected)));
136 for (
int out = 0; out < hyper_dim; ++out) {
137 const uint16_t *weight_row =
138 mix_up_weight + (size_t)out * (
size_t)dynamic_dim;
140 for (
int col = 0; col < dynamic_dim; ++col) {
147 mixed_output + (size_t)row * (
size_t)hidden_dim;
148 for (
int col = 0; col < hidden_dim; ++col) {
150 for (
int stream = 0; stream < streams; ++stream) {
151 const int index = stream * hidden_dim + col;
157 if (emit_injection) {
158 float *injection_row =
159 injection_output + (size_t)row * (
size_t)streams;
160 for (
int stream = 0; stream < streams; ++stream) {
161 const uint16_t *weight_row =
162 inject_weight + (size_t)stream * (
size_t)hyper_dim;
164 for (
int col = 0; col < hyper_dim; ++col) {
175 const void *,
const void *,
const float *,
float *, int, int, int);
185 if (!input || !weight || !output || rows <= 0 || output_dim <= 0 ||
186 input_dim <= 0 || input_dim %
QK_K != 0) {
190 const size_t input_row_bytes =
192 for (
int row = 0; row < rows; ++row) {
193 float *output_row = output + (size_t)row * (
size_t)output_dim;
194 const void *input_row =
195 (
const uint8_t *)input + (
size_t)row * input_row_bytes;
196#if defined(CK_TARGET_ARM)
201 output_row, weight, input_row, output_dim, input_dim);
203 for (
int col = 0; col < output_dim; ++col) {
204 output_row[col] += bias[col];
211 const float *norm_weight,
212 const void *mix_down_weight,
213 const void *mix_up_weight,
214 const void *inject_weight,
216 float *injection_output,
217 float *normalized_scratch,
218 float *dynamic_scratch,
228 if (!hyper_input || !norm_weight || !mix_down_weight || !mix_up_weight ||
229 !mixed_output || !normalized_scratch || !dynamic_scratch || !mix_scratch ||
230 !injection_gemm || !down_gemm || rows <= 0 || streams <= 0 || hidden_dim <= 0 ||
234 if (emit_injection && (!inject_weight || !injection_output)) {
238 const int hyper_dim = streams * hidden_dim;
239 const float inv_streams = 1.0f / (float)streams;
240 if (hyper_dim %
QK_K != 0 || dynamic_dim %
QK8_0 != 0) {
244 const size_t normalized_q8_row_bytes =
246 const size_t dynamic_q8_row_bytes =
251 for (
int row = 0; row < rows; ++row) {
252 const float *input_row = hyper_input + (size_t)row * (
size_t)hyper_dim;
253 float *norm_row = normalized_scratch + (size_t)row * (
size_t)hyper_dim;
254 for (
int stream = 0; stream < streams; ++stream) {
255 const int base = stream * hidden_dim;
257 for (
int col = 0; col < hidden_dim; ++col) {
258 const float value = input_row[base + col];
259 sum_sq += (double)(value * value);
261 const float mean = (float)(sum_sq / (
double)hidden_dim);
262 const float rstd = 1.0f / sqrtf(mean + eps);
263 for (
int col = 0; col < hidden_dim; ++col) {
264 const int index = base + col;
265 norm_row[index] = input_row[index] * rstd * norm_weight[index];
271 (uint8_t *)normalized_q8 + (
size_t)row * normalized_q8_row_bytes,
284 if (emit_injection) {
293 for (
int row = 0; row < rows; ++row) {
294 float *injection_row = injection_output + (size_t)row * (
size_t)streams;
295 for (
int stream = 0; stream < streams; ++stream) {
296 injection_row[stream] *= inv_streams;
299 injection_row, injection_row, 1, streams);
300 for (
int stream = 0; stream < streams; ++stream) {
301 injection_row[stream] *= 2.0f;
306 for (
int row = 0; row < rows; ++row) {
307 float *dynamic_row = dynamic_scratch + (size_t)row * (
size_t)dynamic_dim;
308 for (
int col = 0; col < dynamic_dim; ++col) {
309 dynamic_row[col] *= inv_streams;
312 dynamic_row, dynamic_row, 1, dynamic_dim);
316 (uint8_t *)dynamic_scratch + (
size_t)row * dynamic_q8_row_bytes,
318 dynamic_q8_row_bytes);
330 for (
int row = 0; row < rows; ++row) {
331 const float *norm_row =
332 normalized_scratch + (size_t)row * (
size_t)hyper_dim;
333 float *mix_row = mix_scratch + (size_t)row * (
size_t)hyper_dim;
335 mix_row, mix_row, 1, hyper_dim);
337 float *mixed_row = mixed_output + (size_t)row * (
size_t)hidden_dim;
338 for (
int col = 0; col < hidden_dim; ++col) {
340 for (
int stream = 0; stream < streams; ++stream) {
341 const int index = stream * hidden_dim + col;
342 sum += norm_row[index] * mix_row[index];
344 mixed_row[col] = sum * inv_streams;
351 const float *norm_weight,
352 const void *mix_down_weight,
353 const void *mix_up_weight,
354 const void *inject_weight,
356 float *injection_output,
357 float *normalized_scratch,
358 float *dynamic_scratch,
365 int emit_injection) {
367 hyper_input, norm_weight, mix_down_weight, mix_up_weight, inject_weight,
368 mixed_output, injection_output, normalized_scratch, dynamic_scratch,
369 mix_scratch, rows, streams, hidden_dim, dynamic_dim, eps,
375 const float *norm_weight,
376 const void *mix_down_weight,
377 const void *mix_up_weight,
378 const void *inject_weight,
380 float *injection_output,
381 float *normalized_scratch,
382 float *dynamic_scratch,
389 int emit_injection) {
391 hyper_input, norm_weight, mix_down_weight, mix_up_weight, inject_weight,
392 mixed_output, injection_output, normalized_scratch, dynamic_scratch,
393 mix_scratch, rows, streams, hidden_dim, dynamic_dim, eps,
399 const float *block_output,
400 const float *injection_weight,
405 if (!hyper_input || !block_output || !injection_weight || !output ||
406 rows <= 0 || streams <= 0 || hidden_dim <= 0) {
409 const int hyper_dim = streams * hidden_dim;
410 for (
int row = 0; row < rows; ++row) {
411 const float *hyper_row =
412 hyper_input + (size_t)row * (
size_t)hyper_dim;
413 const float *block_row =
414 block_output + (size_t)row * (
size_t)hidden_dim;
415 const float *inject_row =
416 injection_weight + (size_t)row * (
size_t)streams;
417 float *output_row = output + (size_t)row * (
size_t)hyper_dim;
418 for (
int stream = 0; stream < streams; ++stream) {
419 for (
int col = 0; col < hidden_dim; ++col) {
420 const int index = stream * hidden_dim + col;
430 const float *block_output,
431 const float *injection_weight,
436 if (!hyper_input || !block_output || !injection_weight || !output ||
437 rows <= 0 || streams <= 0 || hidden_dim <= 0) {
440 const int hyper_dim = streams * hidden_dim;
441 for (
int row = 0; row < rows; ++row) {
442 const float *hyper_row =
443 hyper_input + (size_t)row * (
size_t)hyper_dim;
444 const float *block_row =
445 block_output + (size_t)row * (
size_t)hidden_dim;
446 const float *inject_row =
447 injection_weight + (size_t)row * (
size_t)streams;
448 float *output_row = output + (size_t)row * (
size_t)hyper_dim;
449 for (
int stream = 0; stream < streams; ++stream) {
450 for (
int col = 0; col < hidden_dim; ++col) {
451 const int index = stream * hidden_dim + col;
452 volatile const float weighted =
453 block_row[col] * inject_row[stream];
454 output_row[index] = hyper_row[index] + weighted;
static uint16_t float_to_bf16(float f)
static float bf16_to_float(uint16_t v)
void rmsnorm_forward_qwen3next_pytorch_bf16_storage(const float *input, const float *gamma, float *output, float *rstd_cache, int tokens, int d_model, int aligned_embed_dim, float eps)
void recurrent_sigmoid_forward_ggml(const float *x, float *out, int rows, int dim)
void recurrent_silu_forward_ggml(const float *x, float *out, int rows, int dim)
void quantize_row_q8_k(const float *x, void *y, int k)
void quantize_row_q8_0(const float *x, void *y, int k)
Quantize FP32 to Q8_0 format (scalar reference)
void gemv_q4_k_q8_k(float *y, const void *W, const void *x_q8, int M, int K)
void hyper_connection_mix_q4k_q5_0_q4k(const float *hyper_input, const float *norm_weight, const void *mix_down_weight, const void *mix_up_weight, const void *inject_weight, float *mixed_output, float *injection_output, float *normalized_scratch, float *dynamic_scratch, float *mix_scratch, int rows, int streams, int hidden_dim, int dynamic_dim, float eps, int emit_injection)
static float ck_sigmoid_bf16(float value)
void gemv_q4_k_q8_k_avx2(float *y, const void *W, const void *x_q8, int M, int K)
void hyper_connection_mix_bf16(const float *hyper_input, const float *norm_weight, const uint16_t *mix_down_weight, const uint16_t *mix_up_weight, const uint16_t *inject_weight, float *mixed_output, float *injection_output, float *normalized_scratch, float *dynamic_scratch, float *mix_scratch, int rows, int streams, int hidden_dim, int dynamic_dim, float eps, int emit_injection)
void hyper_stream_expand_f32(const float *input, float *output, int rows, int streams, int hidden_dim)
void hyper_stream_inject_bf16(const float *hyper_input, const float *block_output, const float *injection_weight, float *output, int rows, int streams, int hidden_dim)
void hyper_connection_mix_q6k_q5_0_q4k(const float *hyper_input, const float *norm_weight, const void *mix_down_weight, const void *mix_up_weight, const void *inject_weight, float *mixed_output, float *injection_output, float *normalized_scratch, float *dynamic_scratch, float *mix_scratch, int rows, int streams, int hidden_dim, int dynamic_dim, float eps, int emit_injection)
void gemm_nt_q6_k_q8_k_parallel_dispatch(const void *A, const void *B, const float *bias, float *C, int M, int N, int K)
static float ck_bf16_round(float value)
void hyper_stream_inject_f32(const float *hyper_input, const float *block_output, const float *injection_weight, float *output, int rows, int streams, int hidden_dim)
void(* ck_hyper_q8k_gemm_fn)(const void *, const void *, const float *, float *, int, int, int)
void gemm_nt_q4_k_q8_k_pairwise_split_min_parallel_dispatch(const void *A, const void *B, const float *bias, float *C, int M, int N, int K)
static void hyper_connection_mix_quantized(const float *hyper_input, const float *norm_weight, const void *mix_down_weight, const void *mix_up_weight, const void *inject_weight, float *mixed_output, float *injection_output, float *normalized_scratch, float *dynamic_scratch, float *mix_scratch, int rows, int streams, int hidden_dim, int dynamic_dim, float eps, int emit_injection, ck_hyper_q8k_gemm_fn injection_gemm, ck_hyper_q8k_gemm_fn down_gemm)
void hyper_stream_expand_bf16(const float *input, float *output, int rows, int streams, int hidden_dim)
static void hyper_injection_q4k_q8k_llama_dispatch(const void *input, const void *weight, const float *bias, float *output, int rows, int output_dim, int input_dim)
void gemm_nt_q5_0_q8_0_parallel_dispatch(const void *A, const void *B, const float *bias, float *C, int M, int N, int K)