通过编写一个真实的内核,我终于理解了 WASM SIMD:将 RGB 转换为灰度亮度,每条指令处理 16 个像素,而非一次一个。数学运算相同,但在单核上速度提升约 4 倍。这是精简版——完整文章包含了将每个操作符反糖化为纯 TypeScript 代码、逐通道的 ASCII 图表,以及可选的底层进位线路详解。
先剧透结论,后讲理论。只有一个文件,除了 Deno 无需安装任何东西——它在启动时会自行编译 AssemblyScript:
🪄 代码 A → 代码 B,可运行且已基准测试(点击自我剧透)// luma_bench.ts,完全自包含:AssemblyScript 会即时自行编译。
// 运行:deno bench -A luma_bench.ts
import asc from "npm:assemblyscript/asc";
// ---------- 代码 A:任何人都会编写的循环 ----------
function rgbToLumaNaive(rgb: Uint8Array, out: Uint8Array): void {
const pixelCount = out.length;
for (let i = 0; i < pixelCount; i++) {
const r = rgb[i * 3];
const g = rgb[i * 3 + 1];
const b = rgb[i * 3 + 2];
out[i] = Math.round(0.2126 * r + 0.7152 * g + 0.0722 * b);
}
}
// ---------- 代码 A.5:相同的循环,但用 Q15 整数替换浮点运算 ----------
function rgbToLumaScalar(
免责声明:本文内容来自互联网,该文观点不代表本站观点。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请到页面底部单击反馈,一经查实,本站将立刻删除。