Skip to content

Commit a353ac8

Browse files
Merge pull request #735 from SKaiNET-developers/release/0.30.0
release: 0.30.0
2 parents 92485f2 + 4838eea commit a353ac8

8 files changed

Lines changed: 22 additions & 10 deletions

File tree

‎CHANGELOG.md‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22

33
## [Unreleased]
44

5+
## [0.30.0] - 2026-06-13
6+
7+
### Added
8+
9+
- **First-class Q5_K packed matmul.** New `TensorEncoding.Q5_K`, `Q5_KTensorData` / `Q5_KBlockTensorData` (256-element / 176-byte super-blocks with the `qh` 5th-bit plane), and a `Q5KMatmulKernel` SPI. Implementations: scalar reference (commonMain → Kotlin/Native, JS, Wasm), JVM Panama Vector, and native-C (FFM). Wired into `DefaultCpuOps` packed-quant matmul dispatch + lazy transpose, registered via `KernelRegistry`, and added to the GGUF `StreamingGgufParametersLoader` (Q5_K + Q6_K packed branches). Q5_K weights stay packed and dequantize inside the matmul, matching the existing Q4_K/Q6_K path. (PR #734)
10+
- **ARM NEON kernels for the native CPU backend.** Hand-written NEON paths for `fp32`, `q8_0`, `q4k`, and `q5k` matmul (shared `skainet_simd.h`), behind `#if __ARM_NEON` so x86 keeps its `-O3 -ffast-math` auto-vectorized scalar path. The native CMake build adds an aarch64 branch (`-march=armv8.2-a+fp16+dotprod`; no `+i8mm` — Cortex-A55 lacks it) and an opt-in `-PcrossArm64` cross-compile with a toolchain file. (PR #734)
11+
- **Kotlin/Native consumption of the C kernels via cinterop.** `skainet-backend-native-cpu` now builds a static archive (`libskainet_kernels.a`) alongside the shared lib and adds `linuxX64` + `linuxArm64` targets with a cinterop `.def`, shared `nativeMain` `NativeKn*MatmulKernel` wrappers, and a `NativeKnKernelProvider` (+ `installNativeKernels()`). On-device Kotlin/Native binaries can now reach the same hand-tuned C/NEON kernels the JVM uses via FFM. (PR #734)
12+
513
## [0.29.1] - 2026-06-09
614

715
### Fixed

‎README.md‎

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ Add the core dependencies (Gradle Kotlin DSL):
3636
```kotlin
3737
dependencies {
3838
// Recommended: import the umbrella BOM and drop versions on the engine modules.
39-
implementation(platform("sk.ainet:skainet-bom:0.29.1"))
39+
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
4040

4141
implementation("sk.ainet.core:skainet-lang-core")
4242
implementation("sk.ainet.core:skainet-backend-cpu")
@@ -227,12 +227,15 @@ Runnable examples:
227227

228228
---
229229

230-
## What's New in 0.29.1
230+
## What's New in 0.30.0
231231

232-
- **`sk.ainet.core:skainet-compile-minerva` now publishes to Maven Central.** A packaging fix for the Minerva export module that shipped in 0.29.0 — it was missing the per-module POM metadata, so the artifact never made it to Maven Central. See the 0.29.0 highlights below for the module itself.
232+
- **First-class Q5_K packed in-kernel dequant-matmul** across the CPU backends — a `Q5_KBlockTensorData` packed type and a `Q5KMatmulKernel` SPI with scalar (commonMain / Kotlin-Native), JVM Panama Vector, and native-C implementations, wired into `DefaultCpuOps` matmul dispatch + lazy transpose and the GGUF streaming loader. Q5_K weights now stay packed (no FP32 inflation) and dequantize inside the matmul, like Q4_K/Q6_K.
233+
- **Hand-written ARM NEON kernels** for the native CPU backend (fp32, q8_0, q4k, q5k), guarded by `__ARM_NEON` so x86 keeps its scalar / auto-vectorized path. The native CMake build gains an aarch64 branch (`-march=armv8.2-a+fp16+dotprod`, dotprod for Cortex-A55) plus an opt-in cross-compile.
234+
- **Kotlin/Native consumption of the C kernels via cinterop** — `skainet-backend-native-cpu` now also builds a static archive and exposes the kernels to Kotlin/Native (`linuxX64` + `linuxArm64`) through a `KernelProvider`, so on-device (non-JVM) binaries get the same hand-tuned kernels the JVM reaches via FFM. (PR #734)
233235

234236
### Recent releases
235237

238+
- **0.29.1** — `sk.ainet.core:skainet-compile-minerva` now publishes to Maven Central (packaging fix for the Minerva export module shipped in 0.29.0).
236239
- **0.29.0** — **Minerva secure-MCU export module**: an end-to-end pipeline that lowers a SKaiNET model through shared graph-export contracts → Minerva IR → an `.npz` compiler input → a libminerva-packaged secure MCU project bundle, with host-side runtime verification and fingerprinted manifest artifacts (runnable sample, examples, ONNX workflow, getting-started docs). Plus **packed-quant matmul kernels with Kotlin/Native parity** (Q5_0/Q5_1/Q4_K/Q6_K — commonMain scalar + SPI, packed-quant dispatch in `DefaultCpuOpsBase`, Panama Vector for Q5_1/Q5_0 and Q6_K via the `KernelRegistry`), and an **auto-generated, CI-gated kernel × platform support matrix**. (PRs #697–#726)
237240
- **0.28.1** — Kotlin DSL → StableHLO → IREE is green end-to-end for the whole conformance suite (7/7 models, 27/27 ops compile to a `vmfb`): `inferDagOutputSpecs` now infers correct output shapes for shape-changing ops, and `reduce_window` (pooling) emits IREE's generic region form. (PRs #674, #676)
238241
- **0.28.0** — Four StableHLO export bugs fixed (reshape #666, concatenate #667, constants/reductions #663, `HloGenerator` tracing #668) plus non-JVM image runtime support (#671). (PRs #664, #670, #671)

‎docs/modules/ROOT/pages/how-to/io-readers.adoc‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Add the following dependencies to your `build.gradle.kts`:
2020
[source,kotlin]
2121
----
2222
dependencies {
23-
implementation(platform("sk.ainet:skainet-bom:0.29.1"))
23+
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
2424
2525
implementation("sk.ainet.core:skainet-io-gguf")
2626
implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.8.2")
@@ -32,7 +32,7 @@ dependencies {
3232
[source,kotlin]
3333
----
3434
dependencies {
35-
implementation(platform("sk.ainet:skainet-bom:0.29.1"))
35+
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
3636
3737
implementation("sk.ainet.core:skainet-io-onnx")
3838
implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.8.2")

‎docs/modules/ROOT/pages/how-to/minerva-export.adoc‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ For a published application, use the SKaiNET BOM and the Minerva artifact:
3838
[source,kotlin]
3939
----
4040
dependencies {
41-
implementation(platform("sk.ainet:skainet-bom:0.29.1"))
41+
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
4242
implementation("sk.ainet.core:skainet-compile-minerva")
4343
}
4444
----

‎docs/modules/ROOT/pages/reference/kernel-support-matrix.adoc‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
= Kernel × platform support matrix
22
:description: Which compute-kernel provider serves each weight format on each KMP target.
33

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

66
Each cell is the best (highest-priority) provider that serves `Float32 × format` `matmul` on that platform: *native-ffm* (100) → *panama-vector* (50) → *scalar* (0). An empty cell (`—`) means no provider carries a kernel there (the format is dequant-to-FP32 only).
77

@@ -15,6 +15,7 @@ Each cell is the best (highest-priority) provider that serves `Float32 × format
1515
| `Q4_0` | native-ffm | panama-vector | scalar | scalar | scalar
1616
| `Q4_K` | native-ffm | panama-vector | scalar | scalar | scalar
1717
| `Q6_K` | panama-vector | panama-vector | scalar | scalar | scalar
18+
| `Q5_K` | native-ffm | panama-vector | scalar | scalar | scalar
1819
| `Q5_1` | panama-vector | panama-vector | scalar | scalar | scalar
1920
| `Q5_0` | panama-vector | panama-vector | scalar | scalar | scalar
2021
|===

‎docs/modules/ROOT/pages/tutorials/image-data-getting-started.adoc‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ For a JVM project, add the image/data modules alongside the CPU backend:
3232
[source,kotlin]
3333
----
3434
dependencies {
35-
implementation(platform("sk.ainet:skainet-bom:0.29.0"))
35+
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
3636
3737
implementation("sk.ainet:skainet-backend-cpu-jvm")
3838
implementation("sk.ainet:skainet-io-image-jvm")

‎docs/modules/ROOT/pages/tutorials/java-getting-started.adoc‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ repositories {
144144
145145
dependencies {
146146
// Import BOM for version alignment
147-
implementation(platform("sk.ainet:skainet-bom:0.29.1"))
147+
implementation(platform("sk.ainet:skainet-bom:0.30.0"))
148148
149149
// Core tensor library
150150
implementation("sk.ainet:skainet-lang-core-jvm")

‎gradle.properties‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
GROUP=sk.ainet.core
2-
VERSION_NAME=0.29.1
2+
VERSION_NAME=0.30.0
33
POM_DESCRIPTION=SKaiNET
44

55
POM_URL=https://github.com/SKaiNET-developers/skainet/

0 commit comments

Comments
 (0)