从适配器到逻辑设备

WebGPU 为网页提供使用 GPU 进行绘图和通用计算的 API,也指规定这一接口的规范体系,而不是某个显卡品牌。2026年9月15日的 W3C 文本仍标为候选推荐标准草案,尚未达到最终推荐状态。

应用通常先通过 navigator.gpu 请求 GPUAdapter,再由适配器请求 GPUDevice。适配器代表可用的设备与驱动能力,逻辑设备则是应用创建资源、管线和提交工作的接口。请求可能失败,可用特性和限制也须实际查询,不能因为电脑装有显卡就假设所有能力都能被网页调用。

参考:[1] [2]

数据、着色器与管线

缓冲区 GPUBuffer 和纹理 GPUTexture 保存供 GPU 使用的数据;GPUShaderModule 保存着色器程序;绑定组把具体资源连接到着色器声明的位置。管线则组合程序阶段及相应配置。渲染管线用于生成图像,计算管线用于计算任务,不需要先把问题伪装成绘制一幅图。

着色器通常以 WGSL 编写,在 GPU 的执行模型中运行。页面上的 JavaScript 负责准备资源和发出工作,不能把任意 JavaScript 函数直接作为 GPU 着色器执行。创建缓冲区时还要声明用途,例如存储、复制来源或可映射读取,这些用途会参与后续验证。

参考:[1] [2]

一次计算怎样完成

设要对一组数进行相同的逐元素运算。应用先准备输入与输出缓冲区,上传输入,建立计算着色器、管线和绑定组。随后创建命令编码器,开始计算通道,设置所用管线与资源,并以 dispatchWorkgroups 指定工作组数量。每个调用依据自己的索引处理数据,边界检查则避免把不足一个完整工作组的尾部当成有效输入。

结束通道并完成编码后,得到的命令缓冲区还须交给 GPUQueue.submit。记录命令、提交命令、设备真正执行,是不同阶段;submit 返回不代表运算结果已可由 JavaScript 读取。

一种读回路径是把输出复制到允许映射读取的暂存缓冲区,等待 mapAsync 完成,再取得映射范围并复制所需数据,最后解除映射。这个过程既涉及资源用途,也涉及 CPU 与 GPU 之间的同步。不能一边让 GPU 使用缓冲区,一边把它当成没有访问约束的普通数组。

参考:[1] [2]

现代接口仍有边界

WebGL 主要围绕图形渲染建立接口,WebGPU 则把计算管线列为直接支持的工作方式,并采用更适合映射到现代原生 GPU API 的设计。浏览器实现可通过 Vulkan、Metal 或 Direct3D 等底层接口工作,但网页接触到的仍是 WebGPU 的抽象和限制,不是任意硬件寄存器或厂商私有功能。

Web Worker 把脚本放到独立执行上下文,WebGPU 则把特定图形或计算任务交给 GPU 执行模型,两者可以配合而非互相替代。上传、分配、编译与读回都有成本,任务太小或频繁等待结果时,使用 GPU 不一定更快。

实现会验证资源类型、用途与命令是否合法,并采取措施隔离应用能够访问的内存;这些检查不替开发者证明算法结果正确。应用还需处理验证错误、设备丢失和不支持的特性。API 要求安全上下文,实际支持范围也随浏览器、驱动和平台而变,规范定义与具体环境可用性应分别确认。

参考:[1] [2]