← 查看全部版本更新版本发布 · v0.15.1

CalcKernel 0.15.1

Baseline 增加 WebAssembly Bulk Memory,并为符合条件的数值循环提供可选 SIMD128。

CalcKernel 0.15.1 包含面向数值内核的 v0.15 WebAssembly 优化。本版将 Bulk Memory 加入 Baseline 特性集合,并提供显式启用的 O3 SIMD128 向量化选项。

WebAssembly 优化#

Baseline 支持 Bulk Memory#

v0.15 的 Baseline 配置允许使用 WebAssembly Bulk Memory 操作,包括内存复制和填充。这让 CK 能将批量数组操作编译为相应的 Wasm 指令。宿主运行时必须支持模块目标声明的特性。

可选 SIMD128#

使用 O3 并启用 simd128 目标选项即可启用向量化。优化器可向量化符合条件的连续数值映射和归约;不满足安全条件或目标要求的循环保留标量代码。SIMD 仍需显式启用,团队可以根据部署运行时选择目标配置。

目标元数据与宿主内存#

CK Wasm 目标元数据现为 schema 2,记录所选的 baseline 或 simd128 profile 及其规范 SHA-256 profile digest;它不会逐项列出 Wasm 特性。宿主应校验所选 profile,并确认运行时支持该 profile 在 v0.15 中对应的能力集合。升级读取这份元数据的工具,使其能够解析新的目标描述。调用方提供内存的 ABI 保持不变:宿主仍负责数据内存,并将其传给导出的 CK 函数。

构建 SIMD 模块#

在 CalcKernel 编译器仓库根目录执行以下命令,以 O3 和 SIMD128 构建仓库中的 i32 映射示例:

mkdir -p build && ckc emit-wasm examples/wasm/i32_map.ck \
  --out build/i32-map-simd.wasm --opt-level 3 --wasm-features simd128 \
  --overflow unchecked --bounds unchecked

WebAssembly 输出目前要求使用 unchecked 溢出和边界模式,因此示例中显式写出这两个选项。若要构建不含 SIMD128 的模块,将 profile 改为 --wasm-features baseline。

一组有范围的 Node.js 实测#

此前在 Apple M5 Max、Node.js 24.14.0 上对 CK v0.15 O3 simd128 实现进行过一组范围有限的本地热内核比较:处理 16,384 个元素的 i32 映射约为 Node.js JavaScript 的 5.95×,处理同样规模的 f64 映射约为 2.79×。这组历史测量没有绑定可核验的 v0.15.1 正式二进制身份,不能视为对正式发布构件的实测成绩。测试预先分配并复用 Int32Array / Float64Array 输入输出数组和 WebAssembly 内存;计时只覆盖重复调用内核,不包括编译、模块实例化或内存准备。倍率按 JavaScript 耗时除以 CK Wasm 耗时计算。

这些是两种适合向量化的算法在本机的测量结果,不代表其他算法、硬件或运行时也会有相同比例的提升。另一次 Baseline 对比中,带循环依赖校验和的浮点 AXPY 与 JavaScript 大致持平。请使用相同输入和部署运行时测量有代表性的负载。

更广泛的实测见十一项算法性能对比:逐项比较 CK 原生、Node.js 中的 CK Wasm、C++、Rust、Java 和 Node.js JavaScript,并将每项算法的 JavaScript 固定为 1.0×。

升级说明#

请从 v0.15.1 GitHub 发布页下载 CalcKernel,或查看公开编译器仓库。

↵ 打开 · esc 关闭