Skip to content

Engine switches

The engine’s P100 kernels are opt-in. Each is turned on by a GGML_CUDA_* environment variable, which a recipe sets in its [run.env] table, exactly as the release gate measured it. The launcher passes them to the container with -e, in alphabetical order. Leaving one out, or changing its value, runs a configuration that was not measured.

Both engine-v0.1.0 recipes set the same 21 switches with the same values. The engine reads each one once, when it is first needed. The source files named below are under engine/ggml/src/ggml-cuda/.

The PN weight types need no switch: their kernels run whenever a tensor is pn3t or pn4t.

VariableRecipe valueUnsetWhat it selects
GGML_CUDA_FATTN_SM601offA split-KV flash-decoding attention kernel for sm_60, for a q4_0 K and V cache with head size 256, six query heads per KV head, and 1 to 4 query tokens. It replaces the stock vector and tile kernels in that case (fattn-sm60.cu).
GGML_CUDA_FATTN_SM60_CTAS48How many thread blocks per streaming multiprocessor the split-KV kernel aims for when it splits the KV cache. 4 aims for one full wave of blocks. Used only when GGML_CUDA_FATTN_SM60 applies.
GGML_CUDA_FATTN_TILE_OCC11offFor the tile attention kernel at head size 256 with more than a few query columns (prefill): launch bounds of one block per SM instead of two, which frees registers (fattn-tile.cuh). The engine checks only that the variable is set.

These replace stock mul_mat_vec_q paths on compute capability 6.0. All but GGML_CUDA_SM86_IQ3_SMEM_GRID live in mmvh-sm60.cu, and they take effect only when GGML_CUDA_MMV_SM60 is on.

VariableRecipe valueUnsetWhat it selects
GGML_CUDA_MMV_SM601offThe sm_60 GEMV family. Its base kernel multiplies IQ3_XXS and IQ3_S weights by fp16 activations with codebook tables in shared memory, for 1 to 4 columns, in place of the stock path’s q8_1 activations and emulated dp4a.
GGML_CUDA_MMV_SM60_XXS_STOCK1offLeaves IQ3_XXS products on the stock path, which is faster for them. Products of 2 or more columns get the IQ3_XXS repack first, which the stock path then reads.
GGML_CUDA_MMV_SM60_IQ3S_STOCK1offLeaves single-column (one-token decode) IQ3_S products on the stock path, which is faster there. Wider IQ3_S products stay on the sm_60 kernel.
GGML_CUDA_MMV_SM60_XXS_KB_WIDE1offWith GGML_CUDA_MMV_SM60_XXS_STOCK, an exception: IQ3_XXS weights that were not repacked go to the sm_60 kernel at 2 or 3 columns (mmvh-sm60.cuh).
GGML_CUDA_MMV_SM60_INPLACE_XXS1offWrites the IQ3_XXS repack (wide, aligned records the GEMV reads) in place, over the tensor’s own enlarged storage, instead of in a separate buffer of about 1 GB. Enlarges those tensors’ allocations (ggml-cuda.cu).
GGML_CUDA_MMV_SM60_INPLACE_IQ3S1offThe same for IQ3_S, instead of a separate buffer of about 2.6 GB.
GGML_CUDA_MMV_SM60_Q4K_HEAD1offAn sm_60 kernel for Q4_K weights with at least 65,536 rows, at 1 to 4 columns: the output head. Weights decode as fp16 subnormals against power-of-two prescaled activations.
GGML_CUDA_MMV_SM60_Q3K1offThe same kind of kernel for Q3_K weights at 1 to 4 columns. The weights are repacked once into 112-byte records (the 110-byte blocks plus 2 pad bytes) in a side buffer.
GGML_CUDA_MMV_SM60_Q6K1offThe same kind of kernel for Q6_K weights at 1 or 2 columns, repacked once into 224-byte records.
GGML_CUDA_MMV_SM60_Q4K_DHEAD1offFor the draft head of MTP speculative decoding: gathers the fixed subset of output-head rows it scores into one contiguous buffer, and runs the head kernel on it. The current recipes use no speculative decoding.
GGML_CUDA_SM86_IQ3_SMEM_GRID1offCopies the IQ3_XXS and IQ3_S codebook grid into shared memory once per block in the stock mul_mat_vec_q path, on compute capability 8.6 and 6.0. Same values and order of operations, so the results are bit-identical (mmvq.cu). The variable must start with 1.
VariableRecipe valueUnsetWhat it selects
GGML_CUDA_FUSE_PRE_ADD1offFuses a residual ADD, the RMS_NORM after it and the MUL after that into one launch, with a check that the fused write cannot overlap a read (ggml-cuda.cu).
GGML_CUDA_NORM_EMIT_Q81offLets that fused norm also write its output in q8_1, ready for the matrix-vector products that read it, when the shape and every reader allow it (ggml-cuda.cu).
VariableRecipe valueUnsetWhat it selects
GGML_CUDA_PREFILL_DEQ_F41offDequantizes weights to fp32 for prefill with one thread per group of 4 weights and one float4 store: IQ4_XS weights, and, with GGML_CUDA_PREFILL_REP_DIRECT, the repacked IQ3_XXS and IQ3_S records (convert.cu).
GGML_CUDA_PREFILL_REP_DIRECT1offDequantizes repacked IQ3_XXS and IQ3_S records directly, without rebuilding the original block in shared memory first. Same integers and order of operations, so bit-identical (convert.cu).
GGML_CUDA_PREFILL_CHUNK_GEMM1offFor an fp32 matrix product with more than 1,024 columns, issues it as chunks of 1,024 columns plus a remainder (ggml-cuda.cu). The engine checks only that the variable is set.
GGML_CUDA_PREFILL_CHUNK_STREAMS30With chunked GEMM, spreads one weight’s chunks over up to this many worker streams, for shapes with at least 5,120 rows. Each chunk is the same call, so the result is the same as in sequence. 0 turns it off.
GGML_CUDA_SM86_GDN_COLS84Columns of state per block in the gated delta net kernel, the recurrent layers of the model. One of 1, 2, 4 or 8; another value means 4. 8 applies only to batches of 64 tokens or more; shorter ones use 4 (gated_delta_net.cu).

The engine reads more GGML_CUDA_* variables than these: alternatives that lost, debug output and statistics. They are not part of any recipe, and the release gate did not measure them. The list of a recipe’s switches is in its file, and tensorless info MODEL prints them.