← Back to C-Kernel-Engine Docs Doxygen Source Documentation
 
Loading...
Searching...
No Matches
ckernel_orchestration.h File Reference
#include <stddef.h>
#include "ckernel_dtype.h"

Go to the source code of this file.

Data Structures

struct  CKLayerBackwardParams
 
struct  CKLayerForwardParams
 
struct  CKLayerForwardParamsQ4K
 

Functions

void ck_attention_project_head_major (const float *attn_out, const float *wo, const float *bo, float *out, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)
 
void ck_attention_project_head_major_backward (const float *d_out, const float *attn_out, const float *wo, float *d_attn_out, float *d_wo, float *d_bo, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)
 
void ck_attention_project_head_major_decode_token (const float *attn_token, const float *wo, const float *bo, float *out_token, int embed_dim, int aligned_embed_dim, int num_heads, int aligned_head_dim)
 
void ck_gemm_nt_quant (const float *A, const void *B, const float *bias, float *C, int M, int N, int K, CKDataType dtype)
 
void ck_layer_backward_rmsnorm_swiglu (const CKLayerBackwardParams *p)
 
void ck_layer_forward_rmsnorm_swiglu (const CKLayerForwardParams *p)
 
void ck_layer_forward_rmsnorm_swiglu_decode (const CKLayerForwardParams *p, int token_index, int cache_capacity)
 
void ck_layer_forward_rmsnorm_swiglu_decode_fused (const CKLayerForwardParams *p, int token_index, int cache_capacity)
 
void ck_layer_forward_rmsnorm_swiglu_decode_fused_attn (const CKLayerForwardParams *p, int token_index, int cache_capacity)
 
void ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_mlp (const CKLayerForwardParams *p, int token_index, int cache_capacity)
 
void ck_layer_forward_rmsnorm_swiglu_decode_q4_k (const CKLayerForwardParamsQ4K *p, int token_index, int cache_capacity)
 
void ck_layer_forward_rmsnorm_swiglu_decode_quant (const CKLayerForwardParamsQ4K *p, int token_index, int cache_capacity)
 
void ck_layer_forward_rmsnorm_swiglu_q4_k (const CKLayerForwardParamsQ4K *p)
 
void ck_layer_forward_rmsnorm_swiglu_quant (const CKLayerForwardParamsQ4K *p)
 
void ck_layer_forward_rmsnorm_swiglu_ref (const CKLayerForwardParams *p)
 
void ck_mlp_swiglu_forward (const float *input, const float *w1, const float *b1, const float *w2, const float *b2, float *fc1_out, float *swiglu_out, float *output, int tokens, int aligned_embed_dim, int aligned_intermediate_dim)
 
void ck_mlp_swiglu_forward_fully_fused_token (const float *input_row, const float *w1, const float *b1, const float *w2, const float *b2, float *output_row, int aligned_embed_dim, int aligned_intermediate_dim)
 
void ck_mlp_swiglu_forward_fused_token (const float *input_row, const float *w1, const float *b1, const float *w2, const float *b2, float *swiglu_row, float *output_row, int aligned_embed_dim, int aligned_intermediate_dim)
 
