---
id: "mb-20260904-4321b0"
kind: "deep"
title: "同样一行矩阵乘法代码，直接丢进网页浏览器，不同显卡的执行速度能差出一万倍"
topic: "同样一行矩阵乘法代码，直接丢进网页浏览器，不同显卡的执行速度能差出一万倍"
source_type: "generated"
status: "published"
generated_at: "2026-09-04 20:42:00"
frame_type: ["运行时算子特化", "机制"]
legal_anchor_count: 0
transcript_citation_count: 0
---

# 同样一行矩阵乘法代码，直接丢进网页浏览器，不同显卡的执行速度能差出一万倍

同样一行矩阵乘法代码，直接丢进网页浏览器，不同显卡的执行速度能差出一万倍。
两台电脑装的显卡性能明明在同一个档次，跑起来却一个像跑车，一个像拖拉机。
为什么跨平台的网页技术，一碰到端侧 AI 就暴露出这么夸张的性能鸿沟？
直觉上的解释，总是把锅甩给浏览器的虚拟机损耗，断定网页天生不配跑重算力。
这个解释完全找错了方向。
把端侧性能拖垮的根源，来自一台困扰了跨平台图形与计算架构几十年的硬件机器。
运行时算子特化。
要把这件事看透，先看云端数据中心是怎么跑 AI 的。
在云端，算力环境高度同质化。
几万张英伟达 H100 芯片整整齐齐插在机架上。
工程师可以针对这一款芯片的显存位宽、张量核心架构，写出极致优化的底层 CUDA 算子代码。
代码写死一份，就能在所有机器上把硬件性能压榨到极致。
但把场景换到个人电脑和手机的浏览器里，底层世界瞬间碎成了上万块碎片。
苹果有自己的统一内存架构。
高通芯片有自己的着色器管线。
英特尔核显、AMD 独显、英伟达显卡，每一家的底层缓存大小、线程调度规则、指令集支持都完全不同。
为了让网页能够调用显卡，W3C 推出了 WebGPU 标准和配套的 WGSL 着色器语言。
这解决了跨平台能跑的问题。
但能跑，绝不等于跑得快。
在图形和并行计算领域，两段输出完全相同的着色器代码，在不同显卡上的性能可以天差地别。
一个算子跑得快不快，取决于它能不能吃满这块显卡的向量化宽度、能不能用上半精度浮点数据、以及线程工作组尺寸是不是刚好切中硬件的最佳调度粒度。
这就是跨平台框架遭遇的最大困境。
过去像微软的 ONNX Runtime Web 这类主流推理引擎，为了保证代码在任何一台破旧电脑上都能运行，只能选择最保守的策略。
分发写死的、通用的静态着色器文件。
通用的代价，就是不得不放弃所有激进的硬件优化。
不能贸然开启十六位浮点运算，因为有些老显卡不支持。
不能随意设定大尺寸的工作组，因为有些低端设备会直接崩溃。
一份照顾全天下所有硬件最大公约数的代码，在绝大多数现代显卡上，就成了一份处处受限的减速代码。
海量的硬件加速指令和宽数据通道，在浏览器里被白白闲置。
破局的思路，不是在实验室里为每块显卡各写一套固定的代码。
那是永远填不满的无底洞。
有效的解法，是把代码生成的动作推迟到用户的浏览器里去完成。
Hugging Face 开源的 207 个 WebGPU 算子，在架构上做了一次关键反转。
他们不再分发写死的 WGSL 着色器代码文件，全部改用带参数宏的 Jinja 模板。
模板里把数据类型、工作组尺寸、内存展开逻辑全部做成了可配置的变量插槽。
当用户的浏览器加载算子库时，JavaScript 引擎会在本地直接探测当前显卡适配器的具体特性。
如果设备支持更宽的数据类型，就现场组装出支持向量化的指令。
如果硬件支持更大的线程工作组，就动态填入最高效的调度参数。
浏览器在本地现场渲染出最适合当前硬件的着色器代码，再直接送进 GPU 执行。
这就是运行时算子特化。
它把过去在云端靠人工手写调优的动作，变成了客户端本地的即时编译与特化。
性能差距直接落在了硬指标上。
在苹果 M4 芯片的实测对比中，这套参数化算子库对比微软官方的 ONNX Runtime Web，在 809 个可比测试用例里，几何平均速度提升了 2.57 倍，中位数提速 1.90 倍。
在复杂的双线性爱因斯坦求和算子上，耗时从 1396 毫秒暴降到 0.136 毫秒，提速超过一万倍。
在累加求和算子上，速度提升了 301 倍。
当算子底座被特化压榨到极致，上层的工程复杂度直接呈数量级坍塌。
只需要 20 行原生的 JavaScript 代码，直接调度底层的矩阵乘法、归一化和激活算子，就能在浏览器里纯手工跑通大语言模型的注意力机制。
一百万像素的波纹实时物理模拟，纯 JavaScript 只能跑出每秒 5 帧，换上特化后的单矩阵乘法算子，直接顶满浏览器 60 帧的垂直同步刷新上限。
为了进一步解决实验室买不起全世界所有冷门显卡的难题，他们还上线了 Fleet 众包测试平台。
任何用户只要打开网页，就能用自己的显卡跑分。
成千上万种真实硬件上的运行数据、边界失效案例，顺着浏览器回流到开源社区，反向校准模板的参数匹配规则。
端侧算力从玩具走向可用的分水岭，往往就藏在这些不起眼的编译器与算子底座里。
技术的演进，从来不在于把一份平庸的代码妥协给所有硬件。
它在于把硬件特化的权力，推迟到执行的那一刻。

_Rendered by mubei-terminal._
