subgroupBroadcastFirst
subgroupBroadcastFirst
在计算着色器的硬件子组(Subgroup)内,将值 e 从“当前子组里 subgroup_invocation_id 最小的活动调用”广播到同一子组的所有活动调用。该封装要求两个参数 (e, id)。
核心优势
以单条子组指令完成线程间数据共享,无需共享内存与屏障,同步成本低,能显著简化并加速并行算法。
常见用途
把领头线程(最小ID)计算出的控制参数分发给全组线程以保持一致性
在归约/扫描/投票等并行阶段,将阶段性结果统一到所有线程
减少重复采样或内存读取:由一个调用读取/计算后广播给全组复用
如何调整
此为函数型节点。调整第一个参数 e(要共享的数据)即可改变广播内容;第二个参数 id 为源调用索引,占位为 int(0) 可满足“First”语义下的调用需求。整体效果取决于你在算法中的使用位置与数据流设计。
代码示例
1// 用子组首个活动调用的值来归一化每个线程的本地值
2const gid = globalId.x;
3const v = inputBuffer.element( gid );
4// 第二个参数按实现要求占位;在“First”语义下通常不影响源选择
5const leaderV = subgroupBroadcastFirst( v, int( 0 ) );
6const outV = v.div( leaderV.add( 1e-6 ) );
7outputBuffer.element( gid ).assign( outV );