invocationSubgroupIndex
invocationSubgroupIndex
在计算着色器中,为当前线程提供其在硬件子组(Subgroup,通常为32或64个线程)内的唯一整数索引,用于实现极致的底层性能优化。
核心优势
核心价值是解锁 GPU 硬件级别的并行计算能力。它允许线程在子组内通过专用的高速指令(如洗牌 shuffle)直接交换数据,无需通过较慢的共享内存和同步屏障,从而实现并行算法的极致性能。
常见用途
在超高效并行归约中,作为高速数据交换器,使用子组指令快速求和。
在并行扫描(前缀和)算法中,作为协调者,实现高效的数据洗牌。
在直方图计算中,通过在子组内预聚合来减少原子操作的争用,优化性能。
如何调整
此节点是只读的内置变量,无法调整。其效果可通过可视化来理解:将索引值归一化为灰度颜色。如果一个工作组包含多个子组(例如,256个线程的工作组包含8个大小为32的子组),输出的纹理将在每个工作组区域内显示出多个重复的、更短的渐变图案,清晰地揭示了硬件子组的结构。
代码示例
1// 假设 subgroupSize 为 32,将 [0, 31] 范围的索引归一化
2const factor = invocationSubgroupIndex.tofloat().div( 31.0 );
3
4// 基于这个因子创建一个灰度颜色用于调试
5const debugColor = vec3( factor );