Visual LabINTERACTIVE LEARNING
阶段 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
}
  1. local 范围固定在 0..workgroup_size-1,可用于共享内存索引。
  2. group 指出当前 invocation 属于第几个工作组。
  3. global 通常直接映射到图片像素或数组元素。

理解三种坐标后,二维图像分块、共享内存 tile 和组内归约会更直观。

本课概念
OPTIONAL · 按需查阅完整术语表与概念边界

遇到陌生术语时再展开,不打断主线实验。

展开⌄
LIVE EXPERIMENT · 先获得反馈

边改边运行

浏览器加载后会激活代码编辑器、独立运行环境与实时输出。

本课挑战

用 workgroup 内存实现块级前缀和。

DEEP DIVE · 实验之后

回到原理,解释刚才发生了什么

先用结果建立反馈,再按运行流程、核心原理和知识关系逐层深入。

CORE IDEA

核心讲解

01

层级调度

workgroup_size 决定每组线程数;dispatchWorkgroups 决定组数。全局尺寸是两者逐维相乘。

02

局部共享内存

同组线程可把常用数据放进快速 workgroup 内存,并通过 barrier 保证某阶段写完后再读取。

OPTIONAL · 迁移时查阅WebGPU 与 WebGL2 对照

主线实验完成后,再用完整映射处理跨平台或跨 API 迁移。

展开⌄
API COMPARISON

WebGL shader invocation 彼此隔离;WebGPU Workgroup 提供显式的局部协作层级。

WebGL

顶点/片元调用没有可移植的组内共享内存与 barrier,算法通常依赖多次 draw/pass。

WebGPU

workgroup_size、局部/全局 ID、var<workgroup> 与 barrier 共同定义协作。

Workgroup 不是 draw call 的批次;它是 shader 可观察并协作的执行/内存边界。