阶段 4 · 计算基础18 分钟
工作组:局部协作与调度维度
local_id、workgroup_id 与 workgroup 内存
把二维调度中的全局、工作组和局部编号写入缓冲区,直观看见线程层级。
LEARNING GOALS
先明确本课目标
1
区分三个 ID 内建值
2
理解二维 dispatch
3
认识 var<workgroup> 与 barrier
MENTAL MODEL · 再建立心智模型
Invocation 被分成工作组;同组线程可用 workgroup 内存和 barrier 协作,不同组之间在一次 dispatch 内不能直接同步。
MINIMAL EXAMPLE
计算着色器里的三个 ID 有什么关系?
workgroup_id 标识当前组,local_invocation_id 标识组内位置,global_invocation_id 标识整个 dispatch 网格中的位置。全局坐标等于组坐标乘组大小再加局部坐标。
wgsl@compute @workgroup_size(8, 4)
fn main(
@builtin(workgroup_id) group: vec3u,
@builtin(local_invocation_id) local: vec3u,
@builtin(global_invocation_id) global: vec3u,
) {
// global.xy == group.xy * vec2u(8, 4) + local.xy
}- local 范围固定在 0..workgroup_size-1,可用于共享内存索引。
- group 指出当前 invocation 属于第几个工作组。
- global 通常直接映射到图片像素或数组元素。
理解三种坐标后,二维图像分块、共享内存 tile 和组内归约会更直观。
OPTIONAL · 按需查阅完整术语表与概念边界遇到陌生术语时再展开,不打断主线实验。
展开⌄
GPU 计算Workgroup计算 invocation 的局部协作组,大小由 @workgroup_size 定义,可共享 workgroup 内存。GPU 计算global_invocation_id计算着色器调用在整个 dispatch 网格中的全局坐标。GPU 计算var<workgroup>同一工作组 invocation 共享的局部内存,适合分块、缓存和局部归约。GPU 计算workgroupBarrier同步同一工作组内的执行与 workgroup 内存可见性;所有相关 invocation 必须一致到达。GPU 计算local_invocation_id当前 invocation 在所属工作组内部的三维坐标,各分量小于对应 @workgroup_size。GPU 计算Invocation着色器入口函数的一次执行实例;许多 invocation 运行同一段代码,但通过内建 ID 处理不同顶点、片元或计算数据。GPU 计算workgroup_sizeWGSL 计算入口属性,用三个常量规定每个工作组在 x、y、z 方向包含多少个 invocation。GPU 计算workgroup_id当前工作组在 dispatch 三维网格中的坐标;与 local_invocation_id 组合可定位全局处理元素。
LIVE EXPERIMENT · 先获得反馈
边改边运行
浏览器加载后会激活代码编辑器、独立运行环境与实时输出。
本课挑战
用 workgroup 内存实现块级前缀和。
回到原理,解释刚才发生了什么
先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。
CORE IDEA
核心讲解
层级调度
workgroup_size 决定每组线程数;dispatchWorkgroups 决定组数。全局尺寸是两者逐维相乘。
局部共享内存
同组线程可把常用数据放进快速 workgroup 内存,并通过 barrier 保证某阶段写完后再读取。
OPTIONAL · 迁移时查阅WebGPU 与 WebGL2 对照主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。
展开⌄
WebGL shader invocation 彼此隔离;WebGPU Workgroup 提供显式的局部协作层级。
WebGL
顶点/片元调用没有可移植的组内共享内存与 barrier,算法通常依赖多次 draw/pass。
WebGPU
workgroup_size、局部/全局 ID、var<workgroup> 与 barrier 共同定义协作。
Workgroup 不是 draw call 的批次;它是 shader 可观察并协作的执行/内存边界。