WebGPU计算相关术语表
WebGPU
WebGPU是W3C正在标准化的新一代Web图形和计算API,由W3C的GPU for the Web社区组开发。WebGPU从Vulkan、Metal和Direct3D 12等现代图形API中汲取设计灵感,提供了比WebGL更低级别的GPU控制能力和更高效的命令提交方式。WebGPU的核心设计包括适配器(Adapter)和设备(Device)模型、命令编码器(Command Encoder)和命令队列(Queue)、绑定组(Bind Group)和管线布局(Pipeline Layout)等概念。WebGPU不仅支持图形渲染,还提供了完整的计算管线(Compute Pipeline),允许开发者编写通用计算着色器利用GPU的并行计算能力。WebGPU正在Chrome 113+、Firefox等浏览器中逐步实现,代表着Web平台GPU编程的未来方向。
计算着色器(Compute Shader)
计算着色器是WebGPU计算管线中执行通用计算任务的程序单元。与传统的图形着色器(顶点着色器、片元着色器)不同,计算着色器不参与图形渲染流程,而是独立执行数值计算任务。计算着色器使用WGSL(WebGPU Shading Language)编写,以工作组(Workgroup)为执行单位,每个工作组包含固定数量的线程(Thread)。着色器代码定义了每个线程的计算逻辑,通过内置变量(如global_id、local_id)区分不同线程的身份和位置。计算着色器可以访问多种内存资源:全局存储缓冲区(Storage Buffer)、共享工作组内存(Workgroup Memory)、均匀缓冲区(Uniform Buffer)等。计算着色器的执行由GPU调度器管理,可以高效利用GPU的数千个计算核心实现大规模并行计算。
WGSL着色语言
WGSL(WebGPU Shading Language)是WebGPU的标准着色语言,用于编写计算着色器和图形着色器。WGSL语法受Rust和Swift等现代语言影响,采用静态类型系统,支持向量类型(vec2、vec3、vec4)、矩阵类型(mat4x4等)、标量类型(f32、i32、u32、bool)等GPU编程常用数据类型。WGSL使用@attribute注解声明绑定关系,如@group(0) @binding(0)声明资源绑定位置,@workgroup_size(16, 16)声明工作组大小。WGSL的控制流支持if-else条件判断、loop循环、for循环、break和continue等结构。WGSL不支持指针操作和动态数组索引,所有数组访问必须在编译时确定范围。WGSL是WebGPU生态系统的标准语言,所有支持WebGPU的浏览器都原生支持WGSL着色器的编译和执行。
工作组(Workgroup)
工作组是WebGPU计算管线中的基本执行单元。一个工作组包含固定数量的线程(由@workgroup_size属性指定),这些线程共享同一块工作组内存(Workgroup Memory),并通过工作组屏障(Workgroup Barrier)进行同步。工作组的大小必须在编译时确定,典型配置为16x16x1或32x1x1等。GPU调度器将计算任务分解为多个工作组,每个工作组分配到一个GPU处理单元(如NVIDIA的SM、AMD的CU)上执行。工作组内的线程可以高效共享数据(通过共享内存),而工作组之间的通信必须通过全局内存。工作组大小的选择需要考虑GPU硬件特性:过小的工作组无法充分利用GPU的并行能力,过大的工作组可能导致资源竞争和寄存器溢出。在矩阵乘法中,16x16的工作组大小是一个经过验证的平衡选择。
GFLOPS
GFLOPS(Giga Floating-point Operations Per Second)是衡量计算机浮点计算性能的标准指标,表示每秒执行十亿次浮点运算。GFLOPS的计算方法是:总浮点操作次数除以执行时间(秒),再除以10^9。对于矩阵乘法,两个N*N矩阵相乘的浮点操作次数约为2*N^3(每个输出元素需要N次乘法和N-1次加法,近似为2N次操作)。例如,1024x1024矩阵乘法的浮点操作次数约为2.15G次,如果GPU在50ms内完成,则GFLOPS约为43。现代GPU的理论峰值GFLOPS可以达到数千甚至数万(如NVIDIA RTX 4090的FP32峰值约为82.6 TFLOPS),实际应用中能达到理论峰值的30%到70%就已经是非常优秀的性能表现。GFLOPS指标可以跨平台、跨硬件对比计算性能,是GPU性能评估和基准测试的核心指标。
Tile-based算法
Tile-based算法是一种将大型数据集分割为固定大小的小块(Tile)进行处理的计算策略。在矩阵乘法中,Tile-based算法将输出矩阵分割为多个小的子矩阵块,每个GPU工作组负责计算一个输出Tile。工作组内的线程协作从全局内存中加载对应的输入Tile到共享内存中,然后从共享内存读取数据执行乘加运算。这种分块处理方式的核心优势在于数据复用:每个输入矩阵元素被加载到共享内存后,可以被工作组内的多个线程重复使用,大幅减少对全局显存的访问次数。全局显存的访问延迟通常在数百个时钟周期,而共享内存的访问延迟仅为几个时钟周期,因此Tile-based算法可以显著提升计算性能。Tile大小的选择需要在数据复用率和共享内存占用之间取得平衡,16x16或32x32是常见的选择。
GPU并行计算
GPU并行计算是利用图形处理器的大量计算核心同时执行计算任务的技术。现代GPU拥有数千个计算核心(如NVIDIA的CUDA核心、AMD的流处理器),可以同时处理数千个计算任务。与CPU的少核高频设计不同,GPU采用多核低频设计,单个核心的性能远不如CPU,但通过大规模并行可以在总体吞吐量上大幅超越CPU。GPU并行计算适合数据并行(Data Parallelism)场景,即多个数据元素执行相同的操作(如矩阵乘法、图像处理、物理模拟等)。GPU并行计算不适合任务并行(Task Parallelism)场景,因为GPU的线程调度和切换开销较大。WebGPU的计算管线提供了在浏览器中进行GPU并行计算的标准接口,使Web应用也能利用GPU的强大计算能力。
WebGL与WebGPU对比
WebGL和WebGPU都是Web平台的GPU编程接口,但设计理念和功能范围有显著差异。WebGL基于OpenGL ES规范,主要专注于图形渲染,不提供通用计算能力。WebGPU基于Vulkan、Metal等现代图形API,同时支持图形渲染和通用计算。API设计方面,WebGL采用状态机模型,通过大量全局状态设置来配置渲染管线;WebGPU采用显式的命令编码模型,通过命令编码器和管线对象实现更清晰的资源管理。性能方面,WebGPU的命令提交开销更低,多线程支持更好,内存管理更高效。WebGL已经得到所有主流浏览器的广泛支持,WebGPU目前处于逐步实现阶段。对于新项目,如果需要通用计算能力或现代API特性,建议选择WebGPU;如果只需要基本的图形渲染且需要最大兼容性,WebGL仍然是可靠的选择。
共享内存(Workgroup Memory)
共享内存是WebGPU计算管线中工作组级别的高速内存空间,由工作组内的所有线程共享访问。共享内存的访问延迟极低(通常为几个时钟周期),远低于全局存储缓冲区的访问延迟(数百个时钟周期)。在Tile-based矩阵乘法中,共享内存扮演着关键角色:工作组内的线程协作从全局内存加载输入Tile到共享内存中,然后所有线程从共享内存读取数据执行计算。这种数据加载和计算的流水线化设计使得每个全局内存访问的数据可以被多次复用,大幅提升计算效率。WebGPU中通过workgroup关键字声明共享内存变量,通过storageBarrier()函数确保所有线程完成内存写入后再继续执行。共享内存的容量有限(通常为16KB到64KB),需要精心管理以避免溢出到速度较慢的本地内存。
UD5工具箱