subgroupMul
subgroupMul
一个子组级(subgroup)的归约函数:对同一 GPU 子组内当前激活的所有调用的输入值做乘法累积,并将乘积结果广播给该子组的每个调用。
核心优势
利用硬件级子组原语在同一波/warp 内完成乘法归约,无需显式循环、共享内存或屏障;可用 0/1 掩码快速实现 all()-风格判断,或组合多次采样的乘性量(如透过率)。
常见用途
子组 all 判定:对子组内的 0/1 掩码做乘法归约,结果为 1 表示全部通过、为 0 表示至少有一个未通过。
将多样本的乘性量(如透过率/概率/权重)在子组内合并。
作为更大范围归约之前的子组级预归约,加速计算。
在计算着色器中实现分块算法的乘积累积。
如何调整
调用时传入 1 个数值(建议为 float,且在 [0,1] 时语义最清晰)。置于分支中时仅对“当前激活”的调用生效;若缺参会被 0 补齐导致乘积为 0。子组特性依赖后台/平台支持;如目标平台不支持,需考虑降级路径。
代码示例
1// 子组 all 判定(任一失败则乘积为 0)
2const mask = step( 0.5, quality ); // 0 或 1
3const allPass = subgroupMul( mask );
4allPass.equal( 0 ).discard();
5
6// 合并子组内的透过率(0-1)
7const t = saturate( transmittance );
8const T = subgroupMul( t ); // 子组总透过率,广播给该子组所有激活线程
9