void ck_qkv_project_head_major (const float *input, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *q, float *k, float *v, int tokens, int kv_stride_tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
 
void ck_qkv_project_head_major_backward (const float *d_q, const float *d_k, const float *d_v, const float *input, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *d_input, float *d_wq, float *d_bq, float *d_wk, float *d_bk, float *d_wv, float *d_bv, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim, int num_threads)
 
void ck_qkv_project_head_major_token (const float *input_row, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *q_token, float *k_token, float *v_token, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
 
void ck_residual_add_backward (const float *d_out, float *d_a, float *d_b, int tokens, int aligned_embed_dim)
 
void ck_residual_add_token_major (const float *a, const float *b, float *out, int tokens, int aligned_embed_dim)
 

Detailed Description


LEGACY HEADER - NOT USED IN v6.6

This header declares v6.5 orchestration functions that are NO LONGER USED. v6.6 uses IR Lower 3 + codegen instead of hardcoded orchestration.

v6.6 Architecture (REPLACEMENT):

  • Kernel dispatch: version/v6.6/scripts/build_ir_v6_6.py + ckernel_codegen.c
  • Memory planning: version/v6.6/scripts/memory_planner_v6_6.py
  • Registry: version/v6.6/kernel_maps/KERNEL_REGISTRY.json
  • Kernel bindings: version/v6.6/kernel_maps/kernel_bindings.json

Deprecated functions (NOT used in v6.6):

  • ck_layer_forward_rmsnorm_swiglu* -> IR Lower 3 + mega_fused_* kernels
  • ck_qkv_project_head_major* -> q_proj/k_proj/v_proj ops in IR
  • ck_attention_project_head_major* -> out_proj op in IR
  • ck_mlp_swiglu_forward* -> mlp_gate_up/mlp_down ops in IR
  • ck_gemm_nt_quant -> KERNEL_REGISTRY.json dispatch
  • ck_residual_add_token_major -> residual_add op in IR

To remove completely:

  1. Delete this header
  2. Delete ckernel_orchestration.c
  3. Remove from Makefile SRCS list

Last used: v6.5

Deprecated: v6.6 (2026-02)

Definition in file ckernel_orchestration.h.

Function Documentation

◆ ck_attention_project_head_major()

void ck_attention_project_head_major ( const float *  attn_out,
const float *  wo,
const float *  bo,
float *  out,
float *  scratch,
int  tokens,
int  aligned_embed_dim,
int  num_heads,
int  aligned_head_dim 
)

Definition at line 730 of file ckernel_orchestration.c.

739{
740 if (!attn_out || !wo || !out) {
741 return;
742 }
743 if (num_heads > 1 && !scratch) {
744 return;
745 }
746
747 size_t head_in_stride = (size_t)tokens * (size_t)aligned_head_dim;
748 size_t head_weight_stride = (size_t)aligned_embed_dim * (size_t)aligned_head_dim;
749
750 for (int h = 0; h < num_heads; ++h) {
751 const float *head_in = attn_out + (size_t)h * head_in_stride;
752 const float *wo_h = wo + (size_t)h * head_weight_stride;
753
754 if (h == 0) {
755 gemm_blocked_serial(head_in, wo_h, bo, out,
756 tokens, aligned_embed_dim, aligned_head_dim);
757 } else {
758 gemm_blocked_serial(head_in, wo_h, NULL, scratch,
759 tokens, aligned_embed_dim, aligned_head_dim);
760 ck_add_inplace(out, scratch, tokens, aligned_embed_dim);
761 }
762 }
763}
void gemm_blocked_serial(const float *A, const float *B, const float *bias, float *C, int M, int N, int K)
static void ck_add_inplace(float *dst, const float *src, int tokens, int aligned_embed_dim)

References ck_add_inplace(), and gemm_blocked_serial().

Referenced by ck_attention_project_head_major_quant(), and ck_layer_forward_rmsnorm_swiglu().

◆ ck_attention_project_head_major_backward()

void ck_attention_project_head_major_backward ( const float *  d_out,
const float *  attn_out,
const float *  wo,
float *  d_attn_out,
float *  d_wo,
float *  d_bo,
int  tokens,
int  aligned_embed_dim,
int  num_heads,
int  aligned_head_dim 
)

Definition at line 800 of file ckernel_orchestration.c.

810{
811 if (!d_out || !attn_out || !wo || !d_attn_out || !d_wo || !d_bo) {
812 return;
813 }
814
815 // Bias gradient: sum over tokens once (bias is applied once in forward).
816 for (int d = 0; d < aligned_embed_dim; ++d) {
817 d_bo[d] = 0.0f;
818 }
819 for (int t = 0; t < tokens; ++t) {
820 const float *row = d_out + (size_t)t * (size_t)aligned_embed_dim;
821 for (int d = 0; d < aligned_embed_dim; ++d) {
822 d_bo[d] += row[d];
823 }
824 }
825
826 size_t head_in_stride = (size_t)tokens * (size_t)aligned_head_dim;
827 size_t head_weight_stride = (size_t)aligned_embed_dim * (size_t)aligned_head_dim;
828
829 float *tmp_b = (float *)calloc((size_t)aligned_embed_dim, sizeof(float));
830 if (!tmp_b) {
831 return;
832 }
833
834 for (int h = 0; h < num_heads; ++h) {
835 const float *head_in = attn_out + (size_t)h * head_in_stride;
836 const float *wo_h = wo + (size_t)h * head_weight_stride;
837 float *d_head_in = d_attn_out + (size_t)h * head_in_stride;
838 float *d_wo_h = d_wo + (size_t)h * head_weight_stride;
839
840 memset(tmp_b, 0, (size_t)aligned_embed_dim * sizeof(float));
842 head_in,
843 wo_h,
844 d_head_in,
845 d_wo_h,
846 tmp_b,
847 tokens,
848 aligned_head_dim,
849 aligned_embed_dim,
850 1);
851 }
852
853 free(tmp_b);
854}
void fc2_backward_kernel(const float *d_output, const float *fc2_input, const float *W_fc2, float *d_input, float *d_W_fc2, float *d_b_fc2, int T, int aligned_in, int aligned_out, int num_threads)

References fc2_backward_kernel().

Referenced by ck_layer_backward_rmsnorm_swiglu().

◆ ck_attention_project_head_major_decode_token()

void ck_attention_project_head_major_decode_token ( const float *  attn_token,
const float *  wo,
const float *  bo,
float *  out_token,
int  embed_dim,
int  aligned_embed_dim,
int  num_heads,
int  aligned_head_dim 
)

Definition at line 115 of file attention_decode_fused.c.

123{
124 const size_t head_in_stride = (size_t)aligned_head_dim;
125 const size_t head_weight_stride = (size_t)aligned_embed_dim * (size_t)aligned_head_dim;
126
127#pragma omp parallel for schedule(static)
128 for (int j = 0; j < embed_dim; ++j) {
129 float sum = bo ? bo[j] : 0.0f;
130 for (int h = 0; h < num_heads; ++h) {
131 const float *head_in = attn_token + (size_t)h * head_in_stride;
132 const float *wo_row = wo + (size_t)h * head_weight_stride + (size_t)j * (size_t)aligned_head_dim;
133 sum += ck_dot_f32(head_in, wo_row, aligned_head_dim);
134 }
135 out_token[j] = sum;
136 }
137
138 for (int j = embed_dim; j < aligned_embed_dim; ++j) {
139 out_token[j] = 0.0f;
140 }
141}
static float ck_dot_f32(const float *a, const float *b, int len)

References ck_dot_f32().

Referenced by ck_layer_forward_rmsnorm_swiglu_decode(), ck_layer_forward_rmsnorm_swiglu_decode_fused(), and ck_layer_forward_rmsnorm_swiglu_decode_quant().

◆ ck_gemm_nt_quant()

void ck_gemm_nt_quant ( const float *  A,
const void *  B,
const float *  bias,
float *  C,
int  M,
int  N,
int  K,
CKDataType  dtype 
)

Definition at line 335 of file ckernel_orchestration.c.

341{
342 switch (dtype) {
343 case CK_DT_FP32:
344 gemm_blocked_serial(A, (const float *)B, bias, C, M, N, K);
345 break;
346 case CK_DT_Q4_K:
347 gemm_nt_q4_k(A, B, bias, C, M, N, K);
348 break;
349 case CK_DT_Q6_K:
350 gemm_nt_q6_k(A, B, bias, C, M, N, K);
351 break;
352 case CK_DT_Q4_0:
353 gemm_nt_q4_0(A, B, bias, C, M, N, K);
354 break;
355 case CK_DT_Q4_1:
356 gemm_nt_q4_1(A, B, bias, C, M, N, K);
357 break;
358 case CK_DT_Q5_0:
359 gemm_nt_q5_0(A, B, bias, C, M, N, K);
360 break;
361 case CK_DT_Q5_1:
362 gemm_nt_q5_1(A, B, bias, C, M, N, K);
363 break;
364 case CK_DT_Q8_0:
365 gemm_nt_q8_0(A, B, bias, C, M, N, K);
366 break;
367 default:
368 break;
369 }
370}
@ CK_DT_Q4_K
@ CK_DT_Q4_0
@ CK_DT_Q8_0
@ CK_DT_Q5_0
@ CK_DT_FP32
@ CK_DT_Q6_K
@ CK_DT_Q4_1
@ CK_DT_Q5_1
void gemm_nt_q4_0(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
Matrix-matrix multiply: C[M,N] = A[M,K] @ B[N,K]^T + bias.
void gemm_nt_q4_k(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
void gemm_nt_q4_1(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
GEMM with transposed Q4_1 weights: C = A @ B^T.
void gemm_nt_q5_0(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
void gemm_nt_q6_k(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
void gemm_nt_q8_0(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
void gemm_nt_q5_1(const float *A, const void *B, const float *bias, float *C, int M, int N, int K)
GEMM with transposed Q5_1 weights: C = A @ B^T.
#define C(color)
Definition show_config.c:39

References C, CK_DT_FP32, CK_DT_Q4_0, CK_DT_Q4_1, CK_DT_Q4_K, CK_DT_Q5_0, CK_DT_Q5_1, CK_DT_Q6_K, CK_DT_Q8_0, gemm_blocked_serial(), gemm_nt_q4_0(), gemm_nt_q4_1(), gemm_nt_q4_k(), gemm_nt_q5_0(), gemm_nt_q5_1(), gemm_nt_q6_k(), and gemm_nt_q8_0().

Referenced by ck_attention_project_head_major_quant(), ck_layer_forward_rmsnorm_swiglu_decode_quant(), ck_mlp_swiglu_forward_quant(), ck_qkv_project_head_major_quant(), ck_qkv_project_head_major_token_quant(), and mega_fused_attention_prefill().

◆ ck_layer_backward_rmsnorm_swiglu()

void ck_layer_backward_rmsnorm_swiglu ( const CKLayerBackwardParams p)

Definition at line 2713 of file ckernel_orchestration.c.

2714{
2715 if (!p) {
2716 return;
2717 }
2718
2719 int T = p->tokens;
2720 int aligned_embed = p->aligned_embed_dim;
2721 int aligned_head = p->aligned_head_dim;
2722 int aligned_intermediate = p->aligned_intermediate_dim;
2723 int up_dim = 2 * aligned_intermediate;
2724 int num_threads = 1;
2725
2726 // 1) Residual add (output = residual1 + mlp_out)
2727 ck_residual_add_backward(p->d_output, p->d_residual1, p->d_mlp_out, T, aligned_embed);
2728
2729 // 2) MLP down proj backward
2731 p->swiglu_out,
2732 p->w2,
2733 p->d_swiglu_out,
2734 p->d_w2,
2735 p->d_b2,
2736 T,
2737 aligned_intermediate,
2738 aligned_embed,
2739 num_threads);
2740
2741 // 3) SwiGLU backward
2742 swiglu_backward(p->fc1_out, p->d_swiglu_out, p->d_fc1_out, T, aligned_intermediate);
2743
2744 // 4) MLP up proj backward
2746 p->ln2_out,
2747 p->w1,
2748 p->d_ln2_out,
2749 p->d_w1,
2750 p->d_b1,
2751 T,
2752 aligned_embed,
2753 up_dim,
2754 num_threads);
2755
2756 // 5) RMSNorm (ln2) backward; reuse d_output as scratch for d_residual1_from_ln2
2758 p->residual1,
2759 p->ln2_gamma,
2760 p->ln2_rstd,
2761 p->d_output,
2762 p->d_ln2_gamma,
2763 T,
2764 p->embed_dim,
2765 aligned_embed);
2766 ck_add_inplace(p->d_residual1, p->d_output, T, aligned_embed);
2767
2768 // 6) Residual add (residual1 = input + proj_tmp)
2769 ck_residual_add_backward(p->d_residual1, p->d_input, p->d_proj_tmp, T, aligned_embed);
2770
2771 // 7) Attention projection backward
2773 p->attn_out,
2774 p->wo,
2775 p->d_attn_out,
2776 p->d_wo,
2777 p->d_bo,
2778 T,
2779 aligned_embed,
2780 p->num_heads,
2781 aligned_head);
2782
2783 // 8) Attention backward
2785 p->q,
2786 p->k,
2787 p->v,
2788 p->scores,
2789 p->d_q,
2790 p->d_k,
2791 p->d_v,
2792 p->d_scores,
2793 p->num_heads,
2794 p->num_kv_heads,
2795 T,
2796 p->head_dim,
2797 aligned_head,
2799
2800 // 9) RoPE backward (if enabled)
2801 if (p->rope_cos && p->rope_sin) {
2803 p->d_k,
2804 p->d_q,
2805 p->d_k,
2806 p->rope_cos,
2807 p->rope_sin,
2808 p->num_heads,
2809 p->num_kv_heads,
2810 T,
2811 p->head_dim,
2812 aligned_head,
2813 p->rope_pos_offset);
2814 }
2815
2816 // 10) QKV projection backward (scratch uses d_proj_tmp)
2818 p->d_k,
2819 p->d_v,
2820 p->ln1_out,
2821 p->wq,
2822 p->bq,
2823 p->wk,
2824 p->bk,
2825 p->wv,
2826 p->bv,
2827 p->d_ln1_out,
2828 p->d_wq,
2829 p->d_bq,
2830 p->d_wk,
2831 p->d_bk,
2832 p->d_wv,
2833 p->d_bv,
2834 p->d_proj_tmp,
2835 T,
2836 aligned_embed,
2837 p->num_heads,
2838 p->num_kv_heads,
2839 aligned_head,
2840 num_threads);
2841
2842 // 11) RMSNorm (ln1) backward; reuse d_ln1_out as scratch for d_input_from_ln1
2844 p->input,
2845 p->ln1_gamma,
2846 p->ln1_rstd,
2847 p->d_ln1_out,
2848 p->d_ln1_gamma,
2849 T,
2850 p->embed_dim,
2851 aligned_embed);
2852 ck_add_inplace(p->d_input, p->d_ln1_out, T, aligned_embed);
2853}
void swiglu_backward(const float *input, const float *d_output, float *d_input, int tokens, int dim)
void rope_backward_qk(const float *d_q_out, const float *d_k_out, float *d_q, float *d_k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
void fc1_backward_kernel(const float *d_output, const float *fc1_input, const float *W_fc1, float *d_input, float *d_W_fc1, float *d_b_fc1, int T, int aligned_in, int aligned_out, int num_threads)
void rmsnorm_backward(const float *d_output, const float *input, const float *gamma, const float *rstd_cache, float *d_input, float *d_gamma, int tokens, int d_model, int aligned_embed_dim)
void attention_backward_causal_head_major_gqa(const float *d_output, const float *q, const float *k, const float *v, const float *attn_weights, float *d_q, float *d_k, float *d_v, float *d_scores, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int aligned_context_window)
void ck_residual_add_backward(const float *d_out, float *d_a, float *d_b, int tokens, int aligned_embed_dim)
void ck_qkv_project_head_major_backward(const float *d_q, const float *d_k, const float *d_v, const float *input, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *d_input, float *d_wq, float *d_bq, float *d_wk, float *d_bk, float *d_wv, float *d_bv, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim, int num_threads)
void ck_attention_project_head_major_backward(const float *d_out, const float *attn_out, const float *wo, float *d_attn_out, float *d_wo, float *d_bo, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)

References CKLayerBackwardParams::aligned_context_window, CKLayerBackwardParams::aligned_embed_dim, CKLayerBackwardParams::aligned_head_dim, CKLayerBackwardParams::aligned_intermediate_dim, attention_backward_causal_head_major_gqa(), CKLayerBackwardParams::attn_out, CKLayerBackwardParams::bk, CKLayerBackwardParams::bq, CKLayerBackwardParams::bv, ck_add_inplace(), ck_attention_project_head_major_backward(), ck_qkv_project_head_major_backward(), ck_residual_add_backward(), CKLayerBackwardParams::d_attn_out, CKLayerBackwardParams::d_b1, CKLayerBackwardParams::d_b2, CKLayerBackwardParams::d_bk, CKLayerBackwardParams::d_bo, CKLayerBackwardParams::d_bq, CKLayerBackwardParams::d_bv, CKLayerBackwardParams::d_fc1_out, CKLayerBackwardParams::d_input, CKLayerBackwardParams::d_k, CKLayerBackwardParams::d_ln1_gamma, CKLayerBackwardParams::d_ln1_out, CKLayerBackwardParams::d_ln2_gamma, CKLayerBackwardParams::d_ln2_out, CKLayerBackwardParams::d_mlp_out, CKLayerBackwardParams::d_output, CKLayerBackwardParams::d_proj_tmp, CKLayerBackwardParams::d_q, CKLayerBackwardParams::d_residual1, CKLayerBackwardParams::d_scores, CKLayerBackwardParams::d_swiglu_out, CKLayerBackwardParams::d_v, CKLayerBackwardParams::d_w1, CKLayerBackwardParams::d_w2, CKLayerBackwardParams::d_wk, CKLayerBackwardParams::d_wo, CKLayerBackwardParams::d_wq, CKLayerBackwardParams::d_wv, CKLayerBackwardParams::embed_dim, fc1_backward_kernel(), CKLayerBackwardParams::fc1_out, fc2_backward_kernel(), CKLayerBackwardParams::head_dim, CKLayerBackwardParams::input, CKLayerBackwardParams::k, CKLayerBackwardParams::ln1_gamma, CKLayerBackwardParams::ln1_out, CKLayerBackwardParams::ln1_rstd, CKLayerBackwardParams::ln2_gamma, CKLayerBackwardParams::ln2_out, CKLayerBackwardParams::ln2_rstd, CKLayerBackwardParams::num_heads, CKLayerBackwardParams::num_kv_heads, CKLayerBackwardParams::q, CKLayerBackwardParams::residual1, rmsnorm_backward(), rope_backward_qk(), CKLayerBackwardParams::rope_cos, CKLayerBackwardParams::rope_pos_offset, CKLayerBackwardParams::rope_sin, CKLayerBackwardParams::scores, swiglu_backward(), CKLayerBackwardParams::swiglu_out, CKLayerBackwardParams::tokens, CKLayerBackwardParams::v, CKLayerBackwardParams::w1, CKLayerBackwardParams::w2, CKLayerBackwardParams::wk, CKLayerBackwardParams::wo, CKLayerBackwardParams::wq, and CKLayerBackwardParams::wv.

◆ ck_layer_forward_rmsnorm_swiglu()

void ck_layer_forward_rmsnorm_swiglu ( const CKLayerForwardParams p)

Definition at line 1004 of file ckernel_orchestration.c.

1005{
1006 if (!p) {
1007 return;
1008 }
1009
1011 p->ln1_gamma,
1012 p->ln1_out,
1013 p->ln1_rstd,
1014 p->tokens,
1015 p->embed_dim,
1017 p->eps);
1018
1020 p->wq, p->bq,
1021 p->wk, p->bk,
1022 p->wv, p->bv,
1023 p->q, p->k, p->v,
1024 p->tokens,
1025 p->tokens,
1027 p->num_heads,
1028 p->num_kv_heads,
1029 p->aligned_head_dim);
1030
1031 if (p->rope_cos && p->rope_sin) {
1032 rope_forward_qk(p->q,
1033 p->k,
1034 p->rope_cos,
1035 p->rope_sin,
1036 p->num_heads,
1037 p->num_kv_heads,
1038 p->tokens,
1039 p->head_dim,
1041 p->rope_pos_offset);
1042 }
1043
1044 if (p->scores) {
1047 p->k,
1048 p->v,
1049 p->scores,
1050 p->attn_out,
1051 p->num_heads,
1052 p->num_kv_heads,
1053 p->tokens,
1054 p->head_dim,
1057 } else {
1059 p->k,
1060 p->v,
1061 p->scores,
1062 p->attn_out,
1063 p->num_heads,
1064 p->num_kv_heads,
1065 p->tokens,
1066 p->head_dim,
1069 }
1070 } else {
1072 p->k,
1073 p->v,
1074 p->attn_out,
1075 p->num_heads,
1076 p->num_kv_heads,
1077 p->tokens,
1078 p->head_dim,
1079 p->aligned_head_dim);
1080 }
1081
1083 p->wo,
1084 p->bo,
1085 p->proj_tmp,
1086 p->proj_scratch,
1087 p->tokens,
1089 p->num_heads,
1090 p->aligned_head_dim);
1091
1093 p->proj_tmp,
1094 p->residual1,
1095 p->tokens,
1097
1099 p->ln2_gamma,
1100 p->ln2_out,
1101 p->ln2_rstd,
1102 p->tokens,
1103 p->embed_dim,
1105 p->eps);
1106
1108 p->w1,
1109 p->b1,
1110 p->w2,
1111 p->b2,
1112 p->fc1_out,
1113 p->swiglu_out,
1114 p->mlp_out,
1115 p->tokens,
1118
1120 p->mlp_out,
1121 p->output,
1122 p->tokens,
1124}
void attention_forward_causal_head_major_gqa_exact(const float *q, const float *k, const float *v, float *scores, float *output, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int aligned_context_window)
void attention_forward_causal_head_major_gqa(const float *q, const float *k, const float *v, float *scores, float *output, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int aligned_context_window)
void rmsnorm_forward(const float *input, const float *gamma, float *output, float *rstd_cache, int tokens, int d_model, int aligned_embed_dim, float eps)
void attention_forward_causal_head_major_gqa_flash(const float *q, const float *k, const float *v, float *output, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim)
void rope_forward_qk(float *q, float *k, const float *cos_cache, const float *sin_cache, int num_heads, int num_kv_heads, int num_tokens, int head_dim, int aligned_head_dim, int pos_offset)
int ck_strict_parity_enabled(void)
void ck_attention_project_head_major(const float *attn_out, const float *wo, const float *bo, float *out, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)
void ck_mlp_swiglu_forward(const float *input, const float *w1, const float *b1, const float *w2, const float *b2, float *fc1_out, float *swiglu_out, float *output, int tokens, int aligned_embed_dim, int aligned_intermediate_dim)
void ck_qkv_project_head_major(const float *input, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *q, float *k, float *v, int tokens, int kv_stride_tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
void ck_residual_add_token_major(const float *a, const float *b, float *out, int tokens, int aligned_embed_dim)

References CKLayerForwardParams::aligned_context_window, CKLayerForwardParams::aligned_embed_dim, CKLayerForwardParams::aligned_head_dim, CKLayerForwardParams::aligned_intermediate_dim, attention_forward_causal_head_major_gqa(), attention_forward_causal_head_major_gqa_exact(), attention_forward_causal_head_major_gqa_flash(), CKLayerForwardParams::attn_out, CKLayerForwardParams::b1, CKLayerForwardParams::b2, CKLayerForwardParams::bk, CKLayerForwardParams::bo, CKLayerForwardParams::bq, CKLayerForwardParams::bv, ck_attention_project_head_major(), ck_mlp_swiglu_forward(), ck_qkv_project_head_major(), ck_residual_add_token_major(), ck_strict_parity_enabled(), CKLayerForwardParams::embed_dim, CKLayerForwardParams::eps, CKLayerForwardParams::fc1_out, CKLayerForwardParams::head_dim, CKLayerForwardParams::input, CKLayerForwardParams::k, CKLayerForwardParams::ln1_gamma, CKLayerForwardParams::ln1_out, CKLayerForwardParams::ln1_rstd, CKLayerForwardParams::ln2_gamma, CKLayerForwardParams::ln2_out, CKLayerForwardParams::ln2_rstd, CKLayerForwardParams::mlp_out, CKLayerForwardParams::num_heads, CKLayerForwardParams::num_kv_heads, CKLayerForwardParams::output, CKLayerForwardParams::proj_scratch, CKLayerForwardParams::proj_tmp, CKLayerForwardParams::q, CKLayerForwardParams::residual1, rmsnorm_forward(), CKLayerForwardParams::rope_cos, rope_forward_qk(), CKLayerForwardParams::rope_pos_offset, CKLayerForwardParams::rope_sin, CKLayerForwardParams::scores, CKLayerForwardParams::swiglu_out, CKLayerForwardParams::tokens, CKLayerForwardParams::v, CKLayerForwardParams::w1, CKLayerForwardParams::w2, CKLayerForwardParams::wk, CKLayerForwardParams::wo, CKLayerForwardParams::wq, and CKLayerForwardParams::wv.

◆ ck_layer_forward_rmsnorm_swiglu_decode()

void ck_layer_forward_rmsnorm_swiglu_decode ( const CKLayerForwardParams p,
int  token_index,
int  cache_capacity 
)

Definition at line 1325 of file ckernel_orchestration.c.

1328{
1329 if (!p) {
1330 return;
1331 }
1332 if (!p->input || !p->ln1_gamma || !p->ln2_gamma || !p->ln1_out || !p->ln2_out ||
1333 !p->wq || !p->wk || !p->wv || !p->wo || !p->w1 || !p->w2 ||
1334 !p->k || !p->v ||
1335 !p->proj_tmp || !p->residual1 || !p->fc1_out || !p->swiglu_out || !p->mlp_out || !p->output) {
1336 return;
1337 }
1338 if (token_index < 0 || cache_capacity <= 0 || token_index >= cache_capacity) {
1339 return;
1340 }
1341 if (p->num_heads <= 0 || p->num_kv_heads <= 0 || p->aligned_head_dim <= 0) {
1342 return;
1343 }
1344
1345 const int D = p->embed_dim;
1346 const int aligned_D = p->aligned_embed_dim;
1347 const int H = p->num_heads;
1348 const int H_kv = p->num_kv_heads;
1349 const int hd = p->head_dim;
1350 const int ad = p->aligned_head_dim;
1351 const int aligned_intermediate = p->aligned_intermediate_dim;
1352
1353 /* Decode buffers are single-token; token_index only applies to KV cache. */
1354 const size_t token_slot = 0;
1355 const float *input_row = p->input + token_slot * (size_t)aligned_D;
1356 float *ln1_row = p->ln1_out + token_slot * (size_t)aligned_D;
1357 float *ln2_row = p->ln2_out + token_slot * (size_t)aligned_D;
1358 float *proj_row = p->proj_tmp + token_slot * (size_t)aligned_D;
1359 float *residual_row = p->residual1 + token_slot * (size_t)aligned_D;
1360 float *mlp_row = p->mlp_out + token_slot * (size_t)aligned_D;
1361 float *out_row = p->output + token_slot * (size_t)aligned_D;
1362
1363 float ln1_rstd_tmp = 0.0f;
1364 float ln2_rstd_tmp = 0.0f;
1365 float *ln1_rstd = p->ln1_rstd ? (p->ln1_rstd + token_slot) : &ln1_rstd_tmp;
1366 float *ln2_rstd = p->ln2_rstd ? (p->ln2_rstd + token_slot) : &ln2_rstd_tmp;
1367
1368 // Scratch for a single token in head-major layout: [head, aligned_head_dim].
1369 size_t q_elems = (size_t)H * (size_t)ad;
1370 size_t kv_elems = (size_t)H_kv * (size_t)ad;
1371 float q_token[q_elems];
1372 float k_token[kv_elems];
1373 float v_token[kv_elems];
1374 float attn_token[q_elems];
1375
1376 // LN1 / RMSNorm.
1377 rmsnorm_forward(input_row,
1378 p->ln1_gamma,
1379 ln1_row,
1380 ln1_rstd,
1381 /*tokens=*/1,
1382 D,
1383 aligned_D,
1384 p->eps);
1385
1386 // Project Q/K/V for the new token.
1388 p->wq, p->bq,
1389 p->wk, p->bk,
1390 p->wv, p->bv,
1391 q_token, k_token, v_token,
1392 aligned_D,
1393 H,
1394 H_kv,
1395 ad);
1396
1397 // RoPE for the new token at absolute position `p->rope_pos_offset`.
1398 if (p->rope_cos && p->rope_sin) {
1399 rope_forward_qk(q_token,
1400 k_token,
1401 p->rope_cos,
1402 p->rope_sin,
1403 H,
1404 H_kv,
1405 /*num_tokens=*/1,
1406 hd,
1407 ad,
1408 p->rope_pos_offset);
1409 }
1410
1411 // Update KV cache (stores k/v for this token and clears padded lanes).
1413 v_token,
1414 p->k,
1415 p->v,
1416 H_kv,
1417 token_index,
1418 cache_capacity,
1419 hd,
1420 ad);
1421
1422 // Decode attention for this token using the KV cache.
1424 p->k,
1425 p->v,
1426 attn_token,
1427 H,
1428 H_kv,
1429 /*kv_tokens=*/token_index + 1,
1430 cache_capacity,
1431 hd,
1432 ad);
1433
1434 // Output projection (Wo) into token-major buffer (decode-specialized).
1436 p->wo,
1437 p->bo,
1438 proj_row,
1439 D,
1440 aligned_D,
1441 H,
1442 ad);
1443
1444 // Residual + LN2 / RMSNorm.
1446 proj_row,
1447 residual_row,
1448 /*tokens=*/1,
1449 aligned_D);
1450
1451 rmsnorm_forward(residual_row,
1452 p->ln2_gamma,
1453 ln2_row,
1454 ln2_rstd,
1455 /*tokens=*/1,
1456 D,
1457 aligned_D,
1458 p->eps);
1459
1460 // MLP block for this token.
1461 int up_dim = 2 * aligned_intermediate;
1462 float *fc1_row = p->fc1_out + token_slot * (size_t)up_dim;
1463 float *swiglu_row = p->swiglu_out + token_slot * (size_t)aligned_intermediate;
1464
1465 ck_mlp_swiglu_forward(ln2_row,
1466 p->w1,
1467 p->b1,
1468 p->w2,
1469 p->b2,
1470 fc1_row,
1471 swiglu_row,
1472 mlp_row,
1473 /*tokens=*/1,
1474 aligned_D,
1475 aligned_intermediate);
1476
1477 // Final residual.
1478 ck_residual_add_token_major(residual_row,
1479 mlp_row,
1480 out_row,
1481 /*tokens=*/1,
1482 aligned_D);
1483}
void kv_cache_write_head_major(const float *__restrict k_token, const float *__restrict v_token, float *__restrict k_cache, float *__restrict v_cache, int num_kv_heads, int token_index, int cache_capacity, int head_dim, int aligned_head_dim)
void ck_attention_flash_decode_wrapper(const float *q_token, const float *k_cache, const float *v_cache, float *out_token, int num_heads, int num_kv_heads, int kv_tokens, int cache_capacity, int head_dim, int aligned_head_dim)
Wrapper to call TRUE flash attention from orchestration layer.
void ck_qkv_project_head_major_token(const float *input_row, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *q_token, float *k_token, float *v_token, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
void ck_attention_project_head_major_decode_token(const float *attn_token, const float *wo, const float *bo, float *out_token, int embed_dim, int aligned_embed_dim, int num_heads, int aligned_head_dim)

References CKLayerForwardParams::aligned_embed_dim, CKLayerForwardParams::aligned_head_dim, CKLayerForwardParams::aligned_intermediate_dim, CKLayerForwardParams::b1, CKLayerForwardParams::b2, CKLayerForwardParams::bk, CKLayerForwardParams::bo, CKLayerForwardParams::bq, CKLayerForwardParams::bv, ck_attention_flash_decode_wrapper(), ck_attention_project_head_major_decode_token(), ck_mlp_swiglu_forward(), ck_qkv_project_head_major_token(), ck_residual_add_token_major(), CKLayerForwardParams::embed_dim, CKLayerForwardParams::eps, CKLayerForwardParams::fc1_out, CKLayerForwardParams::head_dim, CKLayerForwardParams::input, CKLayerForwardParams::k, kv_cache_write_head_major(), CKLayerForwardParams::ln1_gamma, CKLayerForwardParams::ln1_out, CKLayerForwardParams::ln1_rstd, CKLayerForwardParams::ln2_gamma, CKLayerForwardParams::ln2_out, CKLayerForwardParams::ln2_rstd, CKLayerForwardParams::mlp_out, CKLayerForwardParams::num_heads, CKLayerForwardParams::num_kv_heads, CKLayerForwardParams::output, CKLayerForwardParams::proj_tmp, CKLayerForwardParams::residual1, rmsnorm_forward(), CKLayerForwardParams::rope_cos, rope_forward_qk(), CKLayerForwardParams::rope_pos_offset, CKLayerForwardParams::rope_sin, CKLayerForwardParams::swiglu_out, CKLayerForwardParams::v, CKLayerForwardParams::w1, CKLayerForwardParams::w2, CKLayerForwardParams::wk, CKLayerForwardParams::wo, CKLayerForwardParams::wq, and CKLayerForwardParams::wv.

◆ ck_layer_forward_rmsnorm_swiglu_decode_fused()

void ck_layer_forward_rmsnorm_swiglu_decode_fused ( const CKLayerForwardParams p,
int  token_index,
int  cache_capacity 
)

Definition at line 1485 of file ckernel_orchestration.c.

1488{
1489 if (!p) {
1490 return;
1491 }
1492 if (!p->input || !p->ln1_gamma || !p->ln2_gamma || !p->ln1_out || !p->ln2_out ||
1493 !p->wq || !p->wk || !p->wv || !p->wo || !p->w1 || !p->w2 ||
1494 !p->k || !p->v || !p->swiglu_out ||
1495 !p->proj_tmp || !p->residual1 || !p->mlp_out || !p->output) {
1496 return;
1497 }
1498 if (token_index < 0 || cache_capacity <= 0 || token_index >= cache_capacity) {
1499 return;
1500 }
1501 if (p->num_heads <= 0 || p->num_kv_heads <= 0 || p->aligned_head_dim <= 0) {
1502 return;
1503 }
1504
1505 const int D = p->embed_dim;
1506 const int aligned_D = p->aligned_embed_dim;
1507 const int H = p->num_heads;
1508 const int H_kv = p->num_kv_heads;
1509 const int hd = p->head_dim;
1510 const int ad = p->aligned_head_dim;
1511 const int aligned_intermediate = p->aligned_intermediate_dim;
1512
1513 /* Decode buffers are single-token; token_index only applies to KV cache. */
1514 const size_t token_slot = 0;
1515 const float *input_row = p->input + token_slot * (size_t)aligned_D;
1516 float *ln1_row = p->ln1_out + token_slot * (size_t)aligned_D;
1517 float *ln2_row = p->ln2_out + token_slot * (size_t)aligned_D;
1518 float *proj_row = p->proj_tmp + token_slot * (size_t)aligned_D;
1519 float *residual_row = p->residual1 + token_slot * (size_t)aligned_D;
1520 float *swiglu_row = p->swiglu_out + token_slot * (size_t)aligned_intermediate;
1521 float *mlp_row = p->mlp_out + token_slot * (size_t)aligned_D;
1522 float *out_row = p->output + token_slot * (size_t)aligned_D;
1523
1524 float ln1_rstd_tmp = 0.0f;
1525 float ln2_rstd_tmp = 0.0f;
1526 float *ln1_rstd = p->ln1_rstd ? (p->ln1_rstd + token_slot) : &ln1_rstd_tmp;
1527 float *ln2_rstd = p->ln2_rstd ? (p->ln2_rstd + token_slot) : &ln2_rstd_tmp;
1528
1529 // Scratch for a single token in head-major layout: [head, aligned_head_dim].
1530 size_t q_elems = (size_t)H * (size_t)ad;
1531 size_t kv_elems = (size_t)H_kv * (size_t)ad;
1532 float q_token[q_elems];
1533 float k_token[kv_elems];
1534 float v_token[kv_elems];
1535 float attn_token[q_elems];
1536
1537 // LN1 / RMSNorm.
1538 rmsnorm_forward(input_row,
1539 p->ln1_gamma,
1540 ln1_row,
1541 ln1_rstd,
1542 /*tokens=*/1,
1543 D,
1544 aligned_D,
1545 p->eps);
1546
1547 // Project Q/K/V for the new token.
1549 p->wq, p->bq,
1550 p->wk, p->bk,
1551 p->wv, p->bv,
1552 q_token, k_token, v_token,
1553 aligned_D,
1554 H,
1555 H_kv,
1556 ad);
1557
1558 // RoPE for the new token at absolute position `p->rope_pos_offset`.
1559 if (p->rope_cos && p->rope_sin) {
1560 rope_forward_qk(q_token,
1561 k_token,
1562 p->rope_cos,
1563 p->rope_sin,
1564 H,
1565 H_kv,
1566 /*num_tokens=*/1,
1567 hd,
1568 ad,
1569 p->rope_pos_offset);
1570 }
1571
1572 // Update KV cache (stores k/v for this token and clears padded lanes).
1574 v_token,
1575 p->k,
1576 p->v,
1577 H_kv,
1578 token_index,
1579 cache_capacity,
1580 hd,
1581 ad);
1582
1583 // Decode attention for this token using the KV cache.
1585 p->k,
1586 p->v,
1587 attn_token,
1588 H,
1589 H_kv,
1590 /*kv_tokens=*/token_index + 1,
1591 cache_capacity,
1592 hd,
1593 ad);
1594
1595 // Output projection (Wo) into token-major buffer (decode-specialized).
1597 p->wo,
1598 p->bo,
1599 proj_row,
1600 D,
1601 aligned_D,
1602 H,
1603 ad);
1604
1605 // Residual + LN2 / RMSNorm.
1607 proj_row,
1608 residual_row,
1609 /*tokens=*/1,
1610 aligned_D);
1611
1612 rmsnorm_forward(residual_row,
1613 p->ln2_gamma,
1614 ln2_row,
1615 ln2_rstd,
1616 /*tokens=*/1,
1617 D,
1618 aligned_D,
1619 p->eps);
1620
1621 // MLP block for this token (fully fused - all 3 projections in one pass).
1622 // Eliminates DRAM round-trip for swiglu intermediate values.
1624 p->w1,
1625 p->b1,
1626 p->w2,
1627 p->b2,
1628 mlp_row,
1629 aligned_D,
1630 aligned_intermediate);
1631
1632 // Final residual.
1633 ck_residual_add_token_major(residual_row,
1634 mlp_row,
1635 out_row,
1636 /*tokens=*/1,
1637 aligned_D);
1638}
void ck_mlp_swiglu_forward_fully_fused_token(const float *input_row, const float *w1, const float *b1, const float *w2, const float *b2, float *output_row, int aligned_embed_dim, int aligned_intermediate_dim)

