subgroupAdd
subgroupAdd
在同一子组(subgroup)内,对所有活跃调用提供的标量 e 求和,并把该和返回给每个调用。参数个数:1。
核心优势
使用 GPU 子组原语完成并行归约,比基于共享内存与多次同步的循环更少同步和访存,延迟更低。
常见用途
并行求和与归一化(例如用 subgroupAdd(1.0) 得到活跃调用数量)
图像或粒子统计:直方图、累加和、能量累积
基于瓦片或屏幕分区的聚合着色与后处理
如何调整
输入 e 决定被归约的量。令 e=1.0 可获取活跃调用数;令 e 为条件表达式可仅累计满足条件的元素。活跃集受分支影响。仅在后端支持子组时可用(如 WebGPU 或具备相关 GLSL/HLSL 子组扩展)。保持整数/浮点类型一致并关注精度与溢出。
代码示例
1// 在子组内对顶点局部 x 分量求和,并按活跃数量归一化映射到颜色
2const sum = subgroupAdd( positionLocal.x );
3const count = subgroupAdd( 1.0 ); // 活跃调用数(若全部活跃,则≈subgroupSize)
4const intensity = clamp( abs( sum ) / max( count, 1.0 ), 0.0, 1.0 );
5
6<Canvas>
7 <mesh>
8 <sphereGeometry args={[0.4, 128, 128]} />
9 {/* 使用子组归约的强度作为灰度颜色 */}
10 <meshStandardNodeMaterial colorNode={vec3( intensity )} roughness={0.6} metalness={0.0} />
11 </mesh>
12</Canvas>