subgroupShuffle
subgroupShuffle
在同一 GPU 子组(subgroup/warp/wave)内,从编号为 id 的调用(lane)读取该调用提供的值 v,并在当前调用返回该值。返回类型与 v 一致;id 为无符号整数(子组内调用索引)。适用于需要线程间(同子组)低延迟通信的场景。(同义/英文:subgroup shuffle / warp shuffle / broadcast from lane)
核心优势
无需共享内存与显式 barrier 的子组级通信,延迟低、吞吐高;由 TSL 封装为通用节点函数,并强约束 2 个参数,易于组合到节点图中。
常见用途
子组广播:将 0 号(或任意)lane 计算的阈值/随机种子分发到整个子组。
邻域交换:从指定 lane 取邻居值,用于有限差分、平滑或排序阶段的“洗牌”。
并行算法:作为前缀和/规约/位onic 排序等子组算法中的数据搬运原语。
如何调整
v 可为标量或向量数值类型;id 为无符号整数,建议保证在 [0, 子组大小-1] 内。若 id 指向非活动调用,结果未定义。常见调整为选择不同的广播源 id(如 0u、某个 leaderId),或在循环中改变 id 实现分阶段交换。需要运行于支持 subgroup 的后端(如 WebGPU 设备与驱动支持);在不支持的后端不可用。
代码示例
1// 将子组 leader(id=0)计算的阈值广播给所有调用
2const localVal = dot( normalView, vec3( 0, 0, 1 ) );
3const thresholdFromLeader = subgroupShuffle( localVal, 0u );
4
5// 所有 lane 使用相同阈值做二值化/遮罩
6const mask = step( thresholdFromLeader, localVal );
7material.emissiveNode = vec3( mask );