References CKLayerForwardParams::aligned_embed_dim, CKLayerForwardParams::aligned_head_dim, CKLayerForwardParams::aligned_intermediate_dim, CKLayerForwardParams::b1, CKLayerForwardParams::b2, CKLayerForwardParams::bk, CKLayerForwardParams::bo, CKLayerForwardParams::bq, CKLayerForwardParams::bv, ck_attention_flash_decode_wrapper(), ck_attention_project_head_major_decode_token(), ck_mlp_swiglu_forward_fully_fused_token(), ck_qkv_project_head_major_token(), ck_residual_add_token_major(), CKLayerForwardParams::embed_dim, CKLayerForwardParams::eps, CKLayerForwardParams::head_dim, CKLayerForwardParams::input, CKLayerForwardParams::k, kv_cache_write_head_major(), CKLayerForwardParams::ln1_gamma, CKLayerForwardParams::ln1_out, CKLayerForwardParams::ln1_rstd, CKLayerForwardParams::ln2_gamma, CKLayerForwardParams::ln2_out, CKLayerForwardParams::ln2_rstd, CKLayerForwardParams::mlp_out, CKLayerForwardParams::num_heads, CKLayerForwardParams::num_kv_heads, CKLayerForwardParams::output, CKLayerForwardParams::proj_tmp, CKLayerForwardParams::residual1, rmsnorm_forward(), CKLayerForwardParams::rope_cos, rope_forward_qk(), CKLayerForwardParams::rope_pos_offset, CKLayerForwardParams::rope_sin, CKLayerForwardParams::swiglu_out, CKLayerForwardParams::v, CKLayerForwardParams::w1, CKLayerForwardParams::w2, CKLayerForwardParams::wk, CKLayerForwardParams::wo, CKLayerForwardParams::wq, and CKLayerForwardParams::wv.

