subgroupExclusiveAdd
subgroupExclusiveAdd
在 GPU 子组内执行“排他前缀和/排他扫描”(Exclusive Prefix Sum / Exclusive Scan):返回当前调用之前(subgroup_invocation_id 更小的所有活跃调用)的 e 值累加结果。又称:子组排他扫描、排他前缀和;Exclusive Scan, Exclusive Prefix Sum, WavePrefixSum。
核心优势
无需显式循环或共享内存即可完成并行前缀和;可直接用作子组内的索引/偏移分配器,显著简化紧凑写入、分桶、排序等算法。
常见用途
获取子组内本地索引:当 e=1 时,结果等同于当前活跃调用的 0 基序号。
基于谓词的紧凑化/分配:令 e 为 0/1 掩码,结果即为满足条件线程在子组内的紧凑偏移。
构建累积分布/层级条纹等程序化可视化;为工作划分或临时缓冲写入计算不重叠区间。
如何调整
函数本身无额外参数;通过改变输入 e(如常量 1、布尔掩码 0/1 或任意权重)与活跃调用掩码来控制结果。注意:仅在后端/设备支持 Subgroup/Wave 操作时有效;在不支持的平台上可能回退或不可用。
代码示例
1/* 参数:e:number → 返回:number */
2// 1) 获得子组内本地索引(全部活跃)
3const laneIndex = subgroupExclusiveAdd( float(1) );
4
5// 2) 仅对满足条件的调用计数(紧凑偏移)
6const alive = step( 0.5, lifeFactor ); // 0 或 1
7const offset = subgroupExclusiveAdd( alive );
8
9// 3) 用作条纹可视化
10const stripe = mod( laneIndex, 2.0 ).equal( 0.0 );
11output.color = cond( stripe, color(0xffffff), color(0x222222) );