subgroupShuffleDown
subgroupShuffleDown
在当前子组(subgroup/wave/warp)内,从“当前调用 ID + delta”的另一个调用处读取其传入的值 v。该函数接收两个参数:(v, delta)。
核心优势
提供子组级(线程束内)的高速数据交换,无需共享内存或显式 barrier,适合归约、扫描、邻域通信等并行原语。
常见用途
子组级归约(求和/最大值/最小值)与前缀扫描
从相邻 lane 读取数据的滑动窗口/卷积/滤波
块内排序、分桶、直方图等并行算法构件
粒子/图像等邻域运算(取决于后端对子组的支持)
如何调整
第二个参数 delta 控制向下读取的偏移(laneId + delta)。当越过子组边界时,返回值为实现相关/未定义;实际使用时应结合子组大小做边界保护(例如仅当 laneId + delta < subgroupSize 时再使用结果)。该能力通常仅在支持 Subgroup 的后端(如 WGSL/WebGPU)可用。
代码示例
1// 例1:向下取相邻 lane 的值(delta=1)
2const rightNeighbor = subgroupShuffleDown( value, 1 );
3
4// 例2:对子组做对数步长的归约求和(示意)
5let sum = value;
6for ( let off = 16; off > 0; off >>= 1 ) {
7 sum = sum.add( subgroupShuffleDown( sum, off ) );
8}
9// 注意:具体 off 初值应按实际子组大小选择(如 32、64 等)
10