◆ ck_layer_forward_rmsnorm_swiglu_decode_fused_attn()

void ck_layer_forward_rmsnorm_swiglu_decode_fused_attn ( const CKLayerForwardParams p,
int  token_index,
int  cache_capacity 
)

Definition at line 343 of file attention_decode_fused.c.

346{
348 token_index,
349 cache_capacity,
350 /*fuse_mlp=*/0);
351}
static void ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_impl(const CKLayerForwardParams *p, int token_index, int cache_capacity, int fuse_mlp)

References ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_impl().

◆ ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_mlp()

void ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_mlp ( const CKLayerForwardParams p,
int  token_index,
int  cache_capacity 
)

Definition at line 353 of file attention_decode_fused.c.

356{
358 token_index,
359 cache_capacity,
360 /*fuse_mlp=*/1);
361}

References ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_impl().

◆ ck_layer_forward_rmsnorm_swiglu_decode_q4_k()

void ck_layer_forward_rmsnorm_swiglu_decode_q4_k ( const CKLayerForwardParamsQ4K p,
int  token_index,
int  cache_capacity 
)

Definition at line 2153 of file ckernel_orchestration.c.

2156{
2157 if (!p) {
2158 return;
2159 }
2160 if (!p->input || !p->ln1_gamma || !p->ln2_gamma || !p->ln1_out || !p->ln2_out ||
2161 !p->wq || !p->wk || !p->wv || !p->wo || !p->w1 || !p->w2 ||
2162 !p->k || !p->v ||
2163 !p->proj_tmp || !p->residual1 || !p->fc1_out || !p->swiglu_out || !p->mlp_out || !p->output) {
2164 return;
2165 }
2166 if (token_index < 0 || cache_capacity <= 0 || token_index >= cache_capacity) {
2167 return;
2168 }
2169
2170 const int D = p->embed_dim;
2171 const int aligned_D = p->aligned_embed_dim;
2172 const int H = p->num_heads;
2173 const int H_kv = p->num_kv_heads;
2174 const int hd = p->head_dim;
2175 const int ad = p->aligned_head_dim;
2176 const int aligned_intermediate = p->aligned_intermediate_dim;
2177 const int K_concat = H * ad;
2178
2179 /* Decode buffers are single-token; token_index only applies to KV cache. */
2180 const size_t token_slot = 0;
2181 const float *input_row = p->input + token_slot * (size_t)aligned_D;
2182 float *ln1_row = p->ln1_out + token_slot * (size_t)aligned_D;
2183 float *ln2_row = p->ln2_out + token_slot * (size_t)aligned_D;
2184 float *proj_row = p->proj_tmp + token_slot * (size_t)aligned_D;
2185 float *residual_row = p->residual1 + token_slot * (size_t)aligned_D;
2186 float *mlp_row = p->mlp_out + token_slot * (size_t)aligned_D;
2187 float *out_row = p->output + token_slot * (size_t)aligned_D;
2188
2189 float ln1_rstd_tmp = 0.0f;
2190 float ln2_rstd_tmp = 0.0f;
2191 float *ln1_rstd = p->ln1_rstd ? (p->ln1_rstd + token_slot) : &ln1_rstd_tmp;
2192 float *ln2_rstd = p->ln2_rstd ? (p->ln2_rstd + token_slot) : &ln2_rstd_tmp;
2193
2194 /* Scratch for a single token in head-major layout: [head, aligned_head_dim]. */
2195 size_t q_elems = (size_t)H * (size_t)ad;
2196 size_t kv_elems = (size_t)H_kv * (size_t)ad;
2197 float q_token[q_elems];
2198 float k_token[kv_elems];
2199 float v_token[kv_elems];
2200 float attn_token[q_elems];
2201
2202 /* LN1 / RMSNorm. */
2203 ck_debug_check_buffer("input_row", input_row, aligned_D);
2204 rmsnorm_forward(input_row,
2205 p->ln1_gamma,
2206 ln1_row,
2207 ln1_rstd,
2208 /*tokens=*/1,
2209 D,
2210 aligned_D,
2211 p->eps);
2212 ck_debug_check_buffer("ln1_out (after rmsnorm)", ln1_row, aligned_D);
2213
2215 if ((aligned_D % QK_K) == 0 && (aligned_intermediate % QK_K) == 0) {
2216 const int q8_blocks_embed = aligned_D / QK_K;
2217 const int q8_blocks_inter = aligned_intermediate / QK_K;
2218 const int q8_blocks_max = (q8_blocks_embed > q8_blocks_inter) ? q8_blocks_embed : q8_blocks_inter;
2219 block_q8_K q8_buf[q8_blocks_max];
2220
2221 /* Project Q/K/V with Q8_K activations. */
2222 quantize_row_q8_k(ln1_row, q8_buf, aligned_D);
2223 ck_debug_check_q8k("q8_buf (after quantize)", q8_buf, q8_blocks_embed);
2224 ck_debug_check_q4k_weights("wq weights", p->wq, (aligned_D / QK_K) * (H * ad));
2226 p->wq, p->bq,
2227 p->wk, p->bk,
2228 p->wv, p->bv,
2229 q_token, k_token, v_token,
2230 aligned_D,
2231 H,
2232 H_kv,
2233 ad);
2234 ck_debug_check_buffer("q_token (after QKV proj)", q_token, (int)q_elems);
2235 ck_debug_check_buffer("k_token (after QKV proj)", k_token, (int)kv_elems);
2236 ck_debug_check_buffer("v_token (after QKV proj)", v_token, (int)kv_elems);
2237
2238 /* RoPE for the new token at absolute position `p->rope_pos_offset`. */
2239 if (p->rope_cos && p->rope_sin) {
2240 rope_forward_qk(q_token,
2241 k_token,
2242 p->rope_cos,
2243 p->rope_sin,
2244 H,
2245 H_kv,
2246 /*num_tokens=*/1,
2247 hd,
2248 ad,
2249 p->rope_pos_offset);
2250 }
2251
2252 /* Update KV cache. */
2254 v_token,
2255 p->k,
2256 p->v,
2257 H_kv,
2258 token_index,
2259 cache_capacity,
2260 hd,
2261 ad);
2262
2263 /* Decode attention for this token using the KV cache. */
2265 p->k,
2266 p->v,
2267 attn_token,
2268 H,
2269 H_kv,
2270 /*kv_tokens=*/token_index + 1,
2271 cache_capacity,
2272 hd,
2273 ad);
2274 ck_debug_check_buffer("attn_token (after attention)", attn_token, (int)q_elems);
2275
2276 /* Quantized output projection (Wo) with Q8_K activations. */
2277 quantize_row_q8_k(attn_token, q8_buf, aligned_D);
2278 gemm_nt_q4_k_q8_k(q8_buf,
2279 p->wo,
2280 p->bo,
2281 proj_row,
2282 /*M=*/1,
2283 aligned_D,
2284 /*K=*/K_concat);
2285 ck_debug_check_buffer("proj_row (after Wo proj)", proj_row, aligned_D);
2286
2287 for (int j = D; j < aligned_D; ++j) {
2288 proj_row[j] = 0.0f;
2289 }
2290
2291 /* Residual + LN2 / RMSNorm. */
2293 proj_row,
2294 residual_row,
2295 /*tokens=*/1,
2296 aligned_D);
2297
2298 rmsnorm_forward(residual_row,
2299 p->ln2_gamma,
2300 ln2_row,
2301 ln2_rstd,
2302 /*tokens=*/1,
2303 D,
2304 aligned_D,
2305 p->eps);
2306
2307 /* MLP block for this token (Q8_K activations). */
2308 int up_dim = 2 * aligned_intermediate;
2309 float *fc1_row = p->fc1_out + token_slot * (size_t)up_dim;
2310 float *swiglu_row = p->swiglu_out + token_slot * (size_t)aligned_intermediate;
2311
2313 p->w1,
2314 p->b1,
2315 p->w2,
2316 p->b2,
2317 fc1_row,
2318 swiglu_row,
2319 mlp_row,
2320 aligned_D,
2321 aligned_intermediate);
2322 ck_debug_check_buffer("mlp_row (after MLP)", mlp_row, aligned_D);
2323
2324 /* Final residual. */
2325 ck_residual_add_token_major(residual_row,
2326 mlp_row,
2327 out_row,
2328 /*tokens=*/1,
2329 aligned_D);
2330 ck_debug_check_buffer("out_row (final output)", out_row, aligned_D);
2331 return;
2332 }
2333 }
2334
2335 /* Project Q/K/V for the new token (Q4_K weights). */
2337 p->wq, p->bq,
2338 p->wk, p->bk,
2339 p->wv, p->bv,
2340 q_token, k_token, v_token,
2341 aligned_D,
2342 H,
2343 H_kv,
2344 ad);
2345
2346 /* RoPE for the new token at absolute position `p->rope_pos_offset`. */
2347 if (p->rope_cos && p->rope_sin) {
2348 rope_forward_qk(q_token,
2349 k_token,
2350 p->rope_cos,
2351 p->rope_sin,
2352 H,
2353 H_kv,
2354 /*num_tokens=*/1,
2355 hd,
2356 ad,
2357 p->rope_pos_offset);
2358 }
2359
2360 /* Update KV cache. */
2362 v_token,
2363 p->k,
2364 p->v,
2365 H_kv,
2366 token_index,
2367 cache_capacity,
2368 hd,
2369 ad);
2370
2371 /* Decode attention for this token using the KV cache. */
2373 p->k,
2374 p->v,
2375 attn_token,
2376 H,
2377 H_kv,
2378 /*kv_tokens=*/token_index + 1,
2379 cache_capacity,
2380 hd,
2381 ad);
2382
2383 /* Quantized output projection: Wo is stored as a flattened Q4_K matrix. */
2384 gemm_nt_q4_k(attn_token,
2385 p->wo,
2386 p->bo,
2387 proj_row,
2388 /*M=*/1,
2389 aligned_D,
2390 /*K=*/K_concat);
2391
2392 for (int j = D; j < aligned_D; ++j) {
2393 proj_row[j] = 0.0f;
2394 }
2395
2396 /* Residual + LN2 / RMSNorm. */
2398 proj_row,
2399 residual_row,
2400 /*tokens=*/1,
2401 aligned_D);
2402
2403 rmsnorm_forward(residual_row,
2404 p->ln2_gamma,
2405 ln2_row,
2406 ln2_rstd,
2407 /*tokens=*/1,
2408 D,
2409 aligned_D,
2410 p->eps);
2411
2412 /* MLP block for this token. */
2413 int up_dim = 2 * aligned_intermediate;
2414 float *fc1_row = p->fc1_out + token_slot * (size_t)up_dim;
2415 float *swiglu_row = p->swiglu_out + token_slot * (size_t)aligned_intermediate;
2416
2418 p->w1,
2419 p->b1,
2420 p->w2,
2421 p->b2,
2422 fc1_row,
2423 swiglu_row,
2424 mlp_row,
2425 /*tokens=*/1,
2426 aligned_D,
2427 aligned_intermediate);
2428
2429 /* Final residual. */
2430 ck_residual_add_token_major(residual_row,
2431 mlp_row,
2432 out_row,
2433 /*tokens=*/1,
2434 aligned_D);
2435}
void gemm_nt_q4_k_q8_k(const void *A_q8, const void *B, const float *bias, float *C, int M, int N, int K)
void quantize_row_q8_k(const float *x, void *y, int k)
void attention_forward_decode_head_major_gqa_regular(const float *q_token, const float *k_cache, const float *v_cache, float *out_token, int num_heads, int num_kv_heads, int kv_tokens, int cache_capacity, int head_dim, int aligned_head_dim)
WARNING: This is NOT true flash attention!
static void ck_qkv_project_head_major_token_q4_k_q8_k(const block_q8_K *input_q8, const void *wq, const float *bq, const void *wk, const float *bk, const void *wv, const float *bv, float *q_token, float *k_token, float *v_token, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
static int ck_q8k_activations_enabled(void)
static void ck_mlp_swiglu_forward_q4_k_q8_k(const float *input, const void *w1, const float *b1, const void *w2, const float *b2, float *fc1_out, float *swiglu_out, float *output, int aligned_embed_dim, int aligned_intermediate_dim)
static void ck_debug_check_q8k(const char *stage, const void *q8_buf, int num_blocks)
static void ck_mlp_swiglu_forward_q4_k(const float *input, const void *w1, const float *b1, const void *w2, const float *b2, float *fc1_out, float *swiglu_out, float *output, int tokens, int aligned_embed_dim, int aligned_intermediate_dim)
static void ck_debug_check_q4k_weights(const char *stage, const void *q4_buf, int num_blocks)
static void ck_debug_check_buffer(const char *stage, const float *buf, int size)
static void ck_qkv_project_head_major_token_q4_k(const float *input_row, const void *wq, const float *bq, const void *wk, const float *bk, const void *wv, const float *bv, float *q_token, float *k_token, float *v_token, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
#define QK_K

References CKLayerForwardParamsQ4K::aligned_embed_dim, CKLayerForwardParamsQ4K::aligned_head_dim, CKLayerForwardParamsQ4K::aligned_intermediate_dim, attention_forward_decode_head_major_gqa_regular(), CKLayerForwardParamsQ4K::b1, CKLayerForwardParamsQ4K::b2, CKLayerForwardParamsQ4K::bk, CKLayerForwardParamsQ4K::bo, CKLayerForwardParamsQ4K::bq, CKLayerForwardParamsQ4K::bv, ck_attention_flash_decode_wrapper(), ck_debug_check_buffer(), ck_debug_check_q4k_weights(), ck_debug_check_q8k(), ck_mlp_swiglu_forward_q4_k(), ck_mlp_swiglu_forward_q4_k_q8_k(), ck_q8k_activations_enabled(), ck_qkv_project_head_major_token_q4_k(), ck_qkv_project_head_major_token_q4_k_q8_k(), ck_residual_add_token_major(), CKLayerForwardParamsQ4K::embed_dim, CKLayerForwardParamsQ4K::eps, CKLayerForwardParamsQ4K::fc1_out, gemm_nt_q4_k(), gemm_nt_q4_k_q8_k(), CKLayerForwardParamsQ4K::head_dim, CKLayerForwardParamsQ4K::input, CKLayerForwardParamsQ4K::k, kv_cache_write_head_major(), CKLayerForwardParamsQ4K::ln1_gamma, CKLayerForwardParamsQ4K::ln1_out, CKLayerForwardParamsQ4K::ln1_rstd, CKLayerForwardParamsQ4K::ln2_gamma, CKLayerForwardParamsQ4K::ln2_out, CKLayerForwardParamsQ4K::ln2_rstd, CKLayerForwardParamsQ4K::mlp_out, CKLayerForwardParamsQ4K::num_heads, CKLayerForwardParamsQ4K::num_kv_heads, CKLayerForwardParamsQ4K::output, CKLayerForwardParamsQ4K::proj_tmp, QK_K, quantize_row_q8_k(), CKLayerForwardParamsQ4K::residual1, rmsnorm_forward(), CKLayerForwardParamsQ4K::rope_cos, rope_forward_qk(), CKLayerForwardParamsQ4K::rope_pos_offset, CKLayerForwardParamsQ4K::rope_sin, CKLayerForwardParamsQ4K::swiglu_out, CKLayerForwardParamsQ4K::v, CKLayerForwardParamsQ4K::w1, CKLayerForwardParamsQ4K::w2, CKLayerForwardParamsQ4K::wk, CKLayerForwardParamsQ4K::wo, CKLayerForwardParamsQ4K::wq, and CKLayerForwardParamsQ4K::wv.

◆ ck_layer_forward_rmsnorm_swiglu_decode_quant()

void ck_layer_forward_rmsnorm_swiglu_decode_quant ( const CKLayerForwardParamsQ4K p,
int  token_index,
int  cache_capacity 
)

Definition at line 2548 of file ckernel_orchestration.c.

2551{
2552 if (!p) {
2553 return;
2554 }
2555 if (!p->input || !p->ln1_gamma || !p->ln2_gamma || !p->ln1_out || !p->ln2_out ||
2556 !p->wq || !p->wk || !p->wv || !p->wo || !p->w1 || !p->w2 ||
2557 !p->k || !p->v ||
2558 !p->proj_tmp || !p->proj_scratch || !p->residual1 || !p->fc1_out || !p->swiglu_out || !p->mlp_out || !p->output) {
2559 return;
2560 }
2561 if (token_index < 0 || cache_capacity <= 0 || token_index >= cache_capacity) {
2562 return;
2563 }
2564
2565 const int D = p->embed_dim;
2566 const int aligned_D = p->aligned_embed_dim;
2567 const int H = p->num_heads;
2568 const int H_kv = p->num_kv_heads;
2569 const int hd = p->head_dim;
2570 const int ad = p->aligned_head_dim;
2571 const int aligned_intermediate = p->aligned_intermediate_dim;
2572 const int K_concat = H * ad;
2573
2574 /* Decode buffers are single-token; token_index only applies to KV cache. */
2575 const size_t token_slot = 0;
2576 const float *input_row = p->input + token_slot * (size_t)aligned_D;
2577 float *ln1_row = p->ln1_out + token_slot * (size_t)aligned_D;
2578 float *ln2_row = p->ln2_out + token_slot * (size_t)aligned_D;
2579 float *proj_row = p->proj_tmp + token_slot * (size_t)aligned_D;
2580 float *residual_row = p->residual1 + token_slot * (size_t)aligned_D;
2581 float *mlp_row = p->mlp_out + token_slot * (size_t)aligned_D;
2582 float *out_row = p->output + token_slot * (size_t)aligned_D;
2583
2584 float ln1_rstd_tmp = 0.0f;
2585 float ln2_rstd_tmp = 0.0f;
2586 float *ln1_rstd = p->ln1_rstd ? (p->ln1_rstd + token_slot) : &ln1_rstd_tmp;
2587 float *ln2_rstd = p->ln2_rstd ? (p->ln2_rstd + token_slot) : &ln2_rstd_tmp;
2588
2589 size_t q_elems = (size_t)H * (size_t)ad;
2590 size_t kv_elems = (size_t)H_kv * (size_t)ad;
2591 float q_token[q_elems];
2592 float k_token[kv_elems];
2593 float v_token[kv_elems];
2594 float attn_token[q_elems];
2595
2596 rmsnorm_forward(input_row,
2597 p->ln1_gamma,
2598 ln1_row,
2599 ln1_rstd,
2600 /*tokens=*/1,
2601 D,
2602 aligned_D,
2603 p->eps);
2604
2606 p->wq, p->bq, p->wq_dtype,
2607 p->wk, p->bk, p->wk_dtype,
2608 p->wv, p->bv, p->wv_dtype,
2609 q_token, k_token, v_token,
2610 aligned_D,
2611 H,
2612 H_kv,
2613 ad);
2614
2615 if (p->rope_cos && p->rope_sin) {
2616 rope_forward_qk(q_token,
2617 k_token,
2618 p->rope_cos,
2619 p->rope_sin,
2620 H,
2621 H_kv,
2622 /*num_tokens=*/1,
2623 hd,
2624 ad,
2625 p->rope_pos_offset);
2626 }
2627
2629 v_token,
2630 p->k,
2631 p->v,
2632 H_kv,
2633 token_index,
2634 cache_capacity,
2635 hd,
2636 ad);
2637
2639 p->k,
2640 p->v,
2641 attn_token,
2642 H,
2643 H_kv,
2644 /*kv_tokens=*/token_index + 1,
2645 cache_capacity,
2646 hd,
2647 ad);
2648
2649 if (p->wo_dtype == CK_DT_FP32) {
2651 (const float *)p->wo,
2652 p->bo,
2653 proj_row,
2654 D,
2655 aligned_D,
2656 H,
2657 ad);
2658 } else {
2659 /* Quantized attention output projection - handle all quant types */
2660 ck_gemm_nt_quant(attn_token,
2661 p->wo,
2662 p->bo,
2663 proj_row,
2664 /*M=*/1,
2665 aligned_D,
2666 /*K=*/K_concat,
2667 p->wo_dtype);
2668 for (int j = D; j < aligned_D; ++j) {
2669 proj_row[j] = 0.0f;
2670 }
2671 }
2672
2674 proj_row,
2675 residual_row,
2676 /*tokens=*/1,
2677 aligned_D);
2678
2679 rmsnorm_forward(residual_row,
2680 p->ln2_gamma,
2681 ln2_row,
2682 ln2_rstd,
2683 /*tokens=*/1,
2684 D,
2685 aligned_D,
2686 p->eps);
2687
2688 int up_dim = 2 * aligned_intermediate;
2689 float *fc1_row = p->fc1_out + token_slot * (size_t)up_dim;
2690 float *swiglu_row = p->swiglu_out + token_slot * (size_t)aligned_intermediate;
2691
2693 p->w1,
2694 p->b1,
2695 p->w1_dtype,
2696 p->w2,
2697 p->b2,
2698 p->w2_dtype,
2699 fc1_row,
2700 swiglu_row,
2701 mlp_row,
2702 /*tokens=*/1,
2703 aligned_D,
2704 aligned_intermediate);
2705
2706 ck_residual_add_token_major(residual_row,
2707 mlp_row,
2708 out_row,
2709 /*tokens=*/1,
2710 aligned_D);
2711}
static void ck_mlp_swiglu_forward_quant(const float *input, const void *w1, const float *b1, CKDataType w1_dtype, const void *w2, const float *b2, CKDataType w2_dtype, float *fc1_out, float *swiglu_out, float *output, int tokens, int aligned_embed_dim, int aligned_intermediate_dim)
void ck_gemm_nt_quant(const float *A, const void *B, const float *bias, float *C, int M, int N, int K, CKDataType dtype)
static void ck_qkv_project_head_major_token_quant(const float *input_row, const void *wq, const float *bq, CKDataType wq_dtype, const void *wk, const float *bk, CKDataType wk_dtype, const void *wv, const float *bv, CKDataType wv_dtype, float *q_token, float *k_token, float *v_token, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)

