Q6_K (weights) x Q8_K (activations) kernels for inference. More...
#include <assert.h>#include <math.h>#include <string.h>#include <stdint.h>#include <stddef.h>#include <stdlib.h>#include "ckernel_engine.h"#include "ckernel_quant.h"Go to the source code of this file.
Functions | |
| static float | ck_dot_q6_k_q8_k_fast_or_ref (const block_q6_K *w, const block_q8_K *x, int K) |
| void | ck_q6_k_prepare_weight (const void *src, void *dst, int N, int K) |
| size_t | ck_q6_k_prepared_block_size (void) |
| const char * | ck_q6_k_prepared_provider_name (void) |
| const char * | ck_q6_k_q8_k_provider_name (void) |
| static int | ck_q6k_q8k_force_ref (void) |
| static float | dot_q6_k_q8_k_ref (const block_q6_K *w, const block_q8_K *x, int K) |
| Scalar dot product for Q6_K x Q8_K. | |
| void | gemm_nt_q6_k_q8_k (const void *A_q8, const void *B, const float *bias, float *C, int M, int N, int K) |
| NT GEMM: C = A @ B^T where A is Q8_K and B is Q6_K. | |
| void | gemm_nt_q6_k_q8_k_m4_tile (const void *A_q8, const void *B, const float *bias, float *C, int M, int N, int K, int m0, int m1, int n0, int n1) |
| void | gemm_nt_q6_k_q8_k_prepared (const void *A_q8, const void *B_prepared, const float *bias, float *C, int M, int N, int K) |
| void | gemm_nt_q6_k_q8_k_prepared_avx512_vnni (const void *A_q8, const void *B_prepared, const float *bias, float *C, int M, int N, int K) |
| void | gemm_nt_q6_k_q8_k_prepared_tile (const void *A_q8, const void *B_prepared, const float *bias, float *C, int M, int N, int K, int m0, int m1, int n0, int n1) |
| static void | gemm_nt_q6_k_q8_k_prepared_tile_impl (const void *A_q8, const void *B_prepared, const float *bias, float *C, int M, int N, int K, int m0, int m1, int n0, int n1, int use_avx512_vnni) |
| void | gemm_nt_q6_k_q8_k_tile (const void *A_q8, const void *B, const float *bias, float *C, int M, int N, int K, int m0, int m1, int n0, int n1) |
| Compute one C[m0:m1, n0:n1] tile for Q8_K activations x Q6_K weights. | |
| void | gemm_nt_q6_k_q8_k_tiled (const void *A_q8, const void *B, const float *bias, float *C, int M, int N, int K) |
| Experimental single-thread tiled NT GEMM wrapper. | |
| void | gemm_q6_k_q8_k (float *Y, const void *W, const void *X_q8, int M, int N, int K) |
| GEMM: Y = W @ X^T where W is Q6_K and X is Q8_K. | |
| void | gemv_q6_k_q8_k (float *y, const void *W, const void *x_q8, int M, int K) |
| GEMV: y = W @ x where W is Q6_K and x is Q8_K. | |
| void | gemv_q6_k_q8_k_avx (float *y, const void *W, const void *x_q8, int M, int K) |
| void | gemv_q6_k_q8_k_avx2 (float *y, const void *W, const void *x_q8, int M, int K) |
| void | gemv_q6_k_q8_k_avx512 (float *y, const void *W, const void *x_q8, int M, int K) |
| void | gemv_q6_k_q8_k_avx512_vbmi (float *y, const void *W, const void *x_q8, int M, int K) |
| void | gemv_q6_k_q8_k_parallel (float *y, const void *W, const void *x_q8, int M, int K, int ith, int nth) |
| Parallel reference GEMV for Q6_K × Q8_K. | |
| void | gemv_q6_k_q8_k_parallel_simd (float *y, const void *W, const void *x_q8, int M, int K, int ith, int nth) |
| Parallel SIMD GEMV for Q6_K × Q8_K. | |
| void | gemv_q6_k_q8_k_ref (float *y, const void *W, const void *x_q8, int M, int K) |
| void | gemv_q6_k_q8_k_sse (float *y, const void *W, const void *x_q8, int M, int K) |
| void | vec_dot_q6_k_q8_k (int n, float *s, const void *vx, const void *vy) |
| Q6_K x Q8_K dot product (single row) | |
Q6_K (weights) x Q8_K (activations) kernels for inference.
After changes: make test && make llamacpp-parity-full
Implements decode-style matvec/matmul where weights are Q6_K and the activations are quantized on-the-fly to Q8_K. This is inference-only; no backward pass is provided here.
Q6_K Format (256 weights per block):
Q8_K Format (256 weights per block):
Definition in file gemm_kernels_q6k_q8k.c.
|
inlinestatic |
Definition at line 1641 of file gemm_kernels_q6k_q8k.c.
References ck_q6k_q8k_force_ref(), ck_strict_parity_enabled(), and dot_q6_k_q8_k_ref().
Referenced by gemm_nt_q6_k_q8_k(), and gemm_nt_q6_k_q8_k_tile().
| void ck_q6_k_prepare_weight | ( | const void * | src, |
| void * | dst, | ||
| int | N, | ||
| int | K | ||
| ) |
Definition at line 74 of file gemm_kernels_q6k_q8k.c.
References block_q6_K::d, block_q6_K::qh, QK_K, and block_q6_K::ql.
| size_t ck_q6_k_prepared_block_size | ( | void | ) |
Definition at line 57 of file gemm_kernels_q6k_q8k.c.
| const char * ck_q6_k_prepared_provider_name | ( | void | ) |
Definition at line 62 of file gemm_kernels_q6k_q8k.c.
| const char * ck_q6_k_q8_k_provider_name | ( | void | ) |
Definition at line 1367 of file gemm_kernels_q6k_q8k.c.
References ck_q6k_q8k_force_ref(), and ck_strict_parity_enabled().
|
static |
Definition at line 108 of file gemm_kernels_q6k_q8k.c.
Referenced by ck_dot_q6_k_q8_k_fast_or_ref(), ck_q6_k_q8_k_provider_name(), gemm_nt_q6_k_q8_k_m4_tile(), gemv_q6_k_q8_k(), and gemv_q6_k_q8_k_parallel_simd().
|
static |
Scalar dot product for Q6_K x Q8_K.
Q6_K layout: 256 weights per block
The dequantization formula for each weight is: weight = d * scale[sub] * (q6_value - 32) where q6_value is the 6-bit unsigned value (0..63).
Definition at line 135 of file gemm_kernels_q6k_q8k.c.
References block_q8_K::d, GGML_FP16_TO_FP32, block_q6_K::qh, QK_K, block_q6_K::ql, block_q8_K::qs, and block_q6_K::scales.
Referenced by ck_dot_q6_k_q8_k_fast_or_ref(), gemv_q6_k_q8_k_parallel(), gemv_q6_k_q8_k_parallel_simd(), gemv_q6_k_q8_k_ref(), and vec_dot_q6_k_q8_k().
| void gemm_nt_q6_k_q8_k | ( | const void * | A_q8, |
| const void * | B, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K | ||
| ) |
NT GEMM: C = A @ B^T where A is Q8_K and B is Q6_K.
This is the typical inference pattern:
| A_q8 | Input activations in Q8_K format |
| B | Weight matrix in Q6_K format |
| bias | Optional bias vector [N] |
| C | Output matrix |
| M | Batch size (number of tokens) |
| N | Output dimension |
| K | Input dimension |
Definition at line 1515 of file gemm_kernels_q6k_q8k.c.
References C, ck_dot_q6_k_q8_k_fast_or_ref(), and QK_K.
Referenced by ck_test_gemm_q6_k(), gemm_nt_q8_k_mlp_dispatch(), and gemm_nt_q8_k_qkv_dispatch().
| void gemm_nt_q6_k_q8_k_m4_tile | ( | const void * | A_q8, |
| const void * | B, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K, | ||
| int | m0, | ||
| int | m1, | ||
| int | n0, | ||
| int | n1 | ||
| ) |
Definition at line 1702 of file gemm_kernels_q6k_q8k.c.
References C, ck_q6k_q8k_force_ref(), ck_strict_parity_enabled(), gemm_nt_q6_k_q8_k_tile(), and QK_K.
| void gemm_nt_q6_k_q8_k_prepared | ( | const void * | A_q8, |
| const void * | B_prepared, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K | ||
| ) |
Definition at line 1631 of file gemm_kernels_q6k_q8k.c.
References C, and gemm_nt_q6_k_q8_k_prepared_tile().
| void gemm_nt_q6_k_q8_k_prepared_avx512_vnni | ( | const void * | A_q8, |
| const void * | B_prepared, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K | ||
| ) |
Definition at line 1619 of file gemm_kernels_q6k_q8k.c.
References C, and gemm_nt_q6_k_q8_k_prepared_tile_impl().
| void gemm_nt_q6_k_q8_k_prepared_tile | ( | const void * | A_q8, |
| const void * | B_prepared, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K, | ||
| int | m0, | ||
| int | m1, | ||
| int | n0, | ||
| int | n1 | ||
| ) |
Definition at line 1601 of file gemm_kernels_q6k_q8k.c.
References C, and gemm_nt_q6_k_q8_k_prepared_tile_impl().
Referenced by gemm_nt_q6_k_q8_k_prepared().
|
static |
Definition at line 1548 of file gemm_kernels_q6k_q8k.c.
Referenced by gemm_nt_q6_k_q8_k_prepared_avx512_vnni(), and gemm_nt_q6_k_q8_k_prepared_tile().
| void gemm_nt_q6_k_q8_k_tile | ( | const void * | A_q8, |
| const void * | B, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K, | ||
| int | m0, | ||
| int | m1, | ||
| int | n0, | ||
| int | n1 | ||
| ) |
Compute one C[m0:m1, n0:n1] tile for Q8_K activations x Q6_K weights.
Pure tile math only: no threadpool, no global scheduling, no allocation. The orchestrator decides how to split tile jobs across cores.
Definition at line 1665 of file gemm_kernels_q6k_q8k.c.
References C, ck_dot_q6_k_q8_k_fast_or_ref(), and QK_K.
Referenced by gemm_nt_q6_k_q8_k_m4_tile(), and gemm_nt_q6_k_q8_k_tiled().
| void gemm_nt_q6_k_q8_k_tiled | ( | const void * | A_q8, |
| const void * | B, | ||
| const float * | bias, | ||
| float * | C, | ||
| int | M, | ||
| int | N, | ||
| int | K | ||
| ) |
Experimental single-thread tiled NT GEMM wrapper.
Kept as a separate symbol from gemm_nt_q6_k_q8_k for benchmarks and parity. Production prefill should prefer the v8 2D tile scheduler when enabled.
Definition at line 1763 of file gemm_kernels_q6k_q8k.c.
References C, and gemm_nt_q6_k_q8_k_tile().
| void gemm_q6_k_q8_k | ( | float * | Y, |
| const void * | W, | ||
| const void * | X_q8, | ||
| int | M, | ||
| int | N, | ||
| int | K | ||
| ) |
GEMM: Y = W @ X^T where W is Q6_K and X is Q8_K.
| Y | Output matrix [N x M] in row-major |
| W | Weight matrix in Q6_K format [M x K] |
| X_q8 | Input matrix in Q8_K format [N x K] |
| M | Number of output rows (output dim) |
| N | Number of input vectors (batch size) |
| K | Input dimension |
Definition at line 1481 of file gemm_kernels_q6k_q8k.c.
References gemv_q6_k_q8_k(), and QK_K.
| void gemv_q6_k_q8_k | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
GEMV: y = W @ x where W is Q6_K and x is Q8_K.
Definition at line 1341 of file gemm_kernels_q6k_q8k.c.
References ck_q6k_q8k_force_ref(), ck_strict_parity_enabled(), gemv_q6_k_q8_k_avx(), gemv_q6_k_q8_k_avx2(), gemv_q6_k_q8_k_ref(), and gemv_q6_k_q8_k_sse().
Referenced by ck_moe_q4k_mixed_route_work(), ck_test_gemv_q6_k(), ck_test_vec_dot_q6_k_q8_k(), gemm_q6_k_q8_k(), moe_swiglu_expert_forward_q4k_q6k_workspace(), and moe_swiglu_shared_forward_q4k_q6k_workspace().
| void gemv_q6_k_q8_k_avx | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
Referenced by gemv_q6_k_q8_k().
| void gemv_q6_k_q8_k_avx2 | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
Referenced by gemv_q6_k_q8_k().
| void gemv_q6_k_q8_k_avx512 | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
| void gemv_q6_k_q8_k_avx512_vbmi | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
| void gemv_q6_k_q8_k_parallel | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K, | ||
| int | ith, | ||
| int | nth | ||
| ) |
Parallel reference GEMV for Q6_K × Q8_K.
Caller provides ith (thread index) and nth (total threads). Each thread processes rows [r0, r1).
Definition at line 1398 of file gemm_kernels_q6k_q8k.c.
References dot_q6_k_q8_k_ref(), and QK_K.
| void gemv_q6_k_q8_k_parallel_simd | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K, | ||
| int | ith, | ||
| int | nth | ||
| ) |
Parallel SIMD GEMV for Q6_K × Q8_K.
Uses best available SIMD (AVX/SSE) with row prefetching. Caller provides ith/nth from OpenMP region.
Definition at line 1430 of file gemm_kernels_q6k_q8k.c.
References ck_q6k_q8k_force_ref(), ck_strict_parity_enabled(), dot_q6_k_q8_k_ref(), and QK_K.
| void gemv_q6_k_q8_k_ref | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
Definition at line 270 of file gemm_kernels_q6k_q8k.c.
References dot_q6_k_q8_k_ref(), and QK_K.
Referenced by gemv_q6_k_q8_k().
| void gemv_q6_k_q8_k_sse | ( | float * | y, |
| const void * | W, | ||
| const void * | x_q8, | ||
| int | M, | ||
| int | K | ||
| ) |
Referenced by gemv_q6_k_q8_k().
| void vec_dot_q6_k_q8_k | ( | int | n, |
| float * | s, | ||
| const void * | vx, | ||
| const void * | vy | ||
| ) |
Q6_K x Q8_K dot product (single row)
Definition at line 1324 of file gemm_kernels_q6k_q8k.c.
References dot_q6_k_q8_k_ref().