subgroupInclusiveMul
subgroupInclusiveMul
在硬件子组内,对输入 e 执行“包含式”前缀乘法(包含当前调用),返回从最低 invocation 到当前 invocation 的累计乘积。又称 inclusive prefix product。
核心优势
用单条子组指令完成前缀乘法,避免共享内存循环与屏障同步,延迟与同步开销更低。
常见用途
累计传输/衰减等连乘量(例如透明度、概率或增益)的子组内前缀扫描。
为基于乘法的分段处理或层级权重构建高效的前缀结果。
将布尔掩码转成 0/1 后做乘积扫描,用于快速检测“从起点到当前位置是否全为真”。
如何调整
该节点只有一个输入 e。通过改变 e 的取值与归一化方式影响结果与数值稳定性。若连乘易溢出,可用对数域技巧:exp( subgroupInclusiveAdd( log( e + 1e-8 ) ) )。实际前缀范围由硬件子组的活跃掩码与子组大小决定。
代码示例
1// 子组内“包含式”前缀乘法:把输入缓冲区做乘法扫描并写回
2const x = bufferIn.element( globalId.x ).tofloat(); // 同组线程各自读取输入
3const prefix = subgroupInclusiveMul( x ); // 前缀连乘(含当前)
4bufferOut.element( globalId.x ).assign( prefix ); // 写出结果
5
6// 注: globalId 为计算着色器内的全局线程坐标,文件中同分组已有定义