References CKLayerForwardParamsQ4K::aligned_embed_dim, CKLayerForwardParamsQ4K::aligned_head_dim, CKLayerForwardParamsQ4K::aligned_intermediate_dim, CKLayerForwardParamsQ4K::b1, CKLayerForwardParamsQ4K::b2, CKLayerForwardParamsQ4K::bk, CKLayerForwardParamsQ4K::bo, CKLayerForwardParamsQ4K::bq, CKLayerForwardParamsQ4K::bv, ck_attention_flash_decode_wrapper(), ck_attention_project_head_major_decode_token(), CK_DT_FP32, ck_gemm_nt_quant(), ck_mlp_swiglu_forward_quant(), ck_qkv_project_head_major_token_quant(), ck_residual_add_token_major(), CKLayerForwardParamsQ4K::embed_dim, CKLayerForwardParamsQ4K::eps, CKLayerForwardParamsQ4K::fc1_out, CKLayerForwardParamsQ4K::head_dim, CKLayerForwardParamsQ4K::input, CKLayerForwardParamsQ4K::k, kv_cache_write_head_major(), CKLayerForwardParamsQ4K::ln1_gamma, CKLayerForwardParamsQ4K::ln1_out, CKLayerForwardParamsQ4K::ln1_rstd, CKLayerForwardParamsQ4K::ln2_gamma, CKLayerForwardParamsQ4K::ln2_out, CKLayerForwardParamsQ4K::ln2_rstd, CKLayerForwardParamsQ4K::mlp_out, CKLayerForwardParamsQ4K::num_heads, CKLayerForwardParamsQ4K::num_kv_heads, CKLayerForwardParamsQ4K::output, CKLayerForwardParamsQ4K::proj_scratch, CKLayerForwardParamsQ4K::proj_tmp, CKLayerForwardParamsQ4K::residual1, rmsnorm_forward(), CKLayerForwardParamsQ4K::rope_cos, rope_forward_qk(), CKLayerForwardParamsQ4K::rope_pos_offset, CKLayerForwardParamsQ4K::rope_sin, CKLayerForwardParamsQ4K::swiglu_out, CKLayerForwardParamsQ4K::v, CKLayerForwardParamsQ4K::w1, CKLayerForwardParamsQ4K::w1_dtype, CKLayerForwardParamsQ4K::w2, CKLayerForwardParamsQ4K::w2_dtype, CKLayerForwardParamsQ4K::wk, CKLayerForwardParamsQ4K::wk_dtype, CKLayerForwardParamsQ4K::wo, CKLayerForwardParamsQ4K::wo_dtype, CKLayerForwardParamsQ4K::wq, CKLayerForwardParamsQ4K::wq_dtype, CKLayerForwardParamsQ4K::wv, and CKLayerForwardParamsQ4K::wv_dtype.

