Kernel × platform support matrix

Generated from kernel-support.json (version 0.62.4) by KernelSupportMatrixTest — registry introspection of the registered KernelProvider implementations. Do not edit by hand; run ./gradlew generateKernelMatrix to refresh.

Each cell is the best (highest-priority) provider that serves Float32 × format matmul on that platform: native-ffm / native-jni / native-cinterop (100) → panama-vector / wasm-simd128 (50) → scalar (0). An empty cell (—) means no provider carries a kernel there (the format is dequant-to-FP32 only). The JS/WASM column assumes WasmSimd.install() has run; without the sidecar it is the scalar floor.

Weight format JVM Android Native·linux Native·apple JS/WASM

Float32

native-ffm

scalar

scalar

scalar

wasm-simd128

BFloat16

native-ffm

scalar

scalar

scalar

wasm-simd128

Float16

native-ffm

scalar

scalar

scalar

wasm-simd128

Q8_0

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Q4_0

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Q4_K

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Q6_K

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Q5_K

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Q5_1

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Q5_0

native-ffm

native-jni

native-cinterop

native-cinterop

wasm-simd128

Mapped serving (row-major, off-heap)

Kernels that read the weight in canonical row-major GGUF file order straight from off-heap bytes (mmap’d pages or a direct buffer) — no heap staging, no prepack copy (#1189). This is what lets a model larger than the managed-heap cap decode on Android. Dense Float32 tensors are also served from the mapping (as element views, not a matmul kernel) — see StorageCapabilities.mappedServableEncodings for the authoritative set the memory plan budgets against the page cache. An empty cell means the format heap-stages under WeightResidency.MAPPED on that platform.

Weight format JVM Android Native·linux Native·apple JS/WASM

Q8_0

ffm-rowmajor

native-jni-direct

—

—

—

Q4_0

ffm-rowmajor

native-jni-direct

—

—

—

Q4_K

ffm-rowmajor

native-jni-direct

—

—

—

Q6_K

ffm-rowmajor

native-jni-direct

—

—

—

Q5_K

ffm-rowmajor

native-jni-direct

—

—

—

Q5_1

ffm-rowmajor

native-jni-direct

—

—

—

Q5_0

ffm-rowmajor

native-jni-direct

—

—

—

Resident serving (sidecar memory)

The browser has no files to map, so the wasm tier keeps weights resident in the SIMD128 sidecar’s linear memory instead: each weight is uploaded once on its first matmul and every later call reads it in place (WasmKernels.weightHandle). This is the JS/WASM counterpart of mapped serving above — no per-call copy of the weight, no prepack — bounded by the wasm32 4 GB linear memory rather than the page cache. The other platforms serve from the heap, off-heap or the mapping and have no cell here.

Weight format JVM Android Native·linux Native·apple JS/WASM

Float32

—

—

—

—

wasm-resident

BFloat16

—

—

—

—

wasm-resident

Float16

—

—

—

—

wasm-resident

Q8_0

—

—

—

—

wasm-resident

Q4_0

—

—

—

—

wasm-resident

Q4_K

—

—

—

—

wasm-resident

Q6_K

—

—

—

—

wasm-resident

Q5_K

—

—

—

—

wasm-resident

Q5_1

—

—

—

—

wasm-resident

Q5_0

—

—

—

—

wasm-resident

Kernel packs (view dispatch)

Kernels that are not reached through the matmul accessors above: the ternary formats are served by ViewKernelPack`s keyed in `KernelDispatch (BitNet-b1.58 with exact FP32 activations, the fused multi-plane BitNet-planes lm_head, TQ2_0 with int8 activations), and the dense x · Wᵀ of a Linear layer by the matmulFp32Wt accessor, which multiplies a row-major [out, in] weight in place instead of transposing and caching a copy. The fused row kernels — softmax / log-softmax, layer norm / RMS norm and scaled dot-product attention with its structural masks and grouped-query heads (softmaxFp32, normFp32, attentionFp32) — run those ops in one pass where the ops layer otherwise runs its scalar loops or the normalisation’s decomposition. The convolutions run as im2col + GEMM: on the JVM inside the ops layer itself (JvmVectorKernels, declared as the panama-vector tier), on wasm as the sidecar’s skainet_f32_conv. The scalar reference kernels serve every cell that is empty here (—), at reference speed; the common row-dot serves x · Wᵀ there.

Kernel JVM Android Native·linux Native·apple JS/WASM

BitNet-b1.58 (FP32 activations)

ffm-ternary

native-jni

native-cinterop

native-cinterop

wasm-simd128

BitNet-planes

ffm-ternary

native-jni

native-cinterop

native-cinterop

wasm-simd128

TQ2_0 (int8 activations)

—

native-jni

—

—

wasm-simd128

Float32 x·Wᵀ direct

native-ffm

—

—

—

wasm-simd128

Float32 softmax (fused rows)

native-ffm

—

—

—

wasm-simd128

Float32 layer_norm / rms_norm (fused)

native-ffm

—

—

—

wasm-simd128

Float32 SDPA (fused, banded, GQA)

native-ffm

—

—

—

wasm-simd128

Float32 conv1d / conv2d / conv3d (im2col + GEMM)

panama-vector

—

—

—

wasm-simd128

See also the eager backends & kernels mindmap (Eager execution: backends and kernels) for the narrative overview and gaps.