◆ ck_layer_forward_rmsnorm_swiglu_q4_k()

void ck_layer_forward_rmsnorm_swiglu_q4_k ( const CKLayerForwardParamsQ4K p)

Definition at line 1946 of file ckernel_orchestration.c.

1947{
1948 if (!p) {
1949 return;
1950 }
1951
1952 const int aligned_D = p->aligned_embed_dim;
1953 const int aligned_intermediate = p->aligned_intermediate_dim;
1954
1956 p->ln1_gamma,
1957 p->ln1_out,
1958 p->ln1_rstd,
1959 p->tokens,
1960 p->embed_dim,
1961 aligned_D,
1962 p->eps);
1963
1965 if ((aligned_D % QK_K) == 0 && (aligned_intermediate % QK_K) == 0) {
1967 p->wq, p->bq,
1968 p->wk, p->bk,
1969 p->wv, p->bv,
1970 p->q, p->k, p->v,
1971 p->tokens,
1972 p->tokens,
1973 aligned_D,
1974 p->num_heads,
1975 p->num_kv_heads,
1976 p->aligned_head_dim);
1977
1978 if (p->rope_cos && p->rope_sin) {
1979 rope_forward_qk(p->q,
1980 p->k,
1981 p->rope_cos,
1982 p->rope_sin,
1983 p->num_heads,
1984 p->num_kv_heads,
1985 p->tokens,
1986 p->head_dim,
1988 p->rope_pos_offset);
1989 }
1990
1991 if (p->scores) {
1993 p->k,
1994 p->v,
1995 p->scores,
1996 p->attn_out,
1997 p->num_heads,
1998 p->num_kv_heads,
1999 p->tokens,
2000 p->head_dim,
2003 } else {
2005 p->k,
2006 p->v,
2007 p->attn_out,
2008 p->num_heads,
2009 p->num_kv_heads,
2010 p->tokens,
2011 p->head_dim,
2012 p->aligned_head_dim);
2013 }
2014
2016 p->wo,
2017 p->bo,
2018 p->proj_tmp,
2019 p->tokens,
2020 aligned_D,
2021 p->num_heads,
2022 p->aligned_head_dim);
2023
2025 p->proj_tmp,
2026 p->residual1,
2027 p->tokens,
2028 aligned_D);
2029
2031 p->ln2_gamma,
2032 p->ln2_out,
2033 p->ln2_rstd,
2034 p->tokens,
2035 p->embed_dim,
2036 aligned_D,
2037 p->eps);
2038
2040 p->w1,
2041 p->b1,
2042 p->w2,
2043 p->b2,
2044 p->fc1_out,
2045 p->swiglu_out,
2046 p->mlp_out,
2047 p->tokens,
2048 aligned_D,
2049 aligned_intermediate);
2050
2052 p->mlp_out,
2053 p->output,
2054 p->tokens,
2055 aligned_D);
2056 return;
2057 }
2058 }
2059
2061 p->wq, p->bq,
2062 p->wk, p->bk,
2063 p->wv, p->bv,
2064 p->q, p->k, p->v,
2065 p->tokens,
2066 p->tokens,
2067 aligned_D,
2068 p->num_heads,
2069 p->num_kv_heads,
2070 p->aligned_head_dim);
2071
2072 if (p->rope_cos && p->rope_sin) {
2073 rope_forward_qk(p->q,
2074 p->k,
2075 p->rope_cos,
2076 p->rope_sin,
2077 p->num_heads,
2078 p->num_kv_heads,
2079 p->tokens,
2080 p->head_dim,
2082 p->rope_pos_offset);
2083 }
2084
2085 if (p->scores) {
2087 p->k,
2088 p->v,
2089 p->scores,
2090 p->attn_out,
2091 p->num_heads,
2092 p->num_kv_heads,
2093 p->tokens,
2094 p->head_dim,
2097 } else {
2099 p->k,
2100 p->v,
2101 p->attn_out,
2102 p->num_heads,
2103 p->num_kv_heads,
2104 p->tokens,
2105 p->head_dim,
2106 p->aligned_head_dim);
2107 }
2108
2110 p->wo,
2111 p->bo,
2112 p->proj_tmp,
2113 p->proj_scratch,
2114 p->tokens,
2116 p->num_heads,
2117 p->aligned_head_dim);
2118
2120 p->proj_tmp,
2121 p->residual1,
2122 p->tokens,
2124
2126 p->ln2_gamma,
2127 p->ln2_out,
2128 p->ln2_rstd,
2129 p->tokens,
2130 p->embed_dim,
2132 p->eps);
2133
2135 p->w1,
2136 p->b1,
2137 p->w2,
2138 p->b2,
2139 p->fc1_out,
2140 p->swiglu_out,
2141 p->mlp_out,
2142 p->tokens,
2145
2147 p->mlp_out,
2148 p->output,
2149 p->tokens,
2151}
static void ck_attention_project_head_major_q4_k(const float *attn_out, const void *wo, const float *bo, float *out, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)
static void ck_qkv_project_head_major_q4_k_q8_k(const float *input, const void *wq, const float *bq, const void *wk, const float *bk, const void *wv, const float *bv, float *q, float *k, float *v, int tokens, int kv_stride_tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
static void ck_attention_project_head_major_q4_k_q8_k(const float *attn_out, const void *wo, const float *bo, float *out, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)
static void ck_qkv_project_head_major_q4_k(const float *input, const void *wq, const float *bq, const void *wk, const float *bk, const void *wv, const float *bv, float *q, float *k, float *v, int tokens, int kv_stride_tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
static void ck_mlp_swiglu_forward_q4_k_q8_k_prefill(const float *input, const void *w1, const float *b1, const void *w2, const float *b2, float *fc1_out, float *swiglu_out, float *output, int tokens, int aligned_embed_dim, int aligned_intermediate_dim)

References CKLayerForwardParamsQ4K::aligned_context_window, CKLayerForwardParamsQ4K::aligned_embed_dim, CKLayerForwardParamsQ4K::aligned_head_dim, CKLayerForwardParamsQ4K::aligned_intermediate_dim, attention_forward_causal_head_major_gqa(), attention_forward_causal_head_major_gqa_flash(), CKLayerForwardParamsQ4K::attn_out, CKLayerForwardParamsQ4K::b1, CKLayerForwardParamsQ4K::b2, CKLayerForwardParamsQ4K::bk, CKLayerForwardParamsQ4K::bo, CKLayerForwardParamsQ4K::bq, CKLayerForwardParamsQ4K::bv, ck_attention_project_head_major_q4_k(), ck_attention_project_head_major_q4_k_q8_k(), ck_mlp_swiglu_forward_q4_k(), ck_mlp_swiglu_forward_q4_k_q8_k_prefill(), ck_q8k_activations_enabled(), ck_qkv_project_head_major_q4_k(), ck_qkv_project_head_major_q4_k_q8_k(), ck_residual_add_token_major(), CKLayerForwardParamsQ4K::embed_dim, CKLayerForwardParamsQ4K::eps, CKLayerForwardParamsQ4K::fc1_out, CKLayerForwardParamsQ4K::head_dim, CKLayerForwardParamsQ4K::input, CKLayerForwardParamsQ4K::k, CKLayerForwardParamsQ4K::ln1_gamma, CKLayerForwardParamsQ4K::ln1_out, CKLayerForwardParamsQ4K::ln1_rstd, CKLayerForwardParamsQ4K::ln2_gamma, CKLayerForwardParamsQ4K::ln2_out, CKLayerForwardParamsQ4K::ln2_rstd, CKLayerForwardParamsQ4K::mlp_out, CKLayerForwardParamsQ4K::num_heads, CKLayerForwardParamsQ4K::num_kv_heads, CKLayerForwardParamsQ4K::output, CKLayerForwardParamsQ4K::proj_scratch, CKLayerForwardParamsQ4K::proj_tmp, CKLayerForwardParamsQ4K::q, QK_K, CKLayerForwardParamsQ4K::residual1, rmsnorm_forward(), CKLayerForwardParamsQ4K::rope_cos, rope_forward_qk(), CKLayerForwardParamsQ4K::rope_pos_offset, CKLayerForwardParamsQ4K::rope_sin, CKLayerForwardParamsQ4K::scores, CKLayerForwardParamsQ4K::swiglu_out, CKLayerForwardParamsQ4K::tokens, CKLayerForwardParamsQ4K::v, CKLayerForwardParamsQ4K::w1, CKLayerForwardParamsQ4K::w2, CKLayerForwardParamsQ4K::wk, CKLayerForwardParamsQ4K::wo, CKLayerForwardParamsQ4K::wq, and CKLayerForwardParamsQ4K::wv.

◆ ck_layer_forward_rmsnorm_swiglu_quant()

void ck_layer_forward_rmsnorm_swiglu_quant ( const CKLayerForwardParamsQ4K p)

Definition at line 2437 of file ckernel_orchestration.c.

2438{
2439 if (!p) {
2440 return;
2441 }
2442
2444 p->ln1_gamma,
2445 p->ln1_out,
2446 p->ln1_rstd,
2447 p->tokens,
2448 p->embed_dim,
2450 p->eps);
2451
2453 p->wq, p->bq, p->wq_dtype,
2454 p->wk, p->bk, p->wk_dtype,
2455 p->wv, p->bv, p->wv_dtype,
2456 p->q, p->k, p->v,
2457 p->tokens,
2458 p->tokens,
2460 p->num_heads,
2461 p->num_kv_heads,
2462 p->aligned_head_dim);
2463
2464 if (p->rope_cos && p->rope_sin) {
2465 rope_forward_qk(p->q,
2466 p->k,
2467 p->rope_cos,
2468 p->rope_sin,
2469 p->num_heads,
2470 p->num_kv_heads,
2471 p->tokens,
2472 p->head_dim,
2474 p->rope_pos_offset);
2475 }
2476
2477 if (p->scores) {
2479 p->k,
2480 p->v,
2481 p->scores,
2482 p->attn_out,
2483 p->num_heads,
2484 p->num_kv_heads,
2485 p->tokens,
2486 p->head_dim,
2489 } else {
2491 p->k,
2492 p->v,
2493 p->attn_out,
2494 p->num_heads,
2495 p->num_kv_heads,
2496 p->tokens,
2497 p->head_dim,
2498 p->aligned_head_dim);
2499 }
2500
2502 p->wo,
2503 p->bo,
2504 p->proj_tmp,
2505 p->proj_scratch,
2506 p->tokens,
2508 p->num_heads,
2510 p->wo_dtype);
2511
2513 p->proj_tmp,
2514 p->residual1,
2515 p->tokens,
2517
2519 p->ln2_gamma,
2520 p->ln2_out,
2521 p->ln2_rstd,
2522 p->tokens,
2523 p->embed_dim,
2525 p->eps);
2526
2528 p->w1,
2529 p->b1,
2530 p->w1_dtype,
2531 p->w2,
2532 p->b2,
2533 p->w2_dtype,
2534 p->fc1_out,
2535 p->swiglu_out,
2536 p->mlp_out,
2537 p->tokens,
2540
2542 p->mlp_out,
2543 p->output,
2544 p->tokens,
2546}
static void ck_qkv_project_head_major_quant(const float *input, const void *wq, const float *bq, CKDataType wq_dtype, const void *wk, const float *bk, CKDataType wk_dtype, const void *wv, const float *bv, CKDataType wv_dtype, float *q, float *k, float *v, int tokens, int kv_stride_tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
static void ck_attention_project_head_major_quant(const float *attn_out, const void *wo, const float *bo, float *out, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim, CKDataType wo_dtype)

References CKLayerForwardParamsQ4K::aligned_context_window, CKLayerForwardParamsQ4K::aligned_embed_dim, CKLayerForwardParamsQ4K::aligned_head_dim, CKLayerForwardParamsQ4K::aligned_intermediate_dim, attention_forward_causal_head_major_gqa(), attention_forward_causal_head_major_gqa_flash(), CKLayerForwardParamsQ4K::attn_out, CKLayerForwardParamsQ4K::b1, CKLayerForwardParamsQ4K::b2, CKLayerForwardParamsQ4K::bk, CKLayerForwardParamsQ4K::bo, CKLayerForwardParamsQ4K::bq, CKLayerForwardParamsQ4K::bv, ck_attention_project_head_major_quant(), ck_mlp_swiglu_forward_quant(), ck_qkv_project_head_major_quant(), ck_residual_add_token_major(), CKLayerForwardParamsQ4K::embed_dim, CKLayerForwardParamsQ4K::eps, CKLayerForwardParamsQ4K::fc1_out, CKLayerForwardParamsQ4K::head_dim, CKLayerForwardParamsQ4K::input, CKLayerForwardParamsQ4K::k, CKLayerForwardParamsQ4K::ln1_gamma, CKLayerForwardParamsQ4K::ln1_out, CKLayerForwardParamsQ4K::ln1_rstd, CKLayerForwardParamsQ4K::ln2_gamma, CKLayerForwardParamsQ4K::ln2_out, CKLayerForwardParamsQ4K::ln2_rstd, CKLayerForwardParamsQ4K::mlp_out, CKLayerForwardParamsQ4K::num_heads, CKLayerForwardParamsQ4K::num_kv_heads, CKLayerForwardParamsQ4K::output, CKLayerForwardParamsQ4K::proj_scratch, CKLayerForwardParamsQ4K::proj_tmp, CKLayerForwardParamsQ4K::q, CKLayerForwardParamsQ4K::residual1, rmsnorm_forward(), CKLayerForwardParamsQ4K::rope_cos, rope_forward_qk(), CKLayerForwardParamsQ4K::rope_pos_offset, CKLayerForwardParamsQ4K::rope_sin, CKLayerForwardParamsQ4K::scores, CKLayerForwardParamsQ4K::swiglu_out, CKLayerForwardParamsQ4K::tokens, CKLayerForwardParamsQ4K::v, CKLayerForwardParamsQ4K::w1, CKLayerForwardParamsQ4K::w1_dtype, CKLayerForwardParamsQ4K::w2, CKLayerForwardParamsQ4K::w2_dtype, CKLayerForwardParamsQ4K::wk, CKLayerForwardParamsQ4K::wk_dtype, CKLayerForwardParamsQ4K::wo, CKLayerForwardParamsQ4K::wo_dtype, CKLayerForwardParamsQ4K::wq, CKLayerForwardParamsQ4K::wq_dtype, CKLayerForwardParamsQ4K::wv, and CKLayerForwardParamsQ4K::wv_dtype.

◆ ck_layer_forward_rmsnorm_swiglu_ref()

void ck_layer_forward_rmsnorm_swiglu_ref ( const CKLayerForwardParams p)

Definition at line 1126 of file ckernel_orchestration.c.

1127{
1128 if (!p) {
1129 return;
1130 }
1131
1133 p->ln1_gamma,
1134 p->ln1_out,
1135 p->ln1_rstd,
1136 p->tokens,
1137 p->embed_dim,
1139 p->eps);
1140
1142 p->wq, p->bq,
1143 p->wk, p->bk,
1144 p->wv, p->bv,
1145 p->q, p->k, p->v,
1146 p->tokens,
1147 p->tokens,
1149 p->num_heads,
1150 p->num_kv_heads,
1151 p->aligned_head_dim);
1152
1153 if (p->rope_cos && p->rope_sin) {
1154 rope_forward_qk(p->q,
1155 p->k,
1156 p->rope_cos,
1157 p->rope_sin,
1158 p->num_heads,
1159 p->num_kv_heads,
1160 p->tokens,
1161 p->head_dim,
1163 p->rope_pos_offset);
1164 }
1165
1166 if (p->scores) {
1169 p->k,
1170 p->v,
1171 p->scores,
1172 p->attn_out,
1173 p->num_heads,
1174 p->num_kv_heads,
1175 p->tokens,
1176 p->head_dim,
1179 } else {
1181 p->k,
1182 p->v,
1183 p->scores,
1184 p->attn_out,
1185 p->num_heads,
1186 p->num_kv_heads,
1187 p->tokens,
1188 p->head_dim,
1191 }
1192 } else {
1194 p->k,
1195 p->v,
1196 p->attn_out,
1197 p->num_heads,
1198 p->num_kv_heads,
1199 p->tokens,
1200 p->head_dim,
1201 p->aligned_head_dim);
1202 }
1203
1205 p->wo,
1206 p->bo,
1207 p->proj_tmp,
1208 p->proj_scratch,
1209 p->tokens,
1211 p->num_heads,
1212 p->aligned_head_dim);
1213
1215 p->proj_tmp,
1216 p->residual1,
1217 p->tokens,
1219
1221 p->ln2_gamma,
1222 p->ln2_out,
1223 p->ln2_rstd,
1224 p->tokens,
1225 p->embed_dim,
1227 p->eps);
1228
1230 p->w1,
1231 p->b1,
1232 p->w2,
1233 p->b2,
1234 p->fc1_out,
1235 p->swiglu_out,
1236 p->mlp_out,
1237 p->tokens,
1240
1242 p->mlp_out,
1243 p->output,
1244 p->tokens,
1246}
static void ck_attention_project_head_major_ref(const float *attn_out, const float *wo, const float *bo, float *out, float *scratch, int tokens, int aligned_embed_dim, int num_heads, int aligned_head_dim)
static void ck_qkv_project_head_major_ref(const float *input, const float *wq, const float *bq, const float *wk, const float *bk, const float *wv, const float *bv, float *q, float *k, float *v, int tokens, int kv_stride_tokens, int aligned_embed_dim, int num_heads, int num_kv_heads, int aligned_head_dim)
static void ck_mlp_swiglu_forward_ref(const float *input, const float *w1, const float *b1, const float *w2, const float *b2, float *fc1_out, float *swiglu_out, float *output, int tokens, int aligned_embed_dim, int aligned_intermediate_dim)

References CKLayerForwardParams::aligned_context_window, CKLayerForwardParams::aligned_embed_dim, CKLayerForwardParams::aligned_head_dim, CKLayerForwardParams::aligned_intermediate_dim, attention_forward_causal_head_major_gqa(), attention_forward_causal_head_major_gqa_exact(), attention_forward_causal_head_major_gqa_flash(), CKLayerForwardParams::attn_out, CKLayerForwardParams::b1, CKLayerForwardParams::b2, CKLayerForwardParams::bk, CKLayerForwardParams::bo, CKLayerForwardParams::bq, CKLayerForwardParams::bv, ck_attention_project_head_major_ref(), ck_mlp_swiglu_forward_ref(), ck_qkv_project_head_major_ref(), ck_residual_add_token_major(), ck_strict_parity_enabled(), CKLayerForwardParams::embed_dim, CKLayerForwardParams::eps, CKLayerForwardParams::fc1_out, CKLayerForwardParams::head_dim, CKLayerForwardParams::input, CKLayerForwardParams::k, CKLayerForwardParams::ln1_gamma, CKLayerForwardParams::ln1_out, CKLayerForwardParams::ln1_rstd, CKLayerForwardParams::ln2_gamma, CKLayerForwardParams::ln2_out, CKLayerForwardParams::ln2_rstd, CKLayerForwardParams::mlp_out, CKLayerForwardParams::num_heads, CKLayerForwardParams::num_kv_heads, CKLayerForwardParams::output, CKLayerForwardParams::proj_scratch, CKLayerForwardParams::proj_tmp, CKLayerForwardParams::q, CKLayerForwardParams::residual1, rmsnorm_forward(), CKLayerForwardParams::rope_cos, rope_forward_qk(), CKLayerForwardParams::rope_pos_offset, CKLayerForwardParams::rope_sin, CKLayerForwardParams::scores, CKLayerForwardParams::swiglu_out, CKLayerForwardParams::tokens, CKLayerForwardParams::v, CKLayerForwardParams::w1, CKLayerForwardParams::w2, CKLayerForwardParams::wk, CKLayerForwardParams::wo, CKLayerForwardParams::wq, and CKLayerForwardParams::wv.

◆ ck_mlp_swiglu_forward()

void ck_mlp_swiglu_forward ( const float *  input,
const float *  w1,
const float *  b1,
const float *  w2,
const float *  b2,
float *  fc1_out,
float *  swiglu_out,
float *  output,
int  tokens,
int  aligned_embed_dim,
int  aligned_intermediate_dim 
)

Definition at line 952 of file ckernel_orchestration.c.

963{
964 int up_dim = 2 * aligned_intermediate_dim;
965 gemm_blocked_serial(input, w1, b1, fc1_out,
966 tokens, up_dim, aligned_embed_dim);
967
969 swiglu_forward_exact(fc1_out, swiglu_out, tokens, aligned_intermediate_dim);
970 } else {
971 swiglu_forward(fc1_out, swiglu_out, tokens, aligned_intermediate_dim);
972 }
973
974 gemm_blocked_serial(swiglu_out, w2, b2, output,
975 tokens, aligned_embed_dim, aligned_intermediate_dim);
976}
void swiglu_forward_exact(const float *input, float *output, int tokens, int dim)
void swiglu_forward(const float *input, float *output, int tokens, int dim)

References ck_strict_parity_enabled(), gemm_blocked_serial(), swiglu_forward(), and swiglu_forward_exact().

Referenced by ck_layer_forward_rmsnorm_swiglu(), ck_layer_forward_rmsnorm_swiglu_decode(), and ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_impl().

◆ ck_mlp_swiglu_forward_fully_fused_token()

void ck_mlp_swiglu_forward_fully_fused_token ( const float *  input_row,
const float *  w1,
const float *  b1,
const float *  w2,
const float *  b2,
float *  output_row,
int  aligned_embed_dim,
int  aligned_intermediate_dim 
)

Definition at line 1283 of file ckernel_orchestration.c.

1291{
1292 if (!input_row || !w1 || !w2 || !output_row) {
1293 return;
1294 }
1295
1296 // Split w1 into gate and up projections
1297 // w1 layout: [2 * aligned_intermediate_dim, aligned_embed_dim]
1298 // First half: W_gate [aligned_intermediate_dim, aligned_embed_dim]
1299 // Second half: W_up [aligned_intermediate_dim, aligned_embed_dim]
1300 const float *w_gate = w1;
1301 const float *w_up = w1 + (size_t)aligned_intermediate_dim * (size_t)aligned_embed_dim;
1302
1303 // Split b1 into gate and up biases (if present)
1304 const float *b_gate = b1;
1305 const float *b_up = b1 ? (b1 + aligned_intermediate_dim) : NULL;
1306
1307 // w2 is W_down: [aligned_embed_dim, aligned_intermediate_dim]
1308 const float *w_down = w2;
1309 const float *b_down = b2;
1310
1311 // Call the fully fused kernel - eliminates DRAM round-trip for swiglu
1312 // Uses aligned dimensions since weights are stored with alignment padding
1314 w_gate,
1315 w_up,
1316 w_down,
1317 b_gate,
1318 b_up,
1319 b_down,
1320 output_row,
1321 aligned_embed_dim,
1322 aligned_intermediate_dim);
1323}
void fused_mlp_swiglu_decode_v2(const float *x, const float *W_gate, const float *W_up, const float *W_down, const float *b_gate, const float *b_up, const float *b_down, float *output, int D, int Hff)

References fused_mlp_swiglu_decode_v2().

Referenced by ck_layer_forward_rmsnorm_swiglu_decode_fused(), and ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_impl().

◆ ck_mlp_swiglu_forward_fused_token()

void ck_mlp_swiglu_forward_fused_token ( const float *  input_row,
const float *  w1,
const float *  b1,
const float *  w2,
const float *  b2,
float *  swiglu_row,
float *  output_row,
int  aligned_embed_dim,
int  aligned_intermediate_dim 
)

Definition at line 1248 of file ckernel_orchestration.c.

1257{
1258 if (!input_row || !w1 || !w2 || !swiglu_row || !output_row) {
1259 return;
1260 }
1261
1262 const float *w_gate = w1;
1263 const float *w_up = w1 + (size_t)aligned_intermediate_dim * (size_t)aligned_embed_dim;
1264 const float *b_gate = b1;
1265 const float *b_up = b1 ? (b1 + aligned_intermediate_dim) : NULL;
1266
1267 gemm_swiglu_fused(input_row,
1268 w_gate,
1269 w_up,
1270 b_gate,
1271 b_up,
1272 swiglu_row,
1273 /*M=*/1,
1274 /*N=*/aligned_intermediate_dim,
1275 /*K=*/aligned_embed_dim);
1276
1277 gemm_blocked_serial(swiglu_row, w2, b2, output_row,
1278 /*M=*/1,
1279 /*N=*/aligned_embed_dim,
1280 /*K=*/aligned_intermediate_dim);
1281}
void gemm_swiglu_fused(const float *x, const float *W_gate, const float *W_up, const float *b_gate, const float *b_up, float *output, int M, int N, int K)

References gemm_blocked_serial(), and gemm_swiglu_fused().

◆ ck_qkv_project_head_major()

void ck_qkv_project_head_major ( const float *  input,
const float *  wq,
const float *  bq,
const float *  wk,
const float *  bk,
const float *  wv,
const float *  bv,
float *  q,
float *  k,
float *  v,
int  tokens,
int  kv_stride_tokens,
int  aligned_embed_dim,
int  num_heads,
int  num_kv_heads,
int  aligned_head_dim 
)

Definition at line 168 of file ckernel_orchestration.c.

179{
180 if (!input || !wq || !wk || !wv || !q || !k || !v) {
181 return;
182 }
183 if (kv_stride_tokens < tokens) {
184 return;
185 }
186
187 size_t head_weight_stride = (size_t)aligned_head_dim * (size_t)aligned_embed_dim;
188 size_t q_head_stride = (size_t)tokens * (size_t)aligned_head_dim;
189 size_t kv_head_stride = (size_t)kv_stride_tokens * (size_t)aligned_head_dim;
190
191 for (int h = 0; h < num_heads; ++h) {
192 const float *wq_h = wq + (size_t)h * head_weight_stride;
193 const float *bq_h = bq ? (bq + (size_t)h * (size_t)aligned_head_dim) : NULL;
194 float *q_h = q + (size_t)h * q_head_stride;
195
196 gemm_blocked_serial(input, wq_h, bq_h, q_h,
197 tokens, aligned_head_dim, aligned_embed_dim);
198 }
199
200 for (int h = 0; h < num_kv_heads; ++h) {
201 const float *wk_h = wk + (size_t)h * head_weight_stride;
202 const float *wv_h = wv + (size_t)h * head_weight_stride;
203
204 const float *bk_h = bk ? (bk + (size_t)h * (size_t)aligned_head_dim) : NULL;
205 const float *bv_h = bv ? (bv + (size_t)h * (size_t)aligned_head_dim) : NULL;
206
207 float *k_h = k + (size_t)h * kv_head_stride;
208 float *v_h = v + (size_t)h * kv_head_stride;
209
210 gemm_blocked_serial(input, wk_h, bk_h, k_h,
211 tokens, aligned_head_dim, aligned_embed_dim);
212 gemm_blocked_serial(input, wv_h, bv_h, v_h,
213 tokens, aligned_head_dim, aligned_embed_dim);
214 }
215}

References gemm_blocked_serial().

Referenced by ck_layer_forward_rmsnorm_swiglu().

◆ ck_qkv_project_head_major_backward()

void ck_qkv_project_head_major_backward ( const float *  d_q,
const float *  d_k,
const float *  d_v,
const float *  input,
const float *  wq,
const float *  bq,
const float *  wk,
const float *  bk,
const float *  wv,
const float *  bv,
float *  d_input,
float *  d_wq,
float *  d_bq,
float *  d_wk,
float *  d_bk,
float *  d_wv,
float *  d_bv,
float *  scratch,
int  tokens,
int  aligned_embed_dim,
int  num_heads,
int  num_kv_heads,
int  aligned_head_dim,
int  num_threads 
)

Definition at line 856 of file ckernel_orchestration.c.

880{
881 if (!d_q || !d_k || !d_v || !input || !wq || !wk || !wv ||
882 !d_input || !d_wq || !d_bq || !d_wk || !d_bk || !d_wv || !d_bv || !scratch) {
883 return;
884 }
885
886 size_t total_in = (size_t)tokens * (size_t)aligned_embed_dim;
887 for (size_t i = 0; i < total_in; ++i) {
888 d_input[i] = 0.0f;
889 }
890
891 size_t head_weight_stride = (size_t)aligned_head_dim * (size_t)aligned_embed_dim;
892 size_t head_out_stride = (size_t)tokens * (size_t)aligned_head_dim;
893
894 for (int h = 0; h < num_heads; ++h) {
895 const float *d_q_h = d_q + (size_t)h * head_out_stride;
896 const float *wq_h = wq + (size_t)h * head_weight_stride;
897 float *d_wq_h = d_wq + (size_t)h * head_weight_stride;
898 float *d_bq_h = d_bq + (size_t)h * (size_t)aligned_head_dim;
899
901 input,
902 wq_h,
903 scratch,
904 d_wq_h,
905 d_bq_h,
906 tokens,
907 aligned_embed_dim,
908 aligned_head_dim,
909 num_threads);
910 ck_add_inplace(d_input, scratch, tokens, aligned_embed_dim);
911 }
912
913 for (int h = 0; h < num_kv_heads; ++h) {
914 const float *d_k_h = d_k + (size_t)h * head_out_stride;
915 const float *d_v_h = d_v + (size_t)h * head_out_stride;
916
917 const float *wk_h = wk + (size_t)h * head_weight_stride;
918 const float *wv_h = wv + (size_t)h * head_weight_stride;
919
920 float *d_wk_h = d_wk + (size_t)h * head_weight_stride;
921 float *d_wv_h = d_wv + (size_t)h * head_weight_stride;
922
923 float *d_bk_h = d_bk + (size_t)h * (size_t)aligned_head_dim;
924 float *d_bv_h = d_bv + (size_t)h * (size_t)aligned_head_dim;
925
927 input,
928 wk_h,
929 scratch,
930 d_wk_h,
931 d_bk_h,
932 tokens,
933 aligned_embed_dim,
934 aligned_head_dim,
935 num_threads);
936 ck_add_inplace(d_input, scratch, tokens, aligned_embed_dim);
937
939 input,
940 wv_h,
941 scratch,
942 d_wv_h,
943 d_bv_h,
944 tokens,
945 aligned_embed_dim,
946 aligned_head_dim,
947 num_threads);
948 ck_add_inplace(d_input, scratch, tokens, aligned_embed_dim);
949 }
950}

References ck_add_inplace(), and fc2_backward_kernel().

Referenced by ck_layer_backward_rmsnorm_swiglu().

◆ ck_qkv_project_head_major_token()

void ck_qkv_project_head_major_token ( const float *  input_row,
const float *  wq,
const float *  bq,
const float *  wk,
const float *  bk,
const float *  wv,
const float *  bv,
float *  q_token,
float *  k_token,
float *  v_token,
int  aligned_embed_dim,
int  num_heads,
int  num_kv_heads,
int  aligned_head_dim 
)

Definition at line 78 of file attention_decode_fused.c.

89{
90 if (!input_row || !wq || !wk || !wv || !q_token || !k_token || !v_token) {
91 return;
92 }
93
94 const int q_out = num_heads * aligned_head_dim;
95 gemm_blocked_serial(input_row, wq, bq, q_token,
96 /*tokens=*/1, q_out, aligned_embed_dim);
97
98 size_t head_weight_stride = (size_t)aligned_head_dim * (size_t)aligned_embed_dim;
99#pragma omp parallel for schedule(static) if(num_kv_heads > 1)
100 for (int h = 0; h < num_kv_heads; ++h) {
101 const float *wk_h = wk + (size_t)h * head_weight_stride;
102 const float *wv_h = wv + (size_t)h * head_weight_stride;
103 const float *bk_h = bk ? (bk + (size_t)h * (size_t)aligned_head_dim) : NULL;
104 const float *bv_h = bv ? (bv + (size_t)h * (size_t)aligned_head_dim) : NULL;
105 float *k_h = k_token + (size_t)h * (size_t)aligned_head_dim;
106 float *v_h = v_token + (size_t)h * (size_t)aligned_head_dim;
107
108 gemm_blocked_serial(input_row, wk_h, bk_h, k_h,
109 /*tokens=*/1, aligned_head_dim, aligned_embed_dim);
110 gemm_blocked_serial(input_row, wv_h, bv_h, v_h,
111 /*tokens=*/1, aligned_head_dim, aligned_embed_dim);
112 }
113}

References gemm_blocked_serial().

Referenced by ck_layer_forward_rmsnorm_swiglu_decode(), ck_layer_forward_rmsnorm_swiglu_decode_fused(), and ck_layer_forward_rmsnorm_swiglu_decode_fused_attn_impl().

◆ ck_residual_add_backward()

void ck_residual_add_backward ( const float *  d_out,
float *  d_a,
float *  d_b,
int  tokens,
int  aligned_embed_dim 
)

Definition at line 151 of file ckernel_orchestration.c.

156{
157 if (!d_out || !d_a || !d_b) {
158 return;
159 }
160 size_t total = (size_t)tokens * (size_t)aligned_embed_dim;
161 for (size_t i = 0; i < total; ++i) {
162 float v = d_out[i];
163 d_a[i] = v;
164 d_b[i] = v;
165 }
166}

Referenced by ck_layer_backward_rmsnorm_swiglu().

◆ ck_residual_add_token_major()

void ck_residual_add_token_major ( const float *  a,
const float *  b,
float *  out,
int  tokens,
int  aligned_embed_